我的问题是OpenGL总是在(0,0,0)左右旋转。但如果我翻译
"相机",例如,如果我向后移动,它也会旋转(0,0,0)。但我需要围绕相机旋转,所以我必须将点转换回(0,0,0),旋转,并将它们转换为旧位置。
但是这里发生错误:旋转后,平移相对于旋转
那么,我该如何翻译呢?
PS:我不想使用gluLookAt()
所以我相对于相机旋转的代码是:
//set rotation to zero
glRotatef(-yr,0.0f,1.0f,0.0f);
glRotatef(-xr,1.0f,0.0f,0.0f);
//set points relative to camera
glTranslatef(-cam_pos[0],-cam_pos[1],-cam_pos[2]);
//reset rotation
glRotatef(yr,0.0f,1.0f,0.0f);
glRotatef(xr,1.0f,0.0f,0.0f);
//rotate
glRotatef(angley,0.0f,1.0f,0.0f);
glRotatef(anglex,1.0f,0.0f,0.0f);
//and now, how to translate back,
//movement is relative to the cam ?
//I would simply use :
//glTranslatef(cam_pos[0],cam_pos[1],cam_pos[2]);
//which wont work because its relative to the new rotation.
答案 0 :(得分:2)
OpenGL不直接支持摄像机转换。它假定摄像机始终位于确切的中心(0,0,0)。所以你应该使用反向相机变换来转换所有光源,所有物体和所有其他物体(所有场景)。
gluLookAt()使用“反向相机变换矩阵”转换元素。如果您不想使用它,则应使用OpenGL的模型转换方法。
https://stackoverflow.com/a/3483744/4725899 https://www.gamedev.net/topic/421529-manual-alternative-to-glulookat-/
就OpenGL而言,没有相机。进一步来说, 相机始终位于眼睛空间坐标(0,0,0,0)。 为了给移动相机,你的OpenGL应用程序的外观 必须使用相机转换的反转来移动场景。