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

5

我有和标题一样的问题 :/ 我的操作如下:

  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 :/

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

6
你怎么知道这是你的相机而不是你的型号? - NG.
1
你能把代码示例放到代码区域吗(选择代码并点击“0101”按钮)? - LarsH
@SB,你是Steve Baker吗?只是好奇。 :-) - LarsH
3个回答

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. 绘制

如果您要围绕点(0,0,zoom)旋转,则缺少第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

我场景上有光。渲染看起来是这样的: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.3,0.3,0.3,1);glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0, -缩放); glRotatef(yr20+移动Yr20, 0.0f, 1.0f, 0.0f); glRotatef(zr20+移动Zr20, 1.0f, 0.0f, 0.0f); 渲染对象。 - openglNewbie
好的...但是在渲染你所说的模型之后,你是否还会执行另一个glLoadIdentity()或glPopMatrix(),并在渲染其他对象之前执行?因为如果没有这样做,那么你应用于该模型的任何变换也将应用于其他渲染的对象,并且就像你旋转了整个世界(或相机)一样。 - LarsH

0

在定义对象的变换时,您可以使用GL_MODELVIEW,而在转换视点时则可以使用GL_PROJECTION。


他已经在使用GL_MODELVIEW了。我希望你不是在说要使用GL_PROJECTION来移动相机。请参阅http://sjbaker.org/steve/omniv/projection_abuse.html。 - LarsH
哇,好的。我曾经使用自己的照明进行平行投影,所以这不是问题,但是我明白为什么这通常是不好的。 - andrewmu

0

我认为这与你应用变换的顺序有关。尝试交换对glRotateglTranslate的调用顺序。现在,您正在从原点向外移动它,然后围绕原点旋转,这将使物体看起来像是围绕相机轨道运动。如果您在物体仍在原点时旋转它,然后再移动它,它应该会给您想要的结果。希望能有所帮助。


他当前是向远离原点的方向移动还是向原点移动取决于它的起始位置。我假设模型的中心最初位于(0,0,缩放)。但你可能是对的... - LarsH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接