如何在OpenGL中旋转模型而不是相机?

时间:2010-10-26 13:09:23

标签: opengl rotation

我有与标题中相同的问题:/ 我做了类似的事情:

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(0.0f, 0, -zoom);
  glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
  glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);

  //Here model render :/

在我的应用程序相机中旋转而不是模型:/

3 个答案:

答案 0 :(得分:5)

大概是你相信它是你的相机移动而不是你的模型的原因是因为场景中的所有物体都在一起移动?

渲染模型后,在渲染其他对象之前,您是否重置了MODELVIEW矩阵?换句话说,在渲染您正在讨论的模型之后以及渲染其他对象之前,您是在做另一个glLoadIdentity()还是glPopMatrix()?

因为如果没有,你应用于该模型的任何变换也将适用于渲染的其他对象,就像你旋转整个世界(或相机)一样。

我认为您的代码可能存在另一个问题:

  glTranslatef(0.0f, 0, -zoom);
  glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
  glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);
  //Here model render :/

您是否尝试围绕该点(0,0,-zoom)旋转模型?

通常,为了围绕某个点(x,y,z)旋转,你可以:

  1. 通过向量(-x,-y,-z)翻译将(x,y,z)翻译为原点(0,0,0)
  2. 执行轮换
  3. 通过向量(x,y,z)翻译将原点翻译回(x,y,z)
  4. 绘制
  5. 如果您尝试围绕该点旋转(0,0,缩放),则缺少步骤3。 因此,在渲染模型之前尝试添加它:

    glTranslatef(0.0f, 0, zoom); // translate back from origin
    

    另一方面,如果您尝试围绕原点(0,0,0)旋转模型,并沿z轴移动模型,那么您需要在旋转后进行平移,如@ nonVirtual说。

    在绘制其他对象之前,不要忘记重置MODELVIEW矩阵。所以整个序列将是这样的:

      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
    
    #if you want to rotate around (0, 0, -zoom):
      glTranslatef(0.0f, 0, -zoom);
      glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
      glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);
      glTranslatef(0.0f, 0, zoom); // translate back from origin
    #else if you want to rotate around (0, 0, 0):
      glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f);
      glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f);
      glTranslatef(0.0f, 0, -zoom);
    #endif    
      //Here model render :/
    
      glLoadIdentity();
      // translate/rotate for other objects if necessary
      // draw other objects
    

答案 1 :(得分:0)

在为对象定义转换时使用GL_MODELVIEW,在转换视点时使用GL_PROJECTION。

答案 2 :(得分:0)

我认为这与您应用转换的顺序有关。尝试将通话顺序切换为glRotateglTranslate。因为它现在是从原点向外移动,然后围绕原点旋转它,这将使物体的外观围绕相机旋转。如果你在它仍然在原点时旋转它,然后移动它,它应该给你想要的结果。希望有所帮助。