在3D空间中定向旋转矢量以面向目标

时间:2014-03-20 01:54:52

标签: vb.net xna rotation

我在三维空间中有两个位置向量:

Dim Position As Vector3
Dim Destination As Vector3

我还有一个旋转矢量,用于旋转对象。它包含Yaw,Pitch和Roll值(=>范围从0到PI * 2)

我现在希望此旋转矢量指向正确的方向,以便末尾的对象指向目标矢量,位于位置矢量。

我不知道怎么做到这一点。

1 个答案:

答案 0 :(得分:0)

我做了3D东西已经有一段时间了,因此这只是一个概念性的答案。

您可以构造三个正交单位向量,并将它们组合为矩阵中的行。那个矩阵将是你的转变。你知道一个载体......

forward = to_point - from_point

现在您需要一个“向上”和“向右”向量,可以使用跨产品计算,前提是您有某种世界参考向量(否则您的解决方案空间是无限的)。例如,应该定义“向上”向量。

这确实意味着如果你的“向前”向量与你的“向上”向量过于平行,你的解决方案可能会受到万向节锁定的影响。在这种情况下,交叉产品会出现非常小(或零),一切都会破裂。那只是因为你试图解决一个具有两个自由度的系统,并使用一个假设来填补其中一个。

总之...

right = forward cross up

然后你可以修复向上矢量:

up = right cross forward

上述跨产品操作的顺序假设是右手系统。如果你的世界是左撇子,那么就颠倒两个被交叉的向量的排序。

所以,现在你有三个正交向量来表示你的对象的变换。将这些打成矩阵。行(或列,取决于应用矩阵的等式的哪一侧)将取决于您如何定义坐标系。我以前X是正确的,Y是向前的,Z是向上的。

现在您拥有对象的“中性”旋转矩阵,您可以使用标准矩阵变换对其应用普通的俯仰,滚转和偏航旋转。实际上,您可以通过将俯仰,滚动和偏航应用于单位矩阵来构造“局部”旋转矩阵,然后将其与您之前构造的矩阵相乘。