给定相对于球体的X,Y和Z向量的球体旋转

时间:2009-11-14 04:34:15

标签: algorithm math 3d lua physics

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

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

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

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

2 个答案:

答案 0 :(得分: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 = X所以A将i旋转到X.同样,它将y轴旋转为Y和 z轴进入Z.

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

所以使用DCM to Euler axis formula

计算

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))

答案 1 :(得分:0)

我赞赏~unutbu's,回答,但我认为有一种更简单的方法可以满足这个问题。

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

deltaX1 = X2 - X1
deltaX2 = X3 - X2

(这些是矢量方程.X1是矢量,X矢量在时间1,而不是数字。)

现在取出增量的交叉积,你将得到一个向量旋转方向的矢量。

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

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

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