如何旋转"相机"在opengl和c ++中

时间:2017-01-21 11:37:33

标签: c++ opengl rotation

我的问题是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.

1 个答案:

答案 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's documentation;

  

就OpenGL而言,没有相机。进一步来说,   相机始终位于眼睛空间坐标(0,0,0,0)。   为了给移动相机,你的OpenGL应用程序的外观   必须使用相机转换的反转来移动场景。