如何在opengl中更改对象的位置?

时间:2012-11-22 18:36:15

标签: c++ opengl

我需要改变物体相对于相机位置的位置。我的意思是,我的物体应该始终在镜头前。它应该遵循相机移动。我需要添加对象绘制功能吗?

2 个答案:

答案 0 :(得分:2)

如果您使用的是旧式固定功能矩阵,则相对于相机定位对象的最简单方法是在从堆栈中移除相机矩阵后执行。例如,您可能有这样的矩阵设置:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...); //Or other camera functions.
for(/*each object*/)
{
  glPushMatrix();
   //Setup object matrices.
  glTranslatef();
  glRotatef();

  //Setup object rendering.
  glDrawElements(); //Draw the object

  glPopMatrix();
}

然后将其切换为:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
gluLookAt(...); //Or other camera functions.
for(/*each object*/)
{
  glPushMatrix();
   //Setup object matrices.
  glTranslatef();
  glRotatef();

  //Setup object rendering.
  glDrawElements(); //Draw the object

  glPopMatrix();
}
glPopMatrix(); //Remove camera matrix. MODELVIEW is now identity.
for(/*each camera-relative object*/)
{
  glPushMatrix();
   //Setup object matrices.
  glTranslatef();
  glRotatef();

  //Setup object rendering.
  glDrawElements(); //Draw the object

  glPopMatrix();
}

如果您使用着色器,则更容易。如果你有一个矩阵堆栈,只需执行与此处相同的基于堆栈的操作。如果您正在做其他事情来构建矩阵,那么就不要将相机矩阵考虑在变换中。

答案 1 :(得分:1)

您的对象位置应始终位于:

desiredPosition = cameraPosition + cameraDirection * offset;