我对此进行了搜索,但没有找到与我之后完全匹配的问题。我希望用户能够定义纹理平面。我的参数是:
所以,我希望能够在给定上述信息的情况下计算矩形的4个顶点。所以,如果我想要一架面朝上的飞机,宽度和高度为1000:
因此,这将在X& Z轴,朝上。我不明白的是如何根据这些信息计算3D空间中的4个角。我是否需要额外的信息,或者是否有更好的方法来任意指定一架飞机?
编辑:当前代码
在以下代码中:
正常= 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)
};
答案 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轴上“平坦化”。