我的问题如下:
我在我的opengl场景中嵌套了对象,我只知道它们的相对位置和方向。
如何获得内部物体的绝对位置和方向?我想计算内部对象的模型视图矩阵,然后我有当前的矩阵,但我如何将其转换为位置和方向?换句话说,对于两个float向量,所以我可以调用以下代码:
glTranslatef(position.x,position.y,position.z);
glRotatef(alignment.x,1.0f,0.0f,0.0f);
glRotatef(alignment.y,0.0f,1.0f,0.0f);
glRotatef(alignment.z,0.0f,0.0f,1.0f);
提前致谢!
答案 0 :(得分:5)
如果您拥有对象的modelview矩阵,则可以使用以下代码提取位置:
// ... Some rotations/translations has been applied
GLfloat matrix[16];
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
const float position_x = matrix[12];
const float position_y = matrix[13];
const float position_z = matrix[14];
旋转有点复杂,请看:euler angles。我们想要的旋转矩阵是zyx-one =>
的转置//c1 = cos(alignment_x)
//c2 = cos(alignment_y)
//c3 = cos(alignment_z)
//s1 = sin(alignment_x)
//s2 = sin(alignment_y)
//s3 = sin(alignment_z)
//matrix[0] = c1 * c2
//matrix[1] = -c2 * s1
//matrix[2] = s2
//matrix[4] = c3 * s1 + c1 * s2 * s3
//matrix[5] = c1 * c3 - s1 * s2 * s3
//matrix[6] = -c2 * s3
//matrix[8] = s1 * s3 - c1 * c3 * s2
//matrix[9] = c3 * s1 * s2 + c1 * s3
//matrix[10] = c2 * c3
从中提取实际角度是相当混乱的,因为有一些奇点,如果我们忽略这些,我们得到:
// Assumes c2 != 0, you'll need more code to handle the special cases
if (matrix[0] != 0.0f || matrix[1] != 0.0f) {
const float alignment_x = atanf(-matrix[1], matrix[0]);
float c2;
if (0 != cosf(alignment_x)) {
c2 = matrix(0) / cosf(alignment_x);
} else {
c2 = matrix(1) / -sinf(alignment_x);
}
const float alignment_y = atanf(matrix[2], c2);
const float alignment_z = atanf(-matrix[6], matrix[10]);
} else {
alignment_y = atanf(matrix[2], 0);
//Too tired to deduce alignment_x and alignment_z, someone else?
}
以上所有代码都假设您只使用轮换/翻译,没有缩放或偏斜。
让我说完欧拉角是邪恶的,如果我是你,我会寻找一个替代解决方案来解决你想要解决的任何问题;)
/A.B。