2

我需要更改对象相对于相机位置的位置。我的意思是,我的对象应该总是在镜头前。它应该跟随相机移动。我需要添加我的对象绘制功能吗?

4

2 回答 2

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();
}

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

于 2012-11-22T19:01:04.877 回答
1

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

desiredPosition = cameraPosition + cameraDirection * offset;
于 2012-11-22T18:42:12.630 回答