3

我在 Lua 中使用 Electro 进行一些 3D 模拟,并且遇到了数学/算法/物理障碍。

我试图弄清楚如何找到在某个轴上旋转的球体的“旋转”。“旋转”是指沿着球体旋转的轴的矢量,其大小相对于它的旋转速度。我需要这些信息的原因是能够通过对球体施加反向扭矩来减慢球体的旋转,直到它停止旋转。

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

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

4

2 回答 2

8

我的第一个答案是错误的。这是我编辑的答案。

您的单位向量 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 = XA 将 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-14T04:46:32.653 回答
0

我为〜unutbu的回答鼓掌,但我认为有一种更简单的方法可以解决这个问题。

取三个连续帧的 X 单位向量,比较它们得到两个增量:

deltaX1 = X2 - X1
deltaX2 = X3 - X2

(这些是向量方程。X1 是向量,即时间 1 处的 X 向量,而不是数字。)

现在取增量的叉积,你会得到一个在旋转向量方向上的向量。

现在来说量级。两个增量之间的夹角是在一个时间间隔内扫出的角度,所以使用点积:

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

为了精确起见,您应该选择变化最大的单位向量(X、Y 或 Z)。

于 2009-11-15T20:15:22.637 回答