如何在opengl中计算glTranslatef函数的移位参数

如何在opengl中计算glTranslatef函数的移位参数,opengl,matrix,transformation,Opengl,Matrix,Transformation,我是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,

我是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();
}
这是我的代码

 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_移位更改为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))的pic

下面是应用于(glScalef(1.f,1.f,1.f)和glTranslatef(2.f,0.f,0))的pic,它恰好被移出了窗口


哦,不错的老OpenGL代码问题

在OpenGL 1和2中,
glTranslate
glRotate
glScale
函数应用于当前矩阵。在正常情况下,选择模型视图矩阵(GL_模型视图)。因此,在您的代码中,您不断地修改模型矩阵。更改比例后,对
glTranslate
的调用自然会进行适当的比例调整

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

传统的渲染函数类似于:

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();
glLoadIdentity();
//集合视图矩阵
glTranslate();
glRotate();
//第一个对象
glPushMatrix();
glTranslate();
glRotate();
glScale();
//绘图对象
glPopMatrix();
//第二个对象
glPushMatrix();
glTranslate();
glRotate();
glScale();
//绘图对象
glPopMatrix();
如果已经计算了对象变换矩阵,则只需使用它
glMultMatrix


但这已经成为历史,因为现在使用OpenGL 3和4,可以为着色器提供统一的矩阵,并且函数
glTranslate
glRotate
glScale
已成为过去。

OpenGL中的变换按与指定顺序相反的顺序应用。换句话说,指定的最后一个变换将首先应用于顶点

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

首先,将所有顶点在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)。

谢谢,您的详细说明让我明白了!
glTranslatef(2.0f, 0.0f, 0.0f);
glScalef(1.5f, 1.5f, 1.5f);