计算矩形GIven Origin,Direction&的左上角和右下角。尺寸

时间:2011-10-20 15:43:46

标签: c# xna 3d vector-graphics

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

  • 尺寸(A Vector2)
  • 方向(A Vector3)
  • Origin(A Vector3)

所以,我希望能够在给定上述信息的情况下计算矩形的4个顶点。所以,如果我想要一架面朝上的飞机,宽度和高度为1000:

  • 尺寸=(1000,1000)
  • 方向= 0,1,0(向上)
  • Origin = 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)
            };
    

2 个答案:

答案 0 :(得分:1)

这可以作为平面的定义:你有一个点和法线向量。您需要在平面上获得两个向量(A& B)并将一个(A *其中一个大小值)添加到原点以获得第二个角。添加第二个向量(B *另一个大小值)以获得第三个角,并将两个向量*相应的大小值添加到原点以获得第四个角。

要获得第一个向量,请计算法向量(方向)与任意向量(不等于方向)的叉积。这将为您提供向量A.要获得向量B,请计算A和方向的叉积。

答案 1 :(得分:1)

您的飞机尚未完全定义。你需要另一个沿着平面的矢量,即所谓的“切线”矢量。在上面的例子中,纹理的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,我们得到2个向量,它们在X和Y方向上从平面的中心到边缘。通过以不同的方式将这两者结合在一起,我们得到了四个角落。

这是一张图表,您可以在脑海中获得更好的图片。切线矢量 T 在X轴上“平坦化”。 Diagram