【问题标题】:How to calculate the shift parameters of glTranslatef function in opengl如何计算opengl中glTranslatef函数的移位参数
【发布时间】:2014-09-02 11:31:22
【问题描述】:

我是opengl的新手,对如何计算glTranslatef的参数感到困惑。 这是我的显示代码

void display()
{


    glPushMatrix();
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);   // background

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glScalef(1.f,1.f,1.f);
    glTranslatef(2.f,0.f,0);


    glBegin(GL_QUADS);
    glVertex2f(-1.0f,-1.0f);
    glTexCoord2f(0.0f,1.0f); 

    glVertex2f(1.0f,-1.0f);
    glTexCoord2f(0.0f,0.0f); 

    glVertex2f(1.0f,1.0f);
    glTexCoord2f(1.0f,0.0f); 

    glVertex2f(-1.0f,1.0f);
    glTexCoord2f(1.0f,1.0f); 

    glEnd();  
    //here is my drawing code,ignore it
    runCuda();
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);

    glBindTexture(GL_TEXTURE_2D, textureID);

    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 768,/*window_width, window_height,*/ 
        GL_RGB, GL_UNSIGNED_BYTE, NULL);

    glPopMatrix();
    glFlush();
}

这是我的启动 gl 代码

 bool initGL(int argc, char **argv)
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
    glutInitWindowSize(window_width, window_height);
    glutCreateWindow("Cuda GL Interop Demo (adapted from NVDIA's simpleGL)");

    glutDisplayFunc(fpsDisplay);

    glewInit();
    if(!glewIsSupported("GL_VERSION_2_0"))
    {
        fprintf(stderr, "ERROR: Support for necessary OpengGL extensions missing.");
        return false;
    }

    glViewport(0, 0, window_width, window_height);  

    glClearColor(0.0, 0.0, 0.0, 1.0);  
    glDisable(GL_DEPTH_TEST);  

    glMatrixMode(GL_MODELVIEW);  
    glLoadIdentity();  

    glMatrixMode(GL_PROJECTION); // Add this line
    glLoadIdentity(); 

    gluOrtho2D(-1.0f, 1.0f, -1.0f, 1.0f);//, -1.0f, 1.0f);  


    return true;
    }

问题是,当nScale = 1.f时,我们应用gltranslatef(1.f,0,0)在窗口中间向左移动,gltranslatef(2.f,0,0)移动图片超出窗口(2.f 是将图片移出窗口的最小移位值)。但是如果我将 nScale 更改为 2.f ,我们需要将 x_shift 更改为 1.5f(gltranslatef(1.5f,0,0 ))移动窗口的图片,或者将nScale更改为4.f,我们需要将x_shift更改为1.25f来移动窗口的图片。我对gltranslate函数中的x_shift(或y_shift)感到困惑。看起来我们需要将移位值更改为(1 + 1/nScale^2),对吗?如何得到这个方程?我希望有人能帮助我。 这是原始图片:

这是应用于 (glScalef(1.f,1.f,1.f),glTranslatef(1.f,0.f,0)) 的图片

这是应用于(glScalef(1.f,1.f,1.f),glTranslatef(2.f,0.f,0))的图片,正好移出窗口

【问题讨论】:

    标签: opengl matrix transformation


    【解决方案1】:

    OpenGL 中的变换以它们指定顺序的相反顺序应用。换句话说,指定的最后一个变换首先应用到顶点。

    在这种特定情况下,代码的编写方式(使用不同的值进行说明):

    glScalef(1.5f, 1.5f, 1.5f);
    glTranslatef(2.0f, 0.0f, 0.0f);
    

    这首先将所有顶点在 x 方向上平移 2.0。然后将整个事物缩放 1.5。由于在第一步中图像的原始中心被转换为 (2.0, 0.0, 0.0),因此缩放 1.5 后的图像中心现在位于 (3.0, 0.0, 0.0)。

    要将平移应用于已缩放的图像,需要颠倒这些调用的顺序:

    glTranslatef(2.0f, 0.0f, 0.0f);
    glScalef(1.5f, 1.5f, 1.5f);
    

    现在缩放将首先应用于您的顶点,然后它们将被平移。这两次变换后的图像中心将在 (2.0, 0.0, 0.0)。

    【讨论】:

    • 谢谢,你的详细笔记让我明白了!
    【解决方案2】:

    哦,不错的旧 OpenGL 代码问题。

    在 OpenGL 1 和 2 中,glTranslateglRotateglScale 函数适用于当前矩阵。在标称情况下,选择模型视图矩阵 (GL_MODELVIEW)。因此,在您的代码中,您不断更改模型矩阵。更改比例后,您对glTranslate 的调用自然会相应地进行缩放。

    单独渲染多个对象的方法是使用glPushMatrixglPopMatrix

    传统的渲染函数看起来像:

    glLoadIdentity();
    
    // set view matrix
    glTranslate(<-camera position>);
    glRotate(<-camera orientation>);
    
    
    // first object
    glPushMatrix();
    glTranslate(<object position>);
    glRotate(<object orientation>);
    glScale(<object scale>);
    
    // draw object
    
    glPopMatrix();
    
    // second object
    glPushMatrix();
    glTranslate(<object position>);
    glRotate(<object orientation>);
    glScale(<object scale>);
    
    // draw object
    
    glPopMatrix();
    

    如果你已经计算了对象变换矩阵,你只需glMultMatrix 就可以了。

    但这已成为历史,因为现在使用 OpenGL 3 和 4,您将矩阵作为统一体提供给着色器,而函数 glTranslateglRotateglScale 已成为过去。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多