• <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>
            隨筆 - 132  文章 - 51  trackbacks - 0
            <2012年3月>
            26272829123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            cocos2d-x

            OGRE

            OPenGL

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            -潘宏
            -2009.12.31

            -本人水平有限,疏忽錯(cuò)誤在所難免,還請(qǐng)各位數(shù)學(xué)高手、編程高手不吝賜教

            -email: popyy@netease.com

            原文地址:http://blog.csdn.net/popy007/article/details/5120158

             

            一些網(wǎng)友寫信給我希望能夠了解固定流水線中世界空間到相機(jī)空間變換矩陣的具體推導(dǎo)過程。其實(shí)之前我在《向量幾何在游戲編程中的使用6》中已經(jīng)簡(jiǎn)單的把相機(jī)變換作為一個(gè)使用基理論的例子進(jìn)行了說明,但可能仍然不夠具體。這篇文章中,我會(huì)盡力闡述相機(jī)變換的整個(gè)來龍去脈。希望能夠?qū)φ趯W(xué)習(xí)固定流水線的朋友們有所幫助。這里我們?nèi)匀粫?huì)在推導(dǎo)相機(jī)變換之前介紹幾個(gè)理論知識(shí),目的是為了更好的理解推導(dǎo)過程。我們馬上開始!

            什么是相機(jī)變換?

            在流水線中,當(dāng)物體從模型坐標(biāo)通過世界矩陣變換到世界空間之后,它將通過相機(jī)變換從世界空間變換到相機(jī)空間。下圖的固定流水線中,藍(lán)色框中的部分就是這個(gè)過程。

             

             

             

             

             

             

            其實(shí),所謂的相機(jī)空間,就是以相機(jī)作為坐標(biāo)原點(diǎn)的一個(gè)參考系,所以,從世界空間變換到相機(jī)空間,就是把物體從世界坐標(biāo)系,變換到相機(jī)為原點(diǎn)的相機(jī)坐標(biāo)系,如下圖所示。

             

             

             

             

            左半部分是小人在世界空間中的位置,右半部分是小人變換到相機(jī)空間后的位置。這樣的一個(gè)變換可以有很多種方式來實(shí)現(xiàn):歐拉相機(jī)系統(tǒng)、UVN系統(tǒng)、Two Points & A Twist等等。這里我們討論最為廣泛的UVN系統(tǒng)構(gòu)建相機(jī)矩陣,如果讀者對(duì)其他方法感興趣,可以查找相關(guān)的資料。我們?nèi)匀挥懻?/span>OpenGL的相機(jī)矩陣的推導(dǎo),其他API可以類似的推導(dǎo)。

            坐標(biāo)轉(zhuǎn)換公式

            我們?cè)凇断蛄繋缀卧谟螒蚓幊讨械氖褂?/span>6》中提到了正交矩陣,這是在基理論基礎(chǔ)上的一個(gè)概念(如果對(duì)基理論不是很熟悉,請(qǐng)參考《向量幾何在游戲編程中的使用6》)。正交矩陣所有列(行)向量構(gòu)成了一個(gè)標(biāo)準(zhǔn)正交基(它的列向量都是互相正交,并且長(zhǎng)度為1),因此,可以把正交矩陣看成是對(duì)一個(gè)坐標(biāo)系的描述。同時(shí),我們知道:同一個(gè)向量,在不同的基下面的坐標(biāo)是不同的。因此,可以用正交矩陣來代表坐標(biāo)系(也可以看作基)從而寫出在統(tǒng)一的參考系(全局坐標(biāo)系)下同一個(gè)向量在不同基中的坐標(biāo)。

             

             

             

            上面的式子表示,參考系中向量v在基Q中的坐標(biāo)是v’,在基R中的坐標(biāo)是v’’(注意這里的環(huán)境下基矩陣是用列向量表示的,這樣相乘之后的結(jié)果表示的是基向量的線性組合)。如下圖,黑色基表示的是參考系,紅色是基Q,藍(lán)色是基Rv是參考系中的一個(gè)向量。

             

             

            為了讓大家更清楚,我舉一個(gè)例子:

             

             

            上式的意思是:參考系中的向量v,在基Q( 1 0 0 ), ( 0 1 0 ), ( 0 0 1)下的坐標(biāo)是( 1 2 6 ),在基R( 0 1 0 ), ( 0 0 1 ), ( 1 0 0 )下的坐標(biāo)是( 2 6 1 )。注意,我們所討論的所有基和向量的關(guān)系都只是線性表示的關(guān)系,沒有位移關(guān)系,因此我們用3D向量表示,而不是4D的齊次表示(如果對(duì)齊次坐標(biāo)不是很熟悉,請(qǐng)參考《深入探索透視投影變換》中的齊次坐標(biāo)部分)。

            這樣,已知一個(gè)基Q和向量v在它之中的坐標(biāo)v’,以及另外一個(gè)基R,我們可以通過v=Qv’=Rv’’公式來計(jì)算v’’

             

             

             

            上面就是求v’’的公式,注意到右邊需要計(jì)算基R的逆矩陣R^-1,因?yàn)榛?/span>R是正交矩陣,而正交矩陣的一個(gè)重要性質(zhì)就是逆等于轉(zhuǎn)置。因此,我們可以把它寫成

             

            這個(gè)公式就是坐標(biāo)轉(zhuǎn)換公式。特別地,如果Q是和參考系相同的坐標(biāo)系(3D編程中大多數(shù)情況下如此),比如世界坐標(biāo)系,則Q是一個(gè)單位矩陣I,則我們可以把它寫成

             

             

            這個(gè)坐標(biāo)轉(zhuǎn)換公式可以解釋為:對(duì)于世界坐標(biāo)系中的向量v’,它在坐標(biāo)系R中的坐標(biāo)是v’’。我們?cè)诤竺鏁?huì)用到這個(gè)公式。

                除了用正交矩陣來闡述坐標(biāo)轉(zhuǎn)換,我們還可以使用點(diǎn)積所代表的共線程度colinear amount)來描述坐標(biāo)轉(zhuǎn)換(AndréLaMothe的《Tricks Of The 3D Game Programming Gurus》)。這個(gè)理論基于點(diǎn)積的幾何意義:一個(gè)向量在另一個(gè)向量上的共線程度。比如兩個(gè)向量vs點(diǎn)積

             

             

            幾何意義就是vs方向上的投影長(zhǎng)和s的長(zhǎng)的乘積,或者是sv方向上的投影長(zhǎng)和v的長(zhǎng)的乘積(積的符號(hào)為:若vs的角度小于90度,積為正,如果是直角,積為零,否則為負(fù))。

             

            進(jìn)一步地,如果v是一個(gè)單位向量,則這個(gè)點(diǎn)積可以解釋為sv方向上的投影長(zhǎng);如果s是一個(gè)單位向量,則可以解釋為vs方向上的投影長(zhǎng)。現(xiàn)在,我們把點(diǎn)積推廣到基的層次上,把一個(gè)向量v’和一個(gè)基R的三個(gè)單位軸向量進(jìn)行點(diǎn)積,點(diǎn)積得到的三個(gè)值則表示這個(gè)向量在這個(gè)基下的坐標(biāo)v’’

             

             

            數(shù)學(xué)表達(dá)為

             

             

            請(qǐng)注意,為了讓v’能夠和基的每一個(gè)軸向量進(jìn)行點(diǎn)積,我們必須把基寫成轉(zhuǎn)置形式,即行向量乘法,否則就變成了線性組合的形式。這個(gè)公式的意義就是世界空間中的向量v’和基R的軸向量進(jìn)行點(diǎn)積從而得到v’R下的共線程度——坐標(biāo)v’’。這個(gè)公式和上面我們得到的坐標(biāo)轉(zhuǎn)換公式一模一樣。實(shí)際上我們是從兩個(gè)不同的方向解釋同一個(gè)公式,希望你能夠把兩個(gè)方向都理解。

            UVN系統(tǒng)

            UVN系統(tǒng)本身是一個(gè)基。如下圖所示,三個(gè)基向量UVN分別指向相機(jī)的右方、上方和后方從而構(gòu)成右手坐標(biāo)系,相機(jī)則處于坐標(biāo)原點(diǎn)。

             

             

            使用UVN系統(tǒng)可以非常方便的設(shè)置相機(jī)朝向。它的構(gòu)建過程如下如所示

             

            在參考系下(這里是世界坐標(biāo)系),我們給定相機(jī)的位置——eye,被觀察的小人的位置——lookat,以及一個(gè)輔助向量——參考系中表示“上方”的向量up,這個(gè)向量會(huì)影響UV的生成,因?yàn)橐院笄蟪龅?/span>V向量會(huì)在upN向量所決定的平面上(有興趣可以自己證明一下),所以可以通過這個(gè)向量讓相機(jī)產(chǎn)生不同的偏轉(zhuǎn)。

             

             

            首先我們求出向量N

             

             

            很簡(jiǎn)單,用目標(biāo)位置減去相機(jī)的位置,就是圖中的步驟2。第3步,我們求出向量U。這一步需要使用輔助向量up,如果不希望相機(jī)產(chǎn)生偏轉(zhuǎn),一般取(0, 1, 0)

             

             

             

            U使用向量的叉乘實(shí)現(xiàn),就是圖中的步驟3。最后,使用NU計(jì)算出向量V

             

             

            最后將計(jì)算出的UVN進(jìn)行單位化,就得到了相機(jī)的UVN系統(tǒng)。結(jié)合上面我們談到的坐標(biāo)轉(zhuǎn)換理論,我們可以把UVN系統(tǒng)看作是相機(jī)的基,從而可以方便的把一個(gè)向量在世界坐標(biāo)和相機(jī)坐標(biāo)進(jìn)行轉(zhuǎn)換。

            OpenGLgluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz)方法就是使用的上面的步驟進(jìn)行相機(jī)矩陣的設(shè)置。它的前三個(gè)參數(shù)就是相機(jī)的位置向量,中間三個(gè)參數(shù)是所觀察的目標(biāo)位置向量,最后三個(gè)參數(shù)就是輔助向量up

            相機(jī)矩陣的推導(dǎo)

            上面我們已經(jīng)說明了UVN系統(tǒng),標(biāo)準(zhǔn)流水線中就是使用了UVN系統(tǒng)來描述相機(jī)。U, V, N分別對(duì)應(yīng)相機(jī)坐標(biāo)系的三個(gè)基向量。

            此外,對(duì)于一個(gè)相機(jī)來說,它在開始的時(shí)候和世界坐標(biāo)系是重合的,用戶控制相機(jī)在世界空間中移動(dòng)之后,相機(jī)的狀態(tài)可以用兩個(gè)屬性來描述——朝向和位置。也就是說,有了這兩個(gè)屬性,一個(gè)相機(jī)模型在世界中的狀態(tài)就確定了。而這兩個(gè)屬性,我們用變換的理論來描述,就是旋轉(zhuǎn)和平移。可以想象,對(duì)于世界中的任何一個(gè)相機(jī)狀態(tài),我們都可以把它看成是:相機(jī)先圍繞自身基原點(diǎn)旋轉(zhuǎn)一定的角度,然后平移到世界空間的某個(gè)地方。下圖展示了這個(gè)過程

             

             

             

            圖中,紅色是相機(jī)的基,而黑色是世界的基,也就是參考系。小人是世界中的一個(gè)物體。相機(jī)在移動(dòng)之前,兩個(gè)基是重合的。當(dāng)相機(jī)在屏幕中定位時(shí),它首先會(huì)進(jìn)行朝向的確定——旋轉(zhuǎn),然后進(jìn)行位置的確定——平移。圖中的RotationTranslation兩步就是相機(jī)定位時(shí)所發(fā)生的變換。可以看到相機(jī)相對(duì)于小人的運(yùn)動(dòng)。而當(dāng)進(jìn)行相機(jī)變換的時(shí)候,小人應(yīng)該從世界基變換到相機(jī)的基里面。這樣,他應(yīng)該進(jìn)行一個(gè)相機(jī)定位的逆定位,先逆平移小人和相機(jī),然后再逆旋轉(zhuǎn)小人和相機(jī),最后相機(jī)歸位,小人隨相機(jī)變到了相機(jī)空間。這是由Inverse TranslationInverse Rotation兩個(gè)步驟完成的,這兩個(gè)步驟就是相機(jī)變換。現(xiàn)在我們推導(dǎo)這個(gè)變換。我們把關(guān)系寫出來,相機(jī)本身的變換C包括兩個(gè)元素

             

            其中T是平移變換,R是旋轉(zhuǎn)變換。而相機(jī)變換是相機(jī)本身變換的逆變換

             

             

            這個(gè)C^-1就是我們要求出的相機(jī)變換。其中T^-1很容易求出,即

             

             

            R^-1就沒有這么容易求出來了。所以,我們不求它,我們用UVN系統(tǒng)。什么意思?請(qǐng)看上面的那張相機(jī)變換的圖,當(dāng)相機(jī)變換進(jìn)行完Inverse Translation這一步之后,相機(jī)的原點(diǎn)和世界原點(diǎn)就重合了,也就是處理完了關(guān)于平移的變換。接下來我們要做的是逆旋轉(zhuǎn),而其實(shí)逆旋轉(zhuǎn)的目的,就是要得到目前世界坐標(biāo)中經(jīng)過逆平移的小人在相機(jī)坐標(biāo)系中的坐標(biāo)。是不是似曾相識(shí)?我們的坐標(biāo)變換理論就派上用場(chǎng)了。我們回憶上面坐標(biāo)變換的公式

             

             

            這個(gè)坐標(biāo)轉(zhuǎn)換公式可以解釋為:對(duì)于世界坐標(biāo)系中的向量v’,它在坐標(biāo)系R中的坐標(biāo)是v’’。那么,我們可以套用在這里:對(duì)于世界坐標(biāo)中的已經(jīng)經(jīng)過逆平移的坐標(biāo)v’,它在相機(jī)坐標(biāo)系R中的坐標(biāo)是v’’。什么是相機(jī)坐標(biāo)系R?就是我們的相機(jī)UVN系統(tǒng)!就是

             

             

            則相機(jī)變換的完整公式就是

             

             

            這里,v是小人在世界空間中的坐標(biāo),v’’是小人在相機(jī)空間中的坐標(biāo)。則相機(jī)變換矩陣就是

             

            至此,我們就完成了相機(jī)矩陣的推導(dǎo)。物體經(jīng)過這個(gè)矩陣就從世界空間變換到了相機(jī)空間,等待流水線對(duì)它進(jìn)行投影變換。OpenGL就使用了上面推導(dǎo)出的最后的那個(gè)矩陣。希望你能夠理解這個(gè)推導(dǎo)過程,如果你有什么問題或者不同的看法,請(qǐng)一定給我發(fā)信J下次見!

            posted on 2011-07-31 10:02 風(fēng)輕云淡 閱讀(1112) 評(píng)論(1)  編輯 收藏 引用 所屬分類: DX

            FeedBack:
            # re: 推導(dǎo)相機(jī)變換矩陣(轉(zhuǎn)) 2012-01-12 16:57 liuxiao
            C-1怎么變成了4階的矩陣,這跟v是不能相乘的呀  回復(fù)  更多評(píng)論
              
            91精品国产9l久久久久| 欧美久久一级内射wwwwww.| 狠狠色丁香婷婷综合久久来| 韩国三级大全久久网站| 久久久久久极精品久久久| 亚洲精品成人久久久| 久久精品国产亚洲AV高清热| 激情久久久久久久久久| 亚洲综合伊人久久综合| 国产精品成人99久久久久91gav| 久久精品国产免费观看| 国产亚洲美女精品久久久| 久久水蜜桃亚洲av无码精品麻豆 | 精品久久综合1区2区3区激情 | 久久国产乱子伦免费精品| 精品国产综合区久久久久久| 久久综合噜噜激激的五月天| 久久久国产精品| 精品999久久久久久中文字幕| 久久亚洲日韩看片无码| 久久久精品国产亚洲成人满18免费网站 | 香港aa三级久久三级| 亚洲综合久久夜AV | 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 97r久久精品国产99国产精| 日韩美女18网站久久精品| 久久精品国产亚洲av水果派 | 久久久久亚洲AV无码去区首| www.久久热| 激情伊人五月天久久综合| 久久精品国产2020| 精品久久久久久久国产潘金莲 | 久久丝袜精品中文字幕| 久久精品成人国产午夜| 国内精品久久九九国产精品| 精品综合久久久久久888蜜芽| 色综合久久久久无码专区| 亚洲国产精品无码久久SM| 亚洲乱码中文字幕久久孕妇黑人| 国产激情久久久久久熟女老人| 久久亚洲精品无码aⅴ大香|