给定相对于球的X、Y和Z向量,如何找到球的自旋?

3
我正在使用Electro和Lua进行一些3D模拟,并且遇到了一些数学/算法/物理方面的困难。
我试图弄清楚如何找到一个绕某个轴旋转的球体的“自旋”。通过“自旋”,我的意思是沿着球体旋转轴的矢量,其大小相对于旋转速度。我需要这些信息是为了能够通过对球体施加反向扭矩来减缓球体的旋转直到停止。
我唯一可以获得的信息是相对于球体的X、Y和Z单位矢量。也就是说,每帧我都可以调用三个不同的函数,分别返回指向球体模型本地X、Y和Z轴方向的单位矢量。我可以通过保留每个矢量的“先前”值并将其与“新”值进行比较,来跟踪每个矢量如何变化。那么问题是,我如何利用这些信息确定球体的自旋?我感到困惑。
任何帮助都将是非常好的。谢谢!

这只是我自己的想法,或者说它能够同时在多个轴上旋转吗?也就是说,“旋转向量”可能并不那么简单? - jtbandes
1
一个旋转向量就足够了。即使它似乎围绕多个轴旋转,这些轴的合成将是唯一的旋转向量。相反,一个单独的旋转向量可以被分解成沿着独立轴的旋转分量。 - sykora
“旋转”将会合并。尝试抓住离你最近的球形物体,沿着它的X轴(即水平轴)旋转它。然后沿着它的z轴(即直接远离你的轴)旋转它。然后尽力同时进行两个动作。现在你会注意到,它正在沿着x轴和z轴之间45度的轴线旋转。 - Ben Torell
我也有这个怀疑,但是我太累了,自己想不出来。:) - jtbandes
如果您不介意的话,能给我提供一下这个“Electro”的链接吗?我很感兴趣... :) - RCIX
@RCIX 这是链接:http://www.evl.uic.edu/rlk/electro/ 实际上这是一个非常糟糕的3D引擎。我只是为了课程而使用它,它很糟糕,甚至令人痛苦。文档不全面,ODE集成不完善,没有人使用它,缺少很多功能,速度慢(使用解释性语言,而不是编译),并且已经停止开发两年了。自己做个好事,选择一个更广泛使用的3D引擎吧。 - Ben Torell
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 = 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))

你救了我不用打一个非常复杂的答案。+1。 - sykora
1
实际上,我认为这不正确;只有当所选向量恰好位于旋转的“赤道”上时才成立。请注意,所提议的旋转向量w始终垂直于所选向量r,即使r可以是任何东西! - comingstorm
确认,你是正确的。感谢你指出来,comingstorm。能否写出正确的解决方案? - unutbu
这很不错 - 我没有发布正确的解决方案,因为我还没有想出来!我唯一要补充的是,你想评估的旋转矩阵是两个连续帧之间的“差异”:如果轴矩阵是M1和M2,则你有A = M2 *(M1 ^ -1)。 (请注意,很容易倒转旋转矩阵,只需取转置即可!) - comingstorm
你在使用欧拉角时必须小心。四元数是一种更为强大的表示一般刚体方向和旋转的方法。其数值稳定性要好得多。维基链接供您参考:http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation - Rupert Nash
显示剩余3条评论

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 = theta/dt
为了精确起见,您应该选择变化最大的单位向量(X、Y或Z)。

请纠正我,但我认为这个解决方案可能会遇到与unutbu之前的解决方案相同的问题,即假设X(或选择的任何轴)在单位球体的赤道上。这意味着旋转轴将被计算为垂直于所选轴,这不一定是真实情况。通过选择改变最多的轴(即最靠近赤道的轴),问题可能会得到部分缓解,但这不是一个精确的解决方案。 - Ben Torell
现在我再想想,你说的可能是对的。早上7:30对我来说从来不是一个好时间去SO。 :-/ - Ben Torell
计算出的旋转轴不一定垂直于X,而是垂直于X的变化,这是正确的。如果你不能等待两个时间间隔,你可以在一个时间间隔内完成,利用它必须垂直于X和Y的变化的事实...想起来了,这是一个相当好的方法。 - Beta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接