Algorithm 求给定X、Y和Z矢量的球体相对于球体的自旋

Algorithm 求给定X、Y和Z矢量的球体相对于球体的自旋,algorithm,math,3d,lua,physics,Algorithm,Math,3d,Lua,Physics,我在Lua中使用Electro进行一些3D模拟,我遇到了一些数学/算法/物理障碍 我想弄清楚如何找到一个球体的“旋转”,一个球体在某个轴上旋转。所谓“旋转”,我指的是沿着球体旋转轴的向量,其大小与旋转速度有关。我需要这些信息的原因是能够通过对球体施加反向扭矩来减缓球体的旋转,直到球体停止旋转 我能得到的唯一信息是相对于球体的X、Y和Z单位向量。也就是说,每一帧,我可以调用三个不同的函数,每个函数分别返回指向球体模型局部X、Y和Z轴方向的单位向量。我可以通过基本上保持每个向量的“先前”值并将其与每

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

我想弄清楚如何找到一个球体的“旋转”,一个球体在某个轴上旋转。所谓“旋转”,我指的是沿着球体旋转轴的向量,其大小与旋转速度有关。我需要这些信息的原因是能够通过对球体施加反向扭矩来减缓球体的旋转,直到球体停止旋转

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


任何帮助都会很好。谢谢

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

单位向量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)

所以使用

计算

theta = arccos((A_11 + A_22 + A_33 - 1)/2)
θ是欧拉旋转角

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

w = d(theta)/dt ~= (theta(t+dt)-theta(t)) / dt
旋转轴由e=(e1,e2,e3)给出,其中


我赞同联合国大学的答案,但我认为有一种更简单的方法可以解决这个问题

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

deltaX1 = X2 - X1 deltaX2 = X3 - X2 deltaX1=X2-X1 deltaX2=X3-X2 (这些是向量方程。X1是一个向量,时间1的X向量,而不是一个数字。)

现在取三角形的叉积,得到一个旋转向量方向的向量

现在来看震级。两个三角形之间的角度是在一个时间间隔内扫出的角度,因此使用点积:

dx1 = deltaX1/|deltaX1| dx2 = deltax2/|deltaX2| costheta = dx1.dx2 theta = acos(costheta) w = theta/dt dx1=deltaX1/| deltaX1| dx2=deltax2/| deltax2| costheta=dx1.dx2 θ=acos(costheta) w=θ/dt
为了精确起见,您应该选择变化最大的单位向量(X、Y或Z)。

它是我自己的,还是可以同时在多个轴上旋转?也就是说,一个“自旋向量”可能不是那么简单,一个自旋向量就足够了。即使它似乎是围绕多个轴旋转,这些轴的结果将是旋转矢量。相反,单个自旋矢量可以分解为沿独立轴的自旋分量,“自旋”将组合在一起。尝试抓取离您最近的球形对象,并沿其X轴(即水平轴)旋转它。然后沿z轴旋转它(即,直接远离您的轴)。然后尽你所能同时做这两件事。你会注意到,它是沿着x轴和z轴之间的45度轴旋转的。我也这么怀疑,但我太累了,我自己想不出来<代码>:)如果你不介意的话,你能提供这个“电子”的链接吗?我对它感兴趣……:)你救了我,使我免于打印出一个极其复杂的答案+1.事实上,我认为这是不对的;只有当选择的矢量七分之一在旋转的“赤道”上时才是真的。请注意,建议的旋转向量w始终垂直于所选向量r,即使r可以是任何东西!阿克。你说得对。谢谢你指出这一点,comingstorm。想写出正确的答案吗?我完全改变了答案。我认为现在它是正确的,尽管我欢迎bug报告。这很好——我没有发布正确的解决方案,因为我还没有找到一个!我要补充的唯一一点是,要计算的旋转矩阵是两个连续帧之间的“差”:如果轴矩阵是M1和M2,则A=M2*(M1^-1)。(请注意,反转旋转矩阵非常容易,只需进行转置!)如果我错了,请纠正我的错误,但我认为此解决方案可能会遇到与~unutbu以前的解决方案相同的问题,即假设X(或选择的任何轴)位于单位球体的赤道上。这意味着旋转轴将被计算为垂直于所选轴,这可能不一定是这样。选择变化最大的轴(即离赤道最近的轴)可以部分缓解这个问题,但这不是一个精确的解决方案。现在我仔细考虑一下,你可能是对的。早上7:30对我来说从来都不是上台的好时间,所以:-/计算出的旋转轴不一定垂直于X,而是垂直于X的变化,这是正确的。如果你不能等待两个时间间隔,你可以在一个时间间隔内完成,利用它必须垂直于X和Y的变化这一事实。。。想想看,这是一个很好的方法。 dx1 = deltaX1/|deltaX1| dx2 = deltax2/|deltaX2| costheta = dx1.dx2 theta = acos(costheta) w = theta/dt