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

            (轉)gluPerspective和gluLookAt的關系

            轉自: http://hi.baidu.com/sunguangran/blog/item/ded90ced94779dd2b31cb11c.html

            終于搞明白gluPerspective和gluLookAt的關系了

            函數原型
            gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

            gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)

            一個一個來,首先得設置gluPerspective,來看看它的參數都表示什么意思
            fovy,這個最難理解,我的理解是,眼睛睜開的角度,即,視角的大小,如果設置為0,相當你閉上眼睛了,所以什么也看不到,如果為180,那么可以認為你的視界很廣闊,
            aspect,這個好理解,就是實際窗口的縱橫比,即x/y
            zNear,這個呢,表示你近處,的裁面,
            zFar表示遠處的裁面,

            如果還沒有理解就繼續看,
            我們知道,遠處的東西看起來要小一些,近處的東西看起來會大一些,這就是透視原理
            如下圖所示



            假設那兩條線表示公路,理論上講,它們的兩條邊是平行的,
            但現實情況中,它們在遠方(可以無限遠)總要相交于一點,
            實際線段AB的長度=CD的長度,只是在此例中使用了透視角,故會有如上的效果,是不是很接近現實的情況?

            結合我們剛才這兩個函數
            zNear,眼睛距離近處的距離,假設為10米遠,請不要設置為負值,OpenGl就傻了,不知道怎么算了,
            zFar表示遠處的裁面,假設為1000米遠,
            就是這兩個參數的意義了,

            再解釋下那個"眼睛睜開的角度"是什么意思,
            首先假設我們現在距離物體有50個單位距離遠的位置,
            在眼睛睜開角度設置為45時,請看大屏幕:


            我們可以看到,在遠處一個球,,很好玩哈,
            現在我們將眼睛再張開點看,將"眼睛睜開的角度"設置為178
            (180度表示平角,那時候我們將什么也看不到,眼睛睜太大了,眼大無神)


            我們只看到一個點,,,,,,,,,,,,,,,,,,,,,,,,,,,
            因為我們看的范圍太大了,這個球本身大小沒有改變,但是它在我們的"視界"內太小了,


            反之,我們將眼睛閉小些,改為1度看看會出現什么情況呢?


            在我們距離該物體3000距離遠,"眼睛睜開的角度"為1時,我們似乎走進了這個球內,這個是不是類似于相機的焦距?

            當我們將"透視角"設置為0時,我們相當于閉上雙眼,這個世界清靜了,

            我們什么也看不到,,,,,,,,,



            現在來看gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

            它共接受三對坐標,
            分別為eye,center,up
            故名思義,eye表示我們眼睛在"世界坐標系"中的位置,
            center表示眼睛"看"的那個點的坐標,
            最后那個up坐標表示觀察者本身的方向,如果將觀察點比喻成我們的眼睛,那么這個up則表示我們是正立還是倒立異或某一個角度在看,所看的影像大不相同,故此時需要指明我們現在正立,那么X,Z軸為0,Y軸為正即可,通常將其設置為1,只要表示一個向上的向量(方向)即可
            球是畫在世界坐標系的原點上的,即O(0,0,0)坐標上,我們的眼睛位于觀察點A(0,0,100),Z軸向屏幕里看去的方向為負,屏幕外我們的位置,Z軸為正值,其實很好理解,即我們距離原點的距離,設置100,將觀察到如下圖所示的影像

            如果我們向前或向后移動,則相應的圖像會變大或變小,這里其實就是運用了透視原理,近處的物體大,遠處的物體小,實際物體的大小是不變的,

            同理改變center坐標(眼睛看去的那個點,可簡單理解為視線的終點)也會影響球的大小,同樣可以認為是改變了物體與觀察點的距離所致,

            最后那個up坐標表示觀察者本身的方向,如果將觀察點比喻成我們的眼睛,那么這個up則表示我們是正立還是倒立異或某一個角度在看,所看的影像大不相同,故此時需要指明我們現在正立,那么X,Z軸為0,Y軸為正即可,通常將其設置為1,只要表示一個向上的向量(方向)即可,我們指定0.1f或0.00001f異或1000.0f,效果是一樣的,只要能表示方向即可,




            以上理解了之后,來做一個測試
            透視圖不變,最遠處仍為3000,近處為0.1

            gluPerspective                            // 設置透視圖
                    (45,                            // 透視角設置為 45 度,在Y方向上以角度為單位的視野
                    (GLfloat)x/(GLfloat)y,    // 窗口的寬與高比
                    0.1f,                                // 視野透視深度:近點1.0f
                    3000.0f                            // 視野透視深度:始點0.1f遠點1000.0f
                    );


            將我們的觀察點置于A(0,10,0),
            將觀察位置(視線終點)坐標置于(0,0,0)
            然后在原點開始繪圖,畫一個V字形,并將Z軸的值從-1000遞增加到+1000,增量為10,
            代碼如下

                glColor3f(0.5f, 0.7f, 1.0f);

                glBegin(GL_LINES);
                    for(int i=-1000;i<=1000;i+=10)
                    {
                        glVertex3f(0,0,i);
                        glVertex3f(10,10,i);

                        glVertex3f(0,0,i);
                        glVertex3f(-10,10,i);
                    }
                glEnd();

            F5運行效果如下圖


            上圖證實了我們的推測











            //---------------------------------------------
                //生成網絡
                glColor3f(0.5f, 0.7f, 1.0f);
                int x=(int)(40*2);
               
                glBegin(GL_LINES);
                        for(int i=-x;i<=x;i+=4)
                        {
                            glVertex3i(-x,0,i);
                            glVertex3i(x,0,i);

                            glVertex3i(i,0,x);
                            glVertex3i(i,0,-x);
                        }
                glEnd();

            //生成球體
                GLUquadricObj * pObj;
                pObj = gluNewQuadric();
                gluQuadricDrawStyle(pObj,GLU_LINE);
                gluQuadricNormals(pObj,GLU_SMOOTH);

            =============================================================
            以下是個小總結:
            1、模視矩陣(ModelView Matrix)的作用是將模型從局部坐標系變換到世界坐標系,并最終變換到視點坐標系中。它由模型變換矩陣和視點變換矩陣組成。
            2、gluLookAt影響的是視點矩陣,它顯式的標明了視點坐標系與世界坐標系的關系,即視點被安置在世界坐標系的哪個位置,視線的方向朝向何處。
            3、gluPerspective用于規定視景體范圍,與模視矩陣無關,它影響的是投影矩陣和規一化矩陣。投影矩陣的作用是使模型產生近大遠小的效果,規一化矩陣是將模型的z值規一化到0~1之間。
            4、在編程的時候,需要glMatrixMode來指定矩陣堆棧的類型,然后對該矩陣進行修改。
               glMatrixMode(GL_MODELVIEW);
               glLoadIdentity();
               的作用是初始化模視矩陣,將坐標原點重新設置在世界坐標系的原點。之后的glTranslate、glScale、glRotate都會改變模視矩陣中的模型變換矩陣。而glLookAt則設置視點變換矩陣。它們共同作用,使得模型能在世界坐標系中正確安放,并能從合適的角度去觀察。

            posted on 2009-04-01 11:03 小蟲蟲 閱讀(3826) 評論(0)  編輯 收藏 引用

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿(5)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            99久久婷婷国产综合精品草原| 亚洲伊人久久精品影院 | 国产国产成人久久精品| 国产精品免费久久久久久久久| 99久久精品国产综合一区| 午夜精品久久久内射近拍高清| 亚洲国产精品无码久久久不卡| 国产国产成人精品久久| 人妻系列无码专区久久五月天| 一本色道久久综合狠狠躁| AA级片免费看视频久久| 久久国产色av免费看| 91性高湖久久久久| 久久这里只有精品18| 蜜桃麻豆www久久国产精品| 国产精品久久久久9999| 2021最新久久久视精品爱| 国产成人香蕉久久久久| 欧美亚洲色综久久精品国产| 久久精品一区二区三区中文字幕| 久久丫精品国产亚洲av| 日本WV一本一道久久香蕉| 99久久无码一区人妻| 久久91亚洲人成电影网站| 久久久久亚洲精品日久生情| 久久综合狠狠综合久久97色| 久久久久久久尹人综合网亚洲| 狠狠精品久久久无码中文字幕 | 成人久久免费网站| 日韩美女18网站久久精品| 精品久久久久久久中文字幕| 国产精品一久久香蕉产线看| 亚洲AV日韩精品久久久久| 国产毛片欧美毛片久久久 | 精品国产一区二区三区久久久狼 | 久久久www免费人成精品| 久久免费观看视频| 久久久无码精品午夜| 久久亚洲AV永久无码精品| 色偷偷88欧美精品久久久 | 久久国产精品一区二区|