math - YZX 旋转矩阵的欧拉角问题

标签 math 3d rotation euler-angles

我无法从旋转矩阵中获取欧拉角。

我的约定是:

  • 左撇子(x 向右,z 向后,y 向上)
  • YZX
  • 左手角旋转

我的旋转矩阵是从欧拉角建立起来的(来 self 的代码):

    var xRotationMatrix = $M([
        [1,  0,   0, 0], 
        [0, cx, -sx, 0], 
        [0, sx,  cx, 0], 
        [0,  0,   0, 1]
    ]);

    var yRotationMatrix = $M([
        [ cy, 0, sy, 0], 
        [  0, 1,  0, 0], 
        [-sy, 0, cy, 0], 
        [  0, 0,  0, 1]
    ]);
    var zRotationMatrix = $M([
        [cz, -sz, 0, 0], 
        [sz,  cz, 0, 0], 
        [ 0,   0, 1, 0], 
        [ 0,   0, 0, 1]
    ]);

最终的旋转矩阵为:

R(YZX) = | cy.cz, -cy.sz.cx + sy.sx,  cy.sz.sx + sy.cx, 0|
         |    sz,             cz.cx,            -cz.sx, 0|
         |-sy.cz,  sy.sz.cx + cy.sx, -sy.sz.sx + cy.cx, 0|
         |     0,                 0,                 0, 1|

我正在使用以下代码从该矩阵计算欧拉角:

this.anglesFromMatrix = function(m) {
    var y = 0, x = 0, z = 0;

    if (m.e(2, 1) > 0.999) {
        y = Math.atan2(m.e(1, 3), m.e(3, 3));
        z = Math.PI / 2;
        x = 0;
    } else if (m.e(2, 1) < -0.999) {
        y = Math.atan2(m.e(1, 3), m.e(3, 3));
        z = -Math.PI / 2;
        x = 0;
    } else {
        y = Math.atan2(-m.e(3, 1), -m.e(1, 1));
        x = Math.atan2(-m.e(2, 3), m.e(2, 2));
        z = Math.asin(m.e(2, 1));
    }
    return {theta: this.deg(x), phi: this.deg(y), psi: this.deg(z)};
};

我已经前后计算了几次数学,但我看不出有什么问题。任何帮助将不胜感激。

最佳答案

您的矩阵和欧拉角不一致。看起来你应该使用

y = Math.atan2(-m.e(3, 1), m.e(1, 1));

代替

y = Math.atan2(-m.e(3, 1), -m.e(1, 1));

对于一般情况(else 分支)。

我说“看起来像”是因为——这是什么语言?我假设您的索引对于这种语言是正确的。你确定atan2吗? atan2 没有单一的约定。在某些编程语言中,正弦项是第一个参数,而在其他编程语言中,余弦项是第一个参数。

关于math - YZX 旋转矩阵的欧拉角问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6504671/

相关文章:

c++ - 尝试优化线与圆柱相交

R:使用 rgl 生成可以在网络浏览器中查看的 3d 可旋转图?

android - 了解 ImageView Matrix 的用法

xcode - 在界面生成器中将标签旋转为横向

java - 为什么 Math#nextUp 不增加 Double.MIN_VALUE?

latex - 有没有带有 LaTeX 语法的计算器?

java - 安卓:java.lang.NoClassDefFoundError

opengl - glm::lookAt 返回具有 nan 元素的矩阵

flash - 具有预定义结果的逼真掷骰子动画

html - 如何在使用 css/js 旋转后定位/调整图像大小,以便图像不会定位在持有它的 div 之外或被裁剪掉