在opengl中翻译成无穷大

Posted

技术标签:

【中文标题】在opengl中翻译成无穷大【英文标题】:translate to infinity in opengl 【发布时间】:2013-12-30 01:53:36 【问题描述】:

这是我的代码。

#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。但它不会工作。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

添加推送矩阵和弹出矩阵但它不翻译:( 0.0000005 是一个非常小的偏移量,请尝试增加它。【参考方案2】:

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

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

【讨论】:

以上是关于在opengl中翻译成无穷大的主要内容,如果未能解决你的问题,请参考以下文章

将 ARB 程序集翻译成 GLSL?

OpenGL学习进程第四课:点边和图形点

在opengl中翻译相机有问题

OpenGL - 矩阵逻辑错误

是否可以在一个 OpenGL 矩阵中翻译两次?

[OpenGL](翻译+补充)投影矩阵的推导