• <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

            記錄每日點(diǎn)滴,不枉人生一世

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

            公告

            常用鏈接

            留言簿(24)

            我參與的團(tuán)隊(duì)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 455716
            • 排名 - 49

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

                我們?cè)谧儞Q坐標(biāo)的時(shí)候,使用的是glTranslatef(),glRotaef()等函數(shù)來(lái)操作,操作的是什么呢?操作的是當(dāng)前矩陣,我們也知道,這些坐標(biāo)變換(翻轉(zhuǎn),旋轉(zhuǎn)也好)都是通過(guò)操作矩陣來(lái)實(shí)現(xiàn)的,而矩陣相乘是會(huì)疊加的,當(dāng)你用完一個(gè)變換函數(shù)后,當(dāng)前操作的矩陣就被改變了,當(dāng)你還停留在變換以前的思維,我在這個(gè)地方繪制恰好是我想要的時(shí)候,你會(huì)發(fā)現(xiàn)再繪制出來(lái)的不是在你想要的位置,因?yàn)槟阍诓僮髯儞Q的時(shí)候,當(dāng)前矩陣被改變了。

               比如你在默認(rèn)情況下在原點(diǎn)畫(huà)了一個(gè)球,然后又進(jìn)行了一個(gè)變換,比如用glTranslatef( 0.0, 0.0, 1.0 );沿z軸移動(dòng)一定距離又畫(huà)了一個(gè)球,然后你想再在原點(diǎn)畫(huà)一個(gè)大一點(diǎn)的球覆蓋原來(lái)的那個(gè),當(dāng)你繪制的時(shí)候就會(huì)發(fā)現(xiàn),你現(xiàn)在繪制的球已不在你想像的地方了。

            我們來(lái)做個(gè)實(shí)驗(yàn):

            代碼如下:

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

            //現(xiàn)在原點(diǎn)繪制一個(gè)紅色正方形
            glColor3f( 1.0, 0.0, 0.0 );
            glRectf( -0.05, -0.05, 0.05, 0.05 );

            //glPushMatrix();

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

                //glPopMatrix();

            //再繪制一個(gè)正方形
            glColor3f( 0.0, 1.0, 0.0 );
            glRectf( -0.05, -0.05, 0.05, 0.05 );//這時(shí),當(dāng)我們還想在同樣位置繪制時(shí),卻發(fā)現(xiàn)已經(jīng)偏移

            glFlush();
            }

             

                當(dāng)我們把glPushMatrxi()和glPopMatrix()注釋掉以后我們發(fā)現(xiàn),當(dāng)我們?cè)傧朐谕瑯拥奈恢美L制一個(gè)正方形的時(shí)候,就會(huì)發(fā)現(xiàn)已經(jīng)按我們的glTransfef()所指定的沿x軸偏移了0.2個(gè)單位。

            而當(dāng)我們不把兩句函數(shù)調(diào)用注釋掉時(shí),運(yùn)行發(fā)現(xiàn),綠色的正方形覆蓋了原來(lái)的紅色的正方形。

             

            所以,這兩個(gè)函數(shù)的壓棧彈棧是有用地~~~~~~~~~~

            這兩個(gè)函數(shù)的具體的執(zhí)行方式就不扯了,網(wǎng)上n多。

            知之為知之,不知百度之

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

            續(xù)文:

            頓悟這點(diǎn)以后,晚上又突然想明白了另一個(gè)大問(wèn)題:移動(dòng)光源的位置。

            在頓悟以前,總覺(jué)得光源該怎么移動(dòng)呢?那不是十分十分麻煩么,而且不知道怎么辦,現(xiàn)在明白了這個(gè)道理以后,光照的移動(dòng)就簡(jiǎn)單了。

            移動(dòng)方式:

                  先pushMatrix()一下,然后在進(jìn)行移動(dòng)操作,然后旋轉(zhuǎn)操作,然后指定光源的位置,然后PopMatrix()一下,就完成了。

            測(cè)試代碼:

            #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 閱讀(11899) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            色婷婷久久久SWAG精品| 久久久久四虎国产精品| 亚洲人成无码网站久久99热国产| 久久久久人妻一区精品| 波多野结衣AV无码久久一区| 精品久久久久久久久中文字幕| 久久精品国产亚洲AV不卡| 四虎国产精品成人免费久久| 久久久精品国产亚洲成人满18免费网站| 国内精品久久久久国产盗摄| 久久福利片| 久久久久99精品成人片直播| 国产一区二区精品久久岳| 亚洲综合伊人久久综合| 久久久久噜噜噜亚洲熟女综合| 久久午夜无码鲁丝片| 亚洲国产成人精品久久久国产成人一区二区三区综 | 99热精品久久只有精品| 久久综合亚洲色一区二区三区| 久久亚洲国产午夜精品理论片| 亚洲欧洲精品成人久久曰影片 | 亚洲午夜精品久久久久久人妖| 麻豆av久久av盛宴av| 韩国三级中文字幕hd久久精品| 久久精品毛片免费观看| 国产毛片欧美毛片久久久| 久久婷婷五月综合97色直播| 国产精品美女久久久| 久久久久久夜精品精品免费啦| 精品国产乱码久久久久软件| 中文字幕亚洲综合久久菠萝蜜 | 中文精品99久久国产| 青青热久久国产久精品| 色综合久久88色综合天天 | 久久久久久极精品久久久| 久久精品成人免费观看97| 久久精品国产欧美日韩| 亚洲国产香蕉人人爽成AV片久久| 久久精品亚洲精品国产欧美| 久久亚洲AV永久无码精品| 亚洲精品综合久久|