将点坐标从 3D space 转换为 SlimDX 中的通用 2D 平面

Transform point coordinates from 3D space to a generic 2D plane in SlimDX

我需要在通用 2D 平面(用 SlimDX.Plane 定义,有 3 个 Vector3)中投影 SlimDX.Vector3(X、Y 和 Z 分量)。请注意,该平面是通用的,而不是屏幕平面(否则,可以使用 Vector3.Project)。 我需要确定从 3D space 到 2D 平面的转换矩阵(或四元数),但我不知道如何确定。 飞机的原点可以是任何东西,例如用于定义平面的第一个点。

有人可以帮忙吗?

我想你想要的是点到平面的分离(沿着法线),它由

给出
float h = Plane.DotNormal(plane, point);

然后从点

沿平面法线减去这个量
Vector3 proj = point - h*plane.Normal;

结果点应该在平面上。

你的问题还是很不清楚。但是,我正在尝试在黑暗中拍摄。

让我们从计算平面的模型变换开始(它将位于 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 /