它们是通过在绘制场景之前应用一系列的glTranslate、glRotate命令(代表相机位置和方向)来实现的。(技术上,你正在旋转整个场景!)
有一些实用函数,比如gluLookAt,可以抽象出一些关于此的细节。
为了简化事情,假设您有两个表示相机的向量:位置和方向。
gluLookAt需要位置、目标和上向量。
如果您实现了一个向量类,那么destination = position + direction应该给您一个目标点。
再次简化,您可以假设上向量始终为(0,1,0)。
然后,在渲染场景中的任何内容之前,加载身份矩阵并调用gluLookAt。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt( source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0 );
然后开始绘制你的对象。
您可以通过将位置略微向右或向左移动来让用户跨越。旋转则稍微复杂一些,因为您必须旋转方向向量。假设您要旋转的是相机,而不是场景中的某个对象。
一个问题是,如果您只有一个方向向量“前进”,那么如何移动它?右侧和左侧在哪里?
在这种情况下,我的方法是仅采用“方向”和(0,1,0)的叉积。
现在,您可以使用类似以下内容的东西将相机向左和向右移动:
position = position + right * amount; //amount < 0 moves to the left
您可以使用“方向向量”向前移动,但我认为最好将移动限制在水平面上,因此获取前向量的方式与获取右向量的方式相同:
forward = cross( up, right )
说实话,这有点像是一个hackish的方法。
正确的方法是使用更“复杂”的数据结构来表示相机的“方向”,而不仅仅是前进方向。但是,既然你刚刚开始,一步步来还是很好的。