在3d中检测对象旋转

时间:2011-03-02 21:27:18

标签: 3d rotation

我有一个参考模型,(例如一个三角形),其“向上”向量定义为< 0 1 0>并且其'over'向量定义为< 1 0 0>。

现在我有另一个相同大小的三角形在3d空间中任意旋转和定位。我想要做的是找出这个新三角形的“向上”和“向上”向量。即如果三角形围绕X轴旋转180度,则它的'向上'向量应该<0 -1 0&gt;它的'over'矢量应该是相同的。

如何找到旋转变换?如果我有这个,我可以通过反向'旋转''向上'向量来获得新的'向上'向量然后我就完成了。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

要做到这一点,你需要垂直于构成三角形的向量的向量。您可以使用交叉产品计算它:

  

http://en.wikipedia.org/wiki/Cross_product

因此,给定由点A,B,C组成的三角形,您可以计算出2个向量B-A和C-A的叉积。然后,您可以通过旋转垂直向量来旋转三角形以适合参考三角形。

这是你搜索的内容吗?如果没有,请评论,我会考虑更多。

答案 1 :(得分:0)

必须在另一个答案中回答您的评论,因为我想添加图片。

如果你的模型有超过4个点但是刚体那么就可以取任意3个不相同的点来得到垂直向量(然后取3个对应点)你想要将它旋转到的对象)。您可以通过计算它们之间的角度将一个垂直向量旋转到另一个,这必须分别针对3轴进行。我将演示它是如何计算绕z轴旋转的角度。因此,在下图中,粗体红色和蓝色箭头是原始的三维矢量。

Graphic 1

你只需将它们的z值设置为0,就可以在xy平面上投影。你可以使用它们的点积,范数和反余弦来计算它们之间的角度,如下面的公式所示来自http://en.wikipedia.org/wiki/Dot_product。 θ现在是您必须围绕z轴旋转的角度。对x轴和y轴做同样的事情,你有旋转角度。

Graphic 2

答案 2 :(得分:0)

大家好。谢谢你的帮助,但我设法弄明白了。

以下是步骤。

  1. 将两个对象置于原点

  2. 将一个矢量旋转到另一个矢量上,例如(a0) - &gt; (B0)。现在你必须互相重叠。 a0 / b0,虽然是点,但是从原点形成矢量

  3. 找到每个向量的法线,这可以通过在每个坐标空间中使用附加点并查找交叉积来完成。例如:

    an = a0 x a1 bn = b0 x b1

  4. 现在只需将一个旋转到bn即可完成。

  5. 进行旋转的最简单方法是添加一个'rotateTo'成员函数,该函数返回四元数(避免万向节锁定)。然后,您可以将两个四元数相乘,以获得最终的旋转变换。