Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算给定原点、方向和距离的矩形的左上角和右下角;大小_C#_Xna_3d_Vector Graphics - Fatal编程技术网

C# 计算给定原点、方向和距离的矩形的左上角和右下角;大小

C# 计算给定原点、方向和距离的矩形的左上角和右下角;大小,c#,xna,3d,vector-graphics,C#,Xna,3d,Vector Graphics,我对此进行了搜索,但没有找到一个与我的目标完全匹配的问题。我希望用户能够定义纹理平面。我掌握的参数有: 大小(矢量2) 方向(矢量3) 原点(矢量3) 因此,我希望能够计算出矩形的4个顶点,给出上述信息。因此,如果我想要一个面朝上的平面,宽度和高度为1000: 大小=(10001000) 方向=0,1,0(向上) 原点=0,0,0 这将在X&Z轴上定义一个面向上的平面。我不明白的是,在给定这些信息的情况下,如何计算3D空间中的4个角。我需要额外的信息,还是有更好的方法来任意指定平面 编辑

我对此进行了搜索,但没有找到一个与我的目标完全匹配的问题。我希望用户能够定义纹理平面。我掌握的参数有:

  • 大小(矢量2)
  • 方向(矢量3)
  • 原点(矢量3)
因此,我希望能够计算出矩形的4个顶点,给出上述信息。因此,如果我想要一个面朝上的平面,宽度和高度为1000:

  • 大小=(10001000)
  • 方向=0,1,0(向上)
  • 原点=0,0,0
这将在X&Z轴上定义一个面向上的平面。我不明白的是,在给定这些信息的情况下,如何计算3D空间中的4个角。我需要额外的信息,还是有更好的方法来任意指定平面

编辑:当前代码

在以下代码中:

  • 尺寸=10000,10000
  • 中心=0,0,0
  • 正常值=0,1,0

            Vector3 arb = new Vector3(1, 1, 1);
            Vector3 planeY = Vector3.Normalize(Vector3.Cross(Normal, arb));
            Vector3 planeX = Vector3.Normalize(Vector3.Cross(Normal, planeY));
    
            planeX *= Size.X / 2;
            planeY *= Size.Y / 2;
    
            Vector3[] ret =  new Vector3[4] 
            {
                (Center - planeX - planeY),
                (Center - planeX + planeY),
                (Center + planeX - planeY),
                (Center + planeX + planeY)
            };
    

    • 这是平面的定义:有一个点和法向量。您需要在平面上获得两个向量(A和B),并向原点添加一个(A*一个大小值)以获得第二个角点。添加第二个向量(B*其他大小值)以获得第三个角点,并将两个向量*其对应的大小值添加到原点以获得第四个角点


      要获得第一个向量,请计算法向量(方向)与任意向量(不等于方向)的叉积。这将给出向量A。要得到向量B,请计算A与方向的叉积。

      您的平面尚未完全定义。你需要另一个沿着平面的向量,所谓的“切线”向量。在上面的示例中,纹理的Y轴应该指向哪里?沿着X轴,沿着Z轴?或者可能是一个完全不同的用户定义轴?切线向量是一个向量,它应该指向平面的X轴应该到达的一般方向

      假设我们还有一个切向量,它不一定要指向平面。可以按如下方式构造平面:

              Vector3[] vertices(Vector2 size, Vector3 center, Vector3 normal, Vector3 tangent)
          {
              Vector3 planeY = Vector3.Normalize(Vector3.Cross(normal, tangent));
              Vector3 planeX = Vector3.Normalize(Vector3.Cross(normal, planeY));
      
              planeX *= size.X / 2;
              planeY *= size.Y / 2;
      
              vertices = new Vector3[]
              {
                  (center - planeX - planeY),
                  (center - planeX + planeY),
                  (center + planeX - planeY),
                  (center + planeX + planeY),
              };
              return vertices;
          }
      
      planeX和planeY是沿平面本身的X轴和Y轴指向的归一化向量。通过将它们乘以size/2,我们得到了两个向量,它们在X和Y方向上从平面的中心到边缘。通过以不同的方式将这两者相加,我们得到了四个角

      这是一张图表,这样你可以在脑海中得到更好的画面。切线向量T被“展平”到X轴上。

      谢谢您的帮助。我不完全清楚你所说的“任意向量(不等于方向)”是什么意思。我正试图想象这会是什么样子,但并没有走多远。感谢您的及时回复。好的,方向是一个3D向量,所以创建一个新的向量,其中任意3个值不等于方向向量的值。此项的叉积将为您提供一个与方向正交的标准化向量。您可以将这个新向量乘以其中一个大小属性来获得第二个角点。嗨,Hannash,谢谢您的评论和示例代码。假设在你的例子中,
      tangent
      是上向量,我重建了你传递的
      Vector3.UP
      而不是tangent,但是planeY的值都是
      NaN
      ,所以不确定这里发生了什么。可能的原因是我的法线是
      0,1,0
      ,因为我希望这个特定的平面朝上。所以它被称为“Vector3.Cross”(“0,1,0”,“0,1,0”)。我确信这是错误的。这正是原因:),为up选择任何其他值,它就会正常工作。你不能定义一个平面,它的X轴方向和它面对的方向是一样的。我计算过了,所以我提供了一个(1,1,1)的上方向向量。假设原点为
      0,0,0
      ,法线为
      0,1,0
      ,大小为
      10000,10000
      ,我会得到一些非常奇怪的结果。[0]=
      {X:0.0002441406 Y:0 Z:7071.068}
      。[1] =
      {X:7071.068 Y:0 Z:0.0002441406}
      ,[2]=
      {X:-7071.068 Y:0 Z:-0.0002441406}
      和[3]=
      {X:-0.0002441406 Y:0 Z:-7071.068}
      。试图找出问题所在。我真的很感谢你在这方面的帮助。我刚刚用我现有的代码更新了我的帖子。说到数学和我,轮子在转动,但仓鼠死了。这看起来是对的。你在期待什么?该平面位于X&Z轴上(X&Z分量为~0)。可以沿对角线切线,因此平面旋转45度。尝试Vector3。左为“法线”平面。