在 OpenGL 中旋转时闪烁

blinking on rotation in opengl

本文关键字:闪烁 旋转 OpenGL      更新时间:2023-10-16

这是我的代码

#include "stdafx.h"
#include <GL/glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <math.h>
#define pi 3.14;
float angle=3;
void reshape(int w, int h)
{
if(h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,w,0,h,-1,1);
}
void display(void)
{
    glDepthMask(GL_TRUE);
    glClear(GL_COLOR_BUFFER_BIT);   
    glRotatef(angle++,0,1.0,1.0);
    glBegin(GL_POLYGON);
    glVertex2f(10,10);
    glVertex2f(30,20);
    glVertex2f(30,30);
    glVertex2f(10,30);
    glEnd();
    glRotatef(angle++,0,1.0,1.0);
    glBegin(GL_TRIANGLE_FAN);
        glVertex2f(300,300);
        int segments=20;
        GLfloat angle=0;
        for(int i=0;i<=segments; i++)
        {
            angle=i*2*pi; angle=angle / (segments);
            glVertex2f(300+cos(angle)*30,300+sin(angle)*30);
        }
        glEnd();        
    glFlush();
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit(&argc , argv);
    glutInitDisplayMode(GLUT_DEPTH|GLUT_RGB|GLUT_DOUBLE);
    glutInitWindowSize(640,480);
    glutCreateWindow("first");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(display);
    glutMainLoop();
    return(0);
}

这里的问题是

  1. 仅闪烁矩形无法正确看到旋转。不知道是不是在旋转。

2.即使有旋转代码,圆也不会旋转。 为什么?

3.如果我只想旋转矩形或圆形,我做了什么更改?

1.仅闪烁矩形就无法正确看到旋转。

你可能跑得太快了。 使用计时器回调每 16 毫秒左右发出一次 glutPostRedisplay() 秒。

2.即使有旋转代码,圆也没有旋转。为什么?

glRotatef(angle++,0,1.0,1.0);
                    ^^^

您在 X/Y 平面外旋转并超出glOrtho()调用的深度限制,从而导致片段被剪裁。 提高您的nearVal/farVal以容纳:

glOrtho(0,w,0,h,-1000,1000);

3.如果我只想旋转矩形或圆形,我做了什么更改?

删除其中一个glRotatef()


一起:

#include <GL/glut.h>
#include <cmath>
using namespace std;
const double pi = 3.14159;
float angle=3;
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);   
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    glOrtho(-w,w,-h,h,-1000,1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glDepthMask(GL_TRUE);
    //glRotatef(angle++,0,1.0,1.0);
    glBegin(GL_POLYGON);
    glVertex2f(10,10);
    glVertex2f(30,20);
    glVertex2f(30,30);
    glVertex2f(10,30);
    glEnd();
    glRotatef(angle++,0,1.0,1.0);
    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(300,300);
    const int segments=20;
    for(int i=0;i<=segments; i++)
    {
        const GLfloat angle = ( i*2*pi ) / (float)segments;
        glVertex2f(300+cos(angle)*30,300+sin(angle)*30);
    }
    glEnd();        
    glutSwapBuffers();
}
void timer( int value )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}
int main(int argc, char** argv)
{
    glutInit(&argc , argv);
    glutInitDisplayMode(GLUT_DEPTH|GLUT_RGB|GLUT_DOUBLE);
    glutInitWindowSize(640,480);
    glutCreateWindow("first");
    glutDisplayFunc(display);
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return(0);
}