当前位置: 首页 > 知识库问答 >
问题:

OpenGL旋转场景不符合预期

蒙化
2023-03-14

使用我的代码,当我旋转ModelView时;它单独旋转每个对象。
我试图旋转整个视图平面。我怎么能那么做?

// prepare_scene
    glViewport(0, 0, windowWidth, windowHeight); 

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, windowWidth, 0, windowHeight, 0, 40); 

    glEnable(GL_DEPTH_TEST);    

    glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading

    glClearDepth(1.0f);                                 // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
    glDepthFunc(GL_LEQUAL);                             // The Type Of Depth Testing To Do
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

    glEnable(GL_POINT_SMOOTH);
    glPointSize(4); 

    glClearColor(0.0f, 0.0f, 0.0f, 1);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

渲染器称为每个并图框

// render

        glClearColor(0.0f, 0.0f, 0.0f, 1); // black
        //glClearColor(1.0f, 1.0f, 1.0f, 1); // white
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        //

        // try to control the camera
        // push_matrix (and at the end of render, add pop_matrix)
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();

        glTranslatef(eye_x, eye_y, eye_z);
        glRotatef(x_angular, 0, 1, 0); 

        // Go back to projection mode
        glMatrixMode(GL_PROJECTION);

        GLfloat mat_black[] = {0.0,0.0,0.0, 1.0};
        // Transparent white-grey window
        GLfloat mat_specular_w[] = {0.8,0.88,0.88, 1.0};
        GLfloat mat_shine_w[] = {20.0};

        glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_w);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_specular_w);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_specular_w);
        glMaterialfv(GL_FRONT, GL_SHININESS, mat_shine_w);  


        // for each object in objects:
                glPushMatrix();

                // object "world coordinates"
                // in glTranslatef(x,y,z); // z is always 0; for this test
                glTranslatef( (*obj_i)->anchor[0] , (*obj_i)->anchor[1], (*obj_i)->anchor[2]);
                glutWireSphere((*obj_i)->r, 15, 15);
                //glutSolidSphere((*obj_i)->r, 30, 30); // (*obj_i)->r

                glPopMatrix();



        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();

        glFlush();

        SwapBuffers(hdc);

共有1个答案

钱运浩
2023-03-14

停止在gl_projection堆栈中添加奇怪的相机/对象。

将其保存为gl_modelview:

// Every frame

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// do projection matrix stuff here (gluPerspective(), glOrtho(), etc.)
glOrtho(0, windowWidth, 0, windowHeight, 0, 40); 

glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 
// do camera transform (gluLookAt(), etc.) here
// I'm guessing this was your camera transform(s):
glTranslatef(eye_x, eye_y, eye_z);
glRotatef(x_angular, 0, 1, 0); 

// foreach object:
glPushMatrix();
{
    // do whatever
    glTranslatef( (*obj_i)->anchor[0] , (*obj_i)->anchor[1], (*obj_i)->anchor[2]);
    ...
}
glPopMatrix();
 类似资料:
  • 我试图创建一个第一人称相机。我从我的XNA项目中提取了一段代码,并试图将其转换为java(LWJGL)。 如果我移动鼠标,俯仰和偏航会增加/减少。在开始运行我的游戏时,它运行良好,但在一些动作后,我无法向下或向上看。如果我的位置是 性能良好的XNA代码: 所以我发现LWJGL和XNA在旋转矩阵方面有一些不同。 Java: 结果: {1.0 0.0 0.0 0 0.0}{0.0 0.3299931-

  • 我对OpenGL有点生疏,我已经实现了一个场景的照明,场景中有小行星围绕行星旋转的实例。出于某种原因,我得到的唯一输出似乎是场景的环境照明。我无法使漫反射或镜面反射工作。 这是现场的一张照片(很难看到…)仅限环境 片段着色器代码如下所示。FragPos、Normal和TexCoords都是你所期待的。纹理_diffuse1是行星/小行星纹理,具体取决于使用的着色器。LightPos可以移动,它由图

  • 在JavaFX中,我试图在应用程序窗口中显示旋转的ImageView。因此,我将其放入堆栈窗格中,使其始终居中,并将ImageView和堆栈窗格的宽度/高度绑定到场景的宽度/高度,以尽可能大地查看它。 只要我使用stackPane.setRotate(90)(并将绑定换成宽度/高度)将图像旋转90°,那么stackPane就不再绑定到应用程序窗口(或场景)的左上角。 如何正确放置旋转的图像? 在示

  • 嘿,我已经开始使用JOGL了,除了使用FloatBuffer矩阵时,我的创作在y轴上被扭曲了之外,一切都很顺利。 y轴畸变图片 它应该看起来像下面的图片,但目前我不能使它这样做,而仍然被允许移动。 它应该是什么样子的图片 我看到几年前,有人有这个问题(但关于z轴),但我无法使用他们给出的更正来解决我的问题。这是链接:Link 谢谢你抽出时间

  • 我想在x、y和z方向旋转我的模型Matix,但它以一种意想不到的方式旋转。我用Qt。 第一次旋转后,后续旋转围绕新模型矩阵的基础旋转,而我希望后续旋转围绕原点旋转。

  • 我正在制作一个小的3D世界,现在我正在修理相机。 相机停留在世界中的固定位置,而世界可以用鼠标和键盘围绕它移动(模拟相机在世界中移动)。 以下是我的draw函数中的代码: 只要我站着不动,环顾四周,一切都很好。另一方面,当我移动时,奇怪的事情开始发生。 首先,相机的Y坐标会发生变化,但它应该固定在Y=8(这就是为什么我将场景转换为-8) 第二,当我试图在世界中移动时,向前按应该只沿着z轴移动,但你