gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:16:39 24 4
gpt4 key购买 nike

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

我的约定是:

  • 左撇子(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com