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

            (轉(zhuǎn))gluPerspective和gluLookAt的關(guān)系

            轉(zhuǎn)自: http://hi.baidu.com/sunguangran/blog/item/ded90ced94779dd2b31cb11c.html

            終于搞明白gluPerspective和gluLookAt的關(guān)系了

            函數(shù)原型
            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)

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

            如果還沒(méi)有理解就繼續(xù)看,
            我們知道,遠(yuǎn)處的東西看起來(lái)要小一些,近處的東西看起來(lái)會(huì)大一些,這就是透視原理
            如下圖所示



            假設(shè)那兩條線(xiàn)表示公路,理論上講,它們的兩條邊是平行的,
            但現(xiàn)實(shí)情況中,它們?cè)谶h(yuǎn)方(可以無(wú)限遠(yuǎn))總要相交于一點(diǎn),
            實(shí)際線(xiàn)段AB的長(zhǎng)度=CD的長(zhǎng)度,只是在此例中使用了透視角,故會(huì)有如上的效果,是不是很接近現(xiàn)實(shí)的情況?

            結(jié)合我們剛才這兩個(gè)函數(shù)
            zNear,眼睛距離近處的距離,假設(shè)為10米遠(yuǎn),請(qǐng)不要設(shè)置為負(fù)值,OpenGl就傻了,不知道怎么算了,
            zFar表示遠(yuǎn)處的裁面,假設(shè)為1000米遠(yuǎn),
            就是這兩個(gè)參數(shù)的意義了,

            再解釋下那個(gè)"眼睛睜開(kāi)的角度"是什么意思,
            首先假設(shè)我們現(xiàn)在距離物體有50個(gè)單位距離遠(yuǎn)的位置,
            在眼睛睜開(kāi)角度設(shè)置為45時(shí),請(qǐng)看大屏幕:


            我們可以看到,在遠(yuǎn)處一個(gè)球,,很好玩哈,
            現(xiàn)在我們將眼睛再?gòu)堥_(kāi)點(diǎn)看,將"眼睛睜開(kāi)的角度"設(shè)置為178
            (180度表示平角,那時(shí)候我們將什么也看不到,眼睛睜太大了,眼大無(wú)神)


            我們只看到一個(gè)點(diǎn),,,,,,,,,,,,,,,,,,,,,,,,,,,
            因?yàn)槲覀兛吹姆秶罅?這個(gè)球本身大小沒(méi)有改變,但是它在我們的"視界"內(nèi)太小了,


            反之,我們將眼睛閉小些,改為1度看看會(huì)出現(xiàn)什么情況呢?


            在我們距離該物體3000距離遠(yuǎn),"眼睛睜開(kāi)的角度"為1時(shí),我們似乎走進(jìn)了這個(gè)球內(nèi),這個(gè)是不是類(lèi)似于相機(jī)的焦距?

            當(dāng)我們將"透視角"設(shè)置為0時(shí),我們相當(dāng)于閉上雙眼,這個(gè)世界清靜了,

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



            現(xiàn)在來(lái)看gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

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

            如果我們向前或向后移動(dòng),則相應(yīng)的圖像會(huì)變大或變小,這里其實(shí)就是運(yùn)用了透視原理,近處的物體大,遠(yuǎn)處的物體小,實(shí)際物體的大小是不變的,

            同理改變center坐標(biāo)(眼睛看去的那個(gè)點(diǎn),可簡(jiǎn)單理解為視線(xiàn)的終點(diǎn))也會(huì)影響球的大小,同樣可以認(rèn)為是改變了物體與觀察點(diǎn)的距離所致,

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




            以上理解了之后,來(lái)做一個(gè)測(cè)試
            透視圖不變,最遠(yuǎn)處仍為3000,近處為0.1

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


            將我們的觀察點(diǎn)置于A(0,10,0),
            將觀察位置(視線(xiàn)終點(diǎn))坐標(biāo)置于(0,0,0)
            然后在原點(diǎn)開(kāi)始繪圖,畫(huà)一個(gè)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運(yùn)行效果如下圖


            上圖證實(shí)了我們的推測(cè)











            //---------------------------------------------
                //生成網(wǎng)絡(luò)
                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);

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

            posted on 2009-04-01 11:03 小蟲(chóng)蟲(chóng) 閱讀(3828) 評(píng)論(0)  編輯 收藏 引用


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


            <2009年4月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(5)

            隨筆分類(lèi)

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            91精品国产综合久久精品| 日产久久强奸免费的看| 久久天天躁狠狠躁夜夜avapp| 久久久这里有精品| 久久精品aⅴ无码中文字字幕不卡| 久久久无码精品亚洲日韩京东传媒| 伊人久久综合成人网| 99久久精品午夜一区二区| 狠狠人妻久久久久久综合蜜桃| 国内精品伊人久久久久妇| a级成人毛片久久| 亚洲伊人久久成综合人影院 | 久久免费视频1| 久久精品国产网红主播| 久久97久久97精品免视看| 日本强好片久久久久久AAA| 久久九九亚洲精品| 久久亚洲精品无码VA大香大香| 91精品无码久久久久久五月天| 久久久精品国产免大香伊| 狠狠久久综合伊人不卡| 久久精品国产亚洲av影院| 人妻丰满?V无码久久不卡| 女人香蕉久久**毛片精品| 色综合久久中文字幕无码| 亚洲а∨天堂久久精品| 久久国产影院| 91久久精品国产91性色也| 国产精品对白刺激久久久| 99蜜桃臀久久久欧美精品网站 | 日本欧美国产精品第一页久久| 国产精品久久国产精品99盘| 国产A三级久久精品| 亚洲伊人久久成综合人影院| 国内精品久久久久国产盗摄| 99久久无色码中文字幕| 99久久er这里只有精品18| 伊人久久综合精品无码AV专区| 久久精品国产日本波多野结衣| 久久久久无码专区亚洲av| 久久无码精品一区二区三区|