OpenGL中平移、旋轉、縮放矩陣堆棧操作


在OpenGL中,圖元的幾何變換均為線性變換,通過矩陣變換實現。OpenGL中的坐標用齊次坐標表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空間中的點(2,3,4),在OpenGL中將表示成(2,3,4,1). 齊次坐標表示方式適合於矩陣運算,也很方便地表示了無窮遠的點,比如(1,0,0,0)就表示x軸上無窮遠的點,因為1/0是無窮大,這里約定0/0=0.

例:點(1,1,1)將該向量平移變換(2,3,4)個單位,得到(3,4,5)

矩陣表示為

1 0 0 2       1      3

0 1 0 3   *  1  =  4

0 0 1 4       1      5

左邊的矩陣為平移變換矩陣,若把2、3、4換成x、y、z,則用它乘以一個齊次坐標表示的向量,就可以將該向量平移(x,y,z)個單位。把平移變換矩陣記為T(x,y,z),旋轉變換矩陣記為R(x,y,z,w)。

例:

glTranslatef(50.0, 0.0, 0.0)//沿x正方向平移50。

glRotate3f(90,0.0,0.0,1.0)//沿x軸逆時針旋轉90°。

 

矩陣表示為T(50,0,0)*R(1,0,0,90)*X.

OpenGL有個變換矩陣堆棧,先進后出,離X最近的矩陣最先作用。

 

void myDisplay(void)
{

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-500.0, 500.0, -500.0, 500.0);

    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor3f(0.0, 0.0, 0.0);
    glBegin(GL_LINES);
    glVertex2f(-500.0, 0.0);
    glVertex2f(500.0, 0.0);

    glVertex2f(0.0, -500.0);
    glVertex2f(0.0, 500.0);
    glEnd();

    glColor3f(1.0, 0.0, 0.0);
    glRecti(50, 100, 200, 150);//initial rectangle

    glColor3f(0.0, 1.0, 0.0);
    glTranslatef(50.0, 50.0, 0.0);//translation
    glRecti(50, 100, 200, 150);

    //reset the current modelview matrix
    glLoadIdentity();//     重置當前矩陣為單位陣
    glColor3f(0.0, 0.0, 1.0);
    glRotatef(90.0, 0.0, 0.0, 1.0);//rotation 逆時針
    glRecti(50, 100, 200, 150);

    //reset the current modelview matrix
    glLoadIdentity();
    glColor3f(1.0, 1.0, 0.0);
     glTranslatef(-100.0, 0.0, 0.0);//translation
    glScalef(0.5, 1.0, 1.0);//scale   所有x坐標縮小一半
    glRecti(50, 100, 200, 150);

    glFlush();
}

 

 

 

補充:

在opengl中,函數glTranslatef的作用就是移動坐標原點。對應的3個參數對應着3個坐標軸。  如果你調用一次glTranslatef(1.0f,0.0f,0.0f)然后畫一個小球,接着再調用次glTranslatef(0.0f,1.0f,0.0f)再畫一個小球。  此時,兩個小球中,一個在另外一個正右方。  所以,如果要使兩個小球分別處於x、y軸,則需要在第二次畫之前調用glLoadIdentity()函數,使坐標原點歸位。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM