在SLimDX中将点空间从3D空间转换为通用2D平面

时间:2015-08-28 19:11:34

标签: .net 3d transformation slimdx plane

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

任何人都可以提供帮助吗?

2 个答案:

答案 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 /