• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            doing5552

            記錄每日點滴,不枉人生一世

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

            公告

            常用鏈接

            留言簿(24)

            我參與的團隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 455263
            • 排名 - 48

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            今天忽然感悟到為什么在進行變換之前要用glPushMatrix();這個函數,而在變換完畢后有用glPopMatrix()這兩個函數了,趕緊記下來:

                我們在變換坐標的時候,使用的是glTranslatef(),glRotaef()等函數來操作,操作的是什么呢?操作的是當前矩陣,我們也知道,這些坐標變換(翻轉,旋轉也好)都是通過操作矩陣來實現的,而矩陣相乘是會疊加的,當你用完一個變換函數后,當前操作的矩陣就被改變了,當你還停留在變換以前的思維,我在這個地方繪制恰好是我想要的時候,你會發現再繪制出來的不是在你想要的位置,因為你在操作變換的時候,當前矩陣被改變了。

               比如你在默認情況下在原點畫了一個球,然后又進行了一個變換,比如用glTranslatef( 0.0, 0.0, 1.0 );沿z軸移動一定距離又畫了一個球,然后你想再在原點畫一個大一點的球覆蓋原來的那個,當你繪制的時候就會發現,你現在繪制的球已不在你想像的地方了。

            我們來做個實驗:

            代碼如下:

            void display()
            {
            glClear( GL_COLOR_BUFFER_BIT );
            glShadeModel( GL_SMOOTH );

            //現在原點繪制一個紅色正方形
            glColor3f( 1.0, 0.0, 0.0 );
            glRectf( -0.05, -0.05, 0.05, 0.05 );

            //glPushMatrix();

            //變換--沿x軸移動
                glTranslatef( 0.2, 0.0, 0.0 );

                //glPopMatrix();

            //再繪制一個正方形
            glColor3f( 0.0, 1.0, 0.0 );
            glRectf( -0.05, -0.05, 0.05, 0.05 );//這時,當我們還想在同樣位置繪制時,卻發現已經偏移

            glFlush();
            }

             

                當我們把glPushMatrxi()和glPopMatrix()注釋掉以后我們發現,當我們再想在同樣的位置繪制一個正方形的時候,就會發現已經按我們的glTransfef()所指定的沿x軸偏移了0.2個單位。

            而當我們不把兩句函數調用注釋掉時,運行發現,綠色的正方形覆蓋了原來的紅色的正方形。

             

            所以,這兩個函數的壓棧彈棧是有用地~~~~~~~~~~

            這兩個函數的具體的執行方式就不扯了,網上n多。

            知之為知之,不知百度之

            ~~~~~~~~~~~~吼吼~~~~~~~~~~

            續文:

            頓悟這點以后,晚上又突然想明白了另一個大問題:移動光源的位置。

            在頓悟以前,總覺得光源該怎么移動呢?那不是十分十分麻煩么,而且不知道怎么辦,現在明白了這個道理以后,光照的移動就簡單了。

            移動方式:

                  先pushMatrix()一下,然后在進行移動操作,然后旋轉操作,然后指定光源的位置,然后PopMatrix()一下,就完成了。

            測試代碼:

            #include <gl/glut.h>

            static int spin = 0;

            void init()
            {
            glShadeModel( GL_SMOOTH );
                glEnable( GL_LIGHTING );
            glEnable( GL_LIGHT0 );
            glEnable( GL_DEPTH_TEST );

            }

            void display()
            {
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

            GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };

            glPushMatrix();
            glTranslatef( 0.0, 0.0, -5.0 );

            glPushMatrix();
            glRotated( (GLdouble)spin, 1.0, 0.0, 0.0 );
            glLightfv( GL_LIGHT0, GL_POSITION, position );
            glTranslated( 0.0, 0.0, 1.5 );
            glDisable( GL_LIGHTING );
            glColor3f( 0.0, 1.0, 0.0 );
            glutWireCube( 0.1 );//綠色的下框,代表光源位置
            glEnable( GL_LIGHTING );
            glPopMatrix();

            glutSolidSphere( 0.5, 40, 40 );//被光照的物體
            glPopMatrix();
            glFlush();
            }

            void reshape( int w, int h )
            {
                glViewport( 0, 0, (GLsizei)w, (GLsizei)h );
            glMatrixMode( GL_PROJECTION );
            glLoadIdentity();
            gluPerspective( 40.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0 );
            glMatrixMode( GL_MODELVIEW );
            glLoadIdentity();
            }

            void mouse( int button, int state, int x, int y )
            {
            switch ( button )
            {
            case GLUT_LEFT_BUTTON:
               if ( state == GLUT_DOWN )
               {
                spin = ( spin + 30 ) % 360;
                glutPostRedisplay();
               }
               break;
            default:
               break;
            }
            }

            int main( int argc, char ** argv )
            {
            glutInit( &argc, argv );
            glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );
            glutInitWindowPosition( 100, 100 );
            glutInitWindowSize( 500, 500 );
            glutCreateWindow( argv[0] );
            init();
            glutDisplayFunc( display );
            glutReshapeFunc( reshape );
            glutMouseFunc( mouse );
            glutMainLoop();
            return 0;
            }

            posted on 2009-01-08 21:30 doing5552 閱讀(11889) 評論(0)  編輯 收藏 引用
            欧美日韩中文字幕久久久不卡 | 久久99国产精品久久久| 久久人人爽人人爽人人片av麻烦| 久久婷婷色综合一区二区| 亚洲午夜久久久久久久久久| 成人国内精品久久久久一区| 国产亚洲欧美成人久久片| 久久久99精品一区二区| 国产精品久久久久免费a∨| 久久精品亚洲一区二区三区浴池| 成人a毛片久久免费播放| 亚洲天堂久久久| 久久综合丁香激情久久| 一97日本道伊人久久综合影院| 97久久超碰国产精品旧版| 久久伊人五月天论坛| 精品国产乱码久久久久久1区2区| 日产久久强奸免费的看| 国产精品久久永久免费| 亚洲国产精品无码久久久秋霞2 | 怡红院日本一道日本久久 | 狠狠色综合网站久久久久久久高清| 久久精品国产99久久久| 精品人妻伦九区久久AAA片69 | 欧美久久一区二区三区| 久久九九全国免费| 久久人人爽人人爽人人AV | 久久久久亚洲AV成人网人人网站 | 无码8090精品久久一区| 曰曰摸天天摸人人看久久久| 久久九九精品99国产精品| 久久亚洲国产最新网站| 人人狠狠综合久久亚洲高清| 国产精品成人99久久久久| 99久久超碰中文字幕伊人| 久久亚洲精品成人AV| 久久夜色精品国产网站| 久久精品亚洲一区二区三区浴池| 天天躁日日躁狠狠久久| 久久亚洲日韩精品一区二区三区 | 久久精品人妻一区二区三区|