在opengl中转换为无穷大

在opengl中转换为无穷大,opengl,graphics,glut,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; glVie

这是我的密码

#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);
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#定义pi 3.14;
浮动x=0.05//平移参数
浮动角度=3;
空洞重塑(整数w,整数h)
{
如果(h==0)h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
glOrtho(0,w,0,h,-1,1);
}
作废显示(作废)
{
glDepthMask(GL_TRUE);
glClear(GLU颜色缓冲位);
glTranslatef(x,0.0f,0.0f);
glBegin(GL_多边形);
glVertex2f(10,10);
glVertex2f(30,20);
glVertex2f(30,30);
glVertex2f(10,30);
格伦德();
x=x+.0000005;
如果(x>600)
x=0;
glFlush();
glutSwapBuffers();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_深度| GLUT_RGB | GLUT_双精度);
glutInitWindowSize(640480);
创建窗口(“我的窗口”);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutIdleFunc(显示);
glutMainLoop();
返回(0);
}

这段代码的问题是,矩形被转换为无穷大。我希望将其转换为最大窗口大小,然后再次返回到窗口的起始位置。在这段代码中,我检查x>600(假设最大值为600),如果x更改为0。但是它不起作用。

您需要在
glTranslatef
之前调用
glPushMatrix
,在
glEnd
之后调用
glPopMatrix


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

您没有重置ModelView矩阵。GL变换函数将当前modelview矩阵乘以变换矩阵,从而累积变换。每次调用
display
函数时,您都会将矩形框移动
x
-相对于它所在的lats frame-。因此,您更改
x
的逻辑实际上只是调整对象移动的速度


glLoadIdentity()
放在
display()
的开头。它会将矩阵重置为恒等式,撤消以前的所有转换。

添加推送矩阵和弹出矩阵,但不转换:(0.0000005是一个非常小的移位量,请尝试增加它。