在opengl中转换为无穷大

时间:2013-12-30 01:53:36

标签: opengl graphics glut

这是我的代码。

#include "stdafx.h"
#include <GL/glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <math.h>
#define pi 3.14;
float x=.05; //translation parameter
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);
    glTranslatef(x,0.0f,0.0f);  
    glBegin(GL_POLYGON);
    glVertex2f(10,10);
    glVertex2f(30,20);
    glVertex2f(30,30);
    glVertex2f(10,30);
    glEnd();    

        x=x+.0000005;
        if(x>600)
        x=0;

    glFlush();
    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc , argv);
    glutInitDisplayMode(GLUT_DEPTH|GLUT_RGB|GLUT_DOUBLE);
    glutInitWindowSize(640,480);
    glutCreateWindow("my window");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(display);
    glutMainLoop();
    return(0);
}

此代码的问题是,矩形被转换为无穷大。我希望它转换为最大窗口大小并再次返回到窗口的开始。在此代码中,我检查x> 600(假设600为最大值),如果是这样x将更改为0.但它不会工作。

2 个答案:

答案 0 :(得分:1)

您需要在glPushMatrix之前致电glTranslatefglPopMatrix之后致glEnd

glTranslatef未设置转换,它会将其附加到现有转换中。您需要做的是推动矩阵堆栈上的现有矩阵,应用转换,然后恢复原始矩阵。这样翻译就不会累积。

答案 1 :(得分:0)

您没有重置ModelView矩阵。 GL变换函数通过变换矩阵乘以当前模型视图矩阵,以便变换累积。每次调用display函数时,都会移动矩形x - 相对于它的拉伸框架 - 。因此,改变x的逻辑实际上只是调整对象移动的速度。

glLoadIdentiy()放在display()的开头。它将重置矩阵以进行标识,撤消所有以前的转换。