将点坐标从 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 /
我需要在通用 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 /