在opengl中旋转闪烁

时间:2013-12-30 03:05:30

标签: c++ opengl rotation

这是我的代码

#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. 2.即使有旋转代码,圆也不会旋转。为什么?

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

1 个答案:

答案 0 :(得分:1)

  

1.无法正确看到旋转,只是闪烁矩形。

你可能跑得太快了。使用计时器回调每16ms左右发出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);
}