旋转矩阵到欧拉角

n00*_*00b 1 c++ 3d opencv matrix rotational-matrices

我使用以下代码将 3X3 旋转矩阵转换为角度:

(_r = double[9] )

double angleZ=atan2(_r[3], _r[4])* (float) (180.0 / CV_PI);
double angleX=180-asin(-1*_r[5])* (float) (180.0 / CV_PI);
double angleY=180-atan2(_r[2],_r[8])* (float) (180.0 / CV_PI);
Run Code Online (Sandbox Code Playgroud)

这是一个小帮手

_r[0] _r[1] _r[2]
_r[3] _r[4] _r[5]
_r[6] _r[7] _r[8]
Run Code Online (Sandbox Code Playgroud)

这有道理吗 ?因为角度看起来太……相互依赖?xyz 都对单个姿势变化做出反应...

旋转矩阵是从 opencv cvPOSIT 函数接收的,因此兴趣点可能是错误的,并产生这种令人困惑的效果......

但不知何故,我认为我只是做错了转换:)

我将 opengl 中的角度应用于立方体:

glRotatef(angleX,1.0f,0.0f,0.0f);
glRotatef(angleY,0.0f,1.0f,0.0f);
glRotatef(angleZ,0.0f,0.0f,1.0f);
Run Code Online (Sandbox Code Playgroud)

oxy*_*ene 5

你想要完成的事情并不像你想象的那么容易。关于欧拉角的名称(x,y,z,alpha,beta,gamma,yaw,pitch,roll,heading,elevation,bank,...)以及它们需要应用的顺序有多种约定.

在某些位置也存在一些含糊不清的问题,请参阅维基百科关于Gimbal Lock 的文章。

请阅读David Eberly的欧拉角公式文档。它非常有用,并且包含许多用于各种约定的公式,如果您希望即使在极端情况下也有稳定的公式,您可能应该基于它们编写代码。