从顶部和底部两个3D点/一个不对称物体矢量提取三个欧拉角

时间:2012-06-25 14:26:53

标签: opengl 3d geometry rotation euler-angles

我知道一条线上的两个3D点(不对称物体的顶部和底部),并且想要找到欧拉角(沿x,y和z轴旋转)。

示例:需要对以下OpenGL代码进行逆向工程,下面只是展示场景的一个示例。

//Translation
glTranslated(p1.x, p1.y, p1.z);

//Rotation
glRotatef(rot.x, 1.0f, 0.0f, 0.0f);
glRotatef(rot.y, 0.0f, 1.0f, 0.0f);
glRotatef(rot.z, 0.0f, 0.0f, 1.0f);

// Draw the object ALONG Y-AXIS
p2 = DrawMyObject(); //p2 is top of my object

现在在某些情况下,我只得到p1和p2,我需要知道欧拉角(沿x,y和z轴旋转)。怎么样?

这是我尝试过的,答案应该是(Rx,Ry,Rz):( 4,-3,-11),

cv::Point3d p1, p2;
p1.x = 0.0525498;
p1.y = 0.0798909;
p1.z = -1.20806;

p2.x = 0.0586557;
p2.y = 0.111226;
p2.z = -1.20587;

double dx, dy, dz;
double angle;

dx = p2.x - p1.x;
dy = p2.y - p1.y;
dz = p2.z - p1.z;

angle = std::atan2(dy, dz); angle = RAD2DEG(angle);
std::cout<<"\n atan2(dy, dz): "<<int(90 - angle);

angle = std::atan2(dx, dz); angle = RAD2DEG(angle);
std::cout<<"\n atan2(dz, dx): "<<angle;

angle = std::atan2(dy, dx); angle = RAD2DEG(angle);
std::cout<<"\n atan2(dy, dx): "<<int(angle -90);

std::cout<<std::endl;

我没有得到完全正确的答案,特别是沿着Y的旋转根本不正确。我认为p1和p2都位于y轴上,同时沿y轴旋转,所以问题是。那么什么是最好的解决方案?

1 个答案:

答案 0 :(得分:1)

  1. 如评论中所述,您需要对象的第3个点或恒定的世界空间向量。请注意,使用常量向量可能会引入万向节问题,具体取决于您的具体应用以及相对于该向量的线的方向,因此如果您拥有它,第三点可能更可取。
  2. 构造一个正交归一化的3x3旋转矩阵:
    1. 使用Grahm-Schmit method对前两行进行正交规范化,其中:
      • u1 = p2 - p1
      • u2 = p3 - p1(或常数向量)
      • 应用Grahm-Schmit后,这些向量将成为3x3矩阵的前2行。
    2. 矩阵的第三行只是前两行的交叉积。
  3. Decompose the resulting matrix into euler angles.