使用openGL旋转时保留原始轴系统

时间:2010-12-04 22:13:37

标签: opengl rotation

我正在使用openGL实现一个arcball(在cpp上)。 说,我在轴系统的中心有一个物体,我想根据原始(世界)轴旋转几次。 但是,在第一次旋转之后,轴会发生变化,所有进一步的旋转都会出错。 有任何想法吗? 感谢。

3 个答案:

答案 0 :(得分:2)

为对象提供自己的方向轴(模型视图矩阵),然后将其乘以旋转矩阵。检查维基百科,了解如何构建旋转矩阵。

答案 1 :(得分:1)

我必须在OpenGL ES应用程序中自己做同样的事情,我在一篇关于它here的文章中对此进行了描述。原始粗略方法读取当前模型视图矩阵并对其进行操作以产生所需效果:

GLfloat currentModelViewMatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix);   
glRotatef(xRotation, currentModelViewMatrix[1], currentModelViewMatrix[5], currentModelViewMatrix[9]);
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix);
glRotatef(yRotation, currentModelViewMatrix[0], currentModelViewMatrix[4], currentModelViewMatrix[8]);

这会有效,但要注意两个glGetFloatv()调用会通过暂停管道来减慢渲染速度。我已经用我在模型视图矩阵的内部副本上执行的计算替换了这段代码,然后我在每次旋转后简单地编写内部操作的模型视图矩阵。这消除了进行昂贵的矩阵读取操作的需要。

答案 2 :(得分:1)

将xAngle和yAngle添加到当前矩阵。

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);