给出 X、Y 和 Z 向量相对于球体的情况,找出球体的自旋。

我正在使用使用带有 Lua 的 Electro 进行一些 3D 模拟,但我遇到了一个数学/算法/物理方面的难点。

我试图找出如何寻找一个绕轴旋转的球的“旋转”。所谓“旋转”,是指沿着球正在旋转的轴的向量,其大小与其旋转速度成比例。我需要这些信息是为了能够通过对球施加反向扭矩来减缓球的旋转,直到它停止旋转。

我唯一可以访问的信息是相对于球的 X、Y 和 Z 单位向量。也就是说,每个帧,我可以调用三个不同的函数,每个函数返回一个指向球模型的本地 X、Y 和 Z 轴方向的单位向量。我可以通过基本上保持每个向量的“先前”值并将其与“新”值进行比较来跟踪每个向量的变化方式。那么问题是,我如何使用这些信息来确定球的旋转?我被难住了。

任何帮助都会很好。谢谢!

原文链接 https://stackoverflow.com/questions/1733284

点赞
stackoverflow用户190597
stackoverflow用户190597

我的第一个答案是错的。这是我修改后的答案。

您的单位向量 X、Y 和 Z 可以放在一起组成一个 3x3 的矩阵:

A = [[x1 y1 z1],
     [x2 y2 z2],
     [x3 y3 z3]]

由于 X、Y 和 Z 随时间而变化,A 也随时间变化。

A 是一个旋转矩阵!毕竟,如果让 i=(1,0,0) 成为沿 x 轴的单位向量,那么 A i = X,因此 A 将 i 旋转到 X。同样地,它将 y 轴旋转到 Y,将 z 轴旋转到 Z。

A 被称为“方向余弦矩阵”(DCM)。

因此,使用 DCM 到欧拉轴公式

计算

theta = arccos((A_11 + A_22 + A_33 - 1)/2)

theta 是旋转的欧拉角。

角速度的大小,|w|,等于

w = d(theta)/dt ~= (theta(t+dt)-theta(t)) / dt

旋转轴由 e=(e1,e2,e3) 给出,其中

e1 = (A_32 - A_23)/(2 sin(theta))
e2 = (A_13 - A_31)/(2 sin(theta))
e3 = (A_21 - A_12)/(2 sin(theta))
2009-11-14 04:46:32
stackoverflow用户128940
stackoverflow用户128940

我赞成unutbu的回答,但我认为有一个更简单的方法足以解决这个问题。

在三个连续帧中,取X轴的单位向量,并将它们进行比较,得到两个增量:

deltaX1 = X2 - X1
deltaX2 = X3 - X2

(这些是矢量方程。X1是一个向量,即时间1时的X轴向量,不是数字。)

现在,取这两个增量的叉积,你将得到一个指向旋转向量方向的向量。

现在计算大小。两个增量之间的角度是一个时间间隔内扫过的角度,因此使用点积:

dx1 = deltaX1/|deltaX1|
dx2 = deltax2/|deltaX2|
costheta = dx1.dx2
theta = acos(costheta)
w = theta/dt

出于精度考虑,你应该选择变化最大的单位向量(X、Y或Z)。

2009-11-15 20:15:22