用于透视投影的相机旋转

mar*_*k g 0 c++ opengl 3d camera rotation

我刚开始玩OpenGl来渲染一些结构,每个结构都包含多个多边形.基本上我想执行相当于在世界(结构)坐标中设置(0,0,z)的摄像机并围绕世界轴的x,y和z轴(按此顺序!)旋转它来渲染每个结构的视图(据我所知,通常的做法是使用逆相机矩阵).因此据我所知,我需要翻译(到世界原点即(0,0,-z))*rotateZ rotateY rotateX*translate(重新定义世界原点见下文)

所以我想我需要这样的东西:

//Called when the window is resized
void handleResize(int w, int h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(9.148, (double)w / (double)h, 800.0, 1500.0);
}

float _Zangle = 10.0f; 
float _cameraAngle = 90.0f;

//Draws the 3D scene
void drawScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
    glLoadIdentity(); //Reset the drawing perspective

    glTranslatef(0.0f, 0.0f, -z); //Move forward Z (mm) units
    glRotatef(-_Zangle, 0.0f, 0.0f, 1.0f); //Rotate "camera" about the z-axis
    glRotatef(-_cameraAngle, 0.0f, 1.0f, 0.0f); //Rotate the "camera" by camera_angle about y-axis
    glRotatef (90.0f,1.0f,0.0f,0.0f); // rotate "camera" by 90 degrees about x-axis
    glTranslatef(-11.0f,189.0f,51.0f); //re-define origin of world coordinates to be (11,-189,-51) - applied to all polygon vertices

glPushMatrix(); //Save the transformations performed thus far

glBegin(GL_POLYGON);


    glVertex3f(4.91892,-225.978,-50.0009);
        glVertex3f(5.73534,-225.978,-50.0009);
        glVertex3f(6.55174,-225.978,-50.0009);
        glVertex3f(7.36816,-225.978,-50.0009);
        .......// etc
glEnd();
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

然而,当我编译并运行它时,_angle和_cameraAngle似乎被反转,即_angle似乎围绕视口的y轴(垂直)旋转,_cameraAngle绕z轴旋转(进入视口的平面)?我究竟做错了什么?

感谢您抽时间阅读

Mr.*_*rna 5

简短的回答是:使用gluLookAt().此实用程序功能可创建适当的查看矩阵.

更长的答案是每个OpenGL转换调用采用当前矩阵并将其乘以为完成转换而构建的矩阵.通过调用一系列OpenGL转换函数,您可以构建一个将应用转换组合的转换矩阵.有效地,矩阵将是M = M1*M2*M3...在数学上,变换在上面的等式中从右到左应用.

您的代码不会移动相机.它停留在原点,向下看负z轴.您的变换将模型空间中的所有内容移动到(11,-189,-51),围绕x轴旋转所有内容90度,围绕y轴旋转所有内容90度,围绕z轴旋转所有内容10度,然后进行平移-z沿z轴的一切.

编辑:更多信息

我对你想要完成的事情感到有些困惑,但我认为你想要在原点拥有元素,并让相机看看这些元素.眼睛坐标将是您想要相机的位置,中心坐标将是您想要对象的位置.我会使用一点三角法来计算相机的位置,并将其指向原点.

在这种情况下,我通常使用以原点为中心的经度,纬度和高度来跟踪摄像机位置.计算眼睛坐标的x,y,z是simplex = elv*cos(lat)*sin(lon),y = elv*sin(lat),z = elv*cos(lat)*cos(lat).

我的gluLookAt电话会是 gluLookAt(x, y, z, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

您可以通过更改gluLookAt的最后三个坐标来旋转相机.