我需要在通用2D平面(使用SlimDX.Plane和3 Vector3定义)中投影SlimDX.Vector3(X,Y和Z组件)。请注意,飞机是通用的,它不是屏幕平面(否则,可以使用Vector3.Project)。 我需要确定从3D空间到2D平面的转换矩阵(或四元数),但我不知道如何。 飞机的起源可以是任何东西,例如第一个用于定义飞机的点。将点坐标从3D空间转换为SlimDX中的通用2D平面
任何人都可以帮忙吗?
我需要在通用2D平面(使用SlimDX.Plane和3 Vector3定义)中投影SlimDX.Vector3(X,Y和Z组件)。请注意,飞机是通用的,它不是屏幕平面(否则,可以使用Vector3.Project)。 我需要确定从3D空间到2D平面的转换矩阵(或四元数),但我不知道如何。 飞机的起源可以是任何东西,例如第一个用于定义飞机的点。将点坐标从3D空间转换为SlimDX中的通用2D平面
任何人都可以帮忙吗?
我想你想要的是一个与
float h = Plane.DotNormal(plane, point);
给出然后从点减去沿平面法线这一数额的点到平面的分离(沿着正常)
Vector3 proj = point - h*plane.Normal;
由此产生的观点应该在飞机上。
我已经知道这一点在于那架飞机。无论如何,执行你所建议的操作,我得到的坐标和以前一样(我尝试了一个由3D空间中的3个节点定义的平面)。 – johnnyontheweb
那么你还没有很好地解释你正在尝试做什么。我以为你想在飞机上投射一个3D点(这就是我所回答的)。 – ja72
你的问题仍然很不清楚。不过,我正在黑暗中尝试一下。
我们首先计算平面的模型变换(它将位于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/
请说明什么是M和T ......我可以使用Vector3.Transform吗? – johnnyontheweb
他们是矩阵。你应该使用'M^-1'(将它打包在一个矩阵中并转换矢量)。 –
而* *如何你想项目?从3D空间到2D平面有无数次的变换。 –
为了更清楚,我需要本地平面中的节点坐标,即2D坐标。我需要在这个表面上建立一个网格,然后再次获得三维坐标(取反相变)。 – johnnyontheweb
现在还不清楚。 2D坐标系是如何表征的? –