我需要在通用2D平面(用SlimDX.Plane定义,带有3个Vector3)中投影SlimDX.Vector3(X,Y和Z组件)。请注意,该平面是通用的,它不是屏幕平面(否则,可以使用Vector3.Project)。 我需要确定从3D空间到2D平面的转换矩阵(或四元数),但我不知道如何。 飞机的起源可以是任何东西,例如,用于定义平面的第一个点。
任何人都可以提供帮助吗?
答案 0 :(得分:0)
我认为你想要的是点与平面的分离(沿着法线)
float h = Plane.DotNormal(plane, point);
然后从点
沿平面法线减去此数量Vector3 proj = point - h*plane.Normal;
结果点应位于飞机上。
答案 1 :(得分:0)
你的问题仍然很不清楚。但是,我在黑暗中尝试射击。
让我们首先计算平面的模型变换(将位于x / y平面的平面变换到其实际位置)。您正在寻找的变换是此矩阵的反转。
我们可以通过查找主体的图像来构造矩阵。起源很简单。如您所指定,原点应映射到第一个点(v1
)。 z轴也很容易。这是飞机的正常现象。因此,矩阵是:
/ . . . . \
M = | . . . . |
| p.Normal.X p.Normal.Y p.Normal.Z 0 |
\ v1.X v1.Y v1.Z 1 /
现在出现了您的描述缺乏信息的部分。我们需要在平面上使用局部x轴。我假设这个轴是由第二个向量定义的:
Vector3 x = Vector3.Normalize(v2 - v1);
然后,得到的局部y轴是:
Vector3 y = Vector3.Normalize(Vector3.Cross(p.Normal, x));
和
/ x.X x.Y x.Z 0 \
M = | y.X y.Y y.Z 0 |
| p.Normal.X p.Normal.Y p.Normal.Z 0 |
\ v1.X v1.Y v1.Z 1 /
如前所述,你需要这个矩阵'逆。因此:
/ x.X y.X p.Normal.X 0 \
M^-1 = | x.Y y.Y p.Normal.Y 0 |
| x.Z y.Z p.Normal.Z 0 |
\ -v1.X -v1.Y -v1.Z 1 /
更紧凑,因为您不需要第三和第四维度(尽管这可能不是SDX最方便的表示):
/ x.X y.X \
T = | x.Y y.Y |
| x.Z y.Z |
\ -v1.X -v1.Y /