代码之家  ›  专栏  ›  技术社区  ›  Ben Torell

在给定的x、y和z矢量下求一个球相对于球的自旋

  •  3
  • Ben Torell  · 技术社区  · 16 年前

    我正在使用Electro-In-Lua进行一些3D模拟,我正在遇到一些数学/算法/物理方面的障碍。

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

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

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

    2 回复  |  直到 16 年前
        1
  •  8
  •   unutbu    16 年前

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

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

    θ是欧拉旋转角。

    角速度的大小,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))
    
        2
  •  0
  •   Beta    16 年前

    我为“乌特布”的回答喝彩,但我认为有一种更简单的方法可以解决这个问题。

    取三个连续帧处的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)。