2015-08-28 94 views
0

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

任何人都可以帮忙吗?

+0

而* *如何你想项目?从3D空间到2D平面有无数次的变换。 –

+0

为了更清楚,我需要本地平面中的节点坐标,即2D坐标。我需要在这个表面上建立一个网格,然后再次获得三维坐标(取反相变)。 – johnnyontheweb

+0

现在还不清楚。 2D坐标系是如何表征的? –

回答

0

我想你想要的是一个与

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

给出然后从点减去沿平面法线这一数额的点到平面的分离(沿着正常)

Vector3 proj = point - h*plane.Normal; 

由此产生的观点应该在飞机上。

+0

我已经知道这一点在于那架飞机。无论如何,执行你所建议的操作,我得到的坐标和以前一样(我尝试了一个由3D空间中的3个节点定义的平面)。 – johnnyontheweb

+0

那么你还没有很好地解释你正在尝试做什么。我以为你想在飞机上投射一个3D点(这就是我所回答的)。 – ja72

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/
+0

请说明什么是M和T ......我可以使用Vector3.Transform吗? – johnnyontheweb

+0

他们是矩阵。你应该使用'M^-1'(将它打包在一个矩阵中并转换矢量)。 –