• <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>
            posts - 4, comments - 12, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                    上次說到渲染管線的一般組成,接下來就要說說各部分的轉(zhuǎn)換怎么做了。
                 
                    在這之前,本著掃盲的態(tài)度,先介紹一點矩陣的基礎(chǔ)知識。

                    大學(xué)一年級一般都會上一門叫做“線性代數(shù)”的課,這個課上就會講很多關(guān)于線性方程組(可以先不管“線性”兩個字,初等數(shù)學(xué)里的東西基本都是線性的),關(guān)于矩陣的東西。
                    首先,什么是線性方程組?
                    ax + by + c = 0                                                                            a  b  c
                    dx + ey + f  = 0            這個就是一個線性方程組,                d  e  f
                    gx + hy + i  = 0             我們可以把它表示成矩陣                   g  h   i

                    再來,什么是向量?一個1 x N 的矩陣,就是一個向量,例如
                    a
                    b       一般可以記成(a,b,c)
                    c

                    線性代數(shù)對矩陣定義了一系列的運算方法,比如乘法,加法等。具體的定義最好找本線性代數(shù)來看看,另外推薦一個《理解矩陣》,是個短小精悍的文章,對于理解矩陣,坐標(biāo)系,向量比較有好處。
                    
                    現(xiàn)在就先說明幾個問題。
                    1、一個N維向量,可以表示一個N維空間的點。比如說(1,2)在平面直角坐標(biāo)系表示x=1,y=2的點
                    2、可以同時存在多個坐標(biāo)系。例如,有兩個坐標(biāo)系,重疊在一起,但是坐標(biāo)系A(chǔ)的單位長度是坐標(biāo)系B單位長度的2倍。那么在A坐標(biāo)系中的 (1,0)點,在B坐標(biāo)系中就是 (2,0)點
                    3、坐標(biāo)系原點位置可以不同。比如,坐標(biāo)系A(chǔ)原點在坐標(biāo)系B的 (1,1)處,那么坐標(biāo)系A(chǔ)的(1,0)點就是坐標(biāo)系B的(2,1)點。
                    4、坐標(biāo)系可以表示成矩陣。 比如   2  0   就表示一個x軸縮小一半的坐標(biāo)系。這個坐標(biāo)系實際上是由
                                                                                   0  1

            兩個向量 2   和  0  放在一起組成的,沒錯,也就是坐標(biāo)軸的單位向量值的倒數(shù)組成了坐標(biāo)系。所以很顯
                              0         1                                                                                                                                             
            然,1  0就是一個我們平常使用的坐標(biāo)系。至于另外那兩個數(shù)要是不為0會發(fā)生什么情況,可以自己想
                    0  1
            想,我后面也會解釋。
                    5、三維空間的坐標(biāo)系可以表示成3x3矩陣。(這個不用解釋了吧)
                    6、坐標(biāo)系矩陣與對應(yīng)維數(shù)的向量相乘,將得到該向量在這個坐標(biāo)系下的表示。這個是最關(guān)鍵的一個點,能理解,后面就都好辦了。一個向量 (2,2,2) ,一個矩陣(坐標(biāo)系)2  0  0  ,用矩陣乘以這個向量,
                                                                                                                                          0  2  0
                                                                                                                                          0  0  2
            根據(jù)矩陣乘法,我們將得到向量(4,4,4) 。關(guān)于這一點,大家可以看看《理解矩陣》,它的描述比我說得更透徹,其實矩陣還表達了一種映射關(guān)系,或者表達了一種變換。
                    7、坐標(biāo)系矩陣還可以擴展,用來表示坐標(biāo)系原點的位置。這種擴展的坐標(biāo)系矩陣看起來就像這個樣子1  0  0  1   這是就是所謂的“三維空間的齊次坐標(biāo)系”。為什么叫“齊次”,我還沒理解透,以后理解
                0  1  0  1
                0  0  1  0
                0  0  0  1
            了再補上。這個矩陣描述的坐標(biāo)系是這樣的: 坐標(biāo)系的x,y,z軸的單位向量都與我們最常見的那種坐標(biāo)系一樣,原點在(-1,-1,0)處。也就是,最右邊一列多出來的,就是表達原點位置的向量。那么這個矩陣怎么做乘法呢,因為根據(jù)矩陣乘法,這個矩陣需要乘以一個4維向量。假設(shè)有一個點(1,1,1),那么我們就在這個向量后面再增加一個數(shù),變成 (1,1,1,1),然后就可以去乘這個矩陣了(關(guān)于這個硬加上的數(shù),見下一點)。
                    8、上面說到齊次坐標(biāo)系,還說到了一個三維向量增加一維變成4維,那么這個第四維是什么含義呢?當(dāng)一個向量表達齊次坐標(biāo)時,它的最后一維有特殊的含義。一個4維向量V (a,b,c,h),當(dāng)h = 0 時,V表示一個三維空間中的向量。當(dāng)h 不為 0 時,V表示一個三維空間中的點。這個點的坐標(biāo)是 (a/h,b/h,c/h)。在進行矩陣運算時,第四維正常的參與運算,我們可以得到簡單的推論:
                    向量加向量得到向量。 向量得到點。 點加點得到中點。
                    在此補充一點,在空間中,“點”和“向量”其實是不同的概念,向量有方向,但沒位置,點有位置但沒方向。所以在齊次坐標(biāo)系矩陣中,第四列第四行是1,因為原點是一個點,不是向量。
                    9、在計算機圖形學(xué)中,一般就是用矩陣來做各種物體的坐標(biāo)變換,方法很簡單,就是用一個矩陣去乘以表示坐標(biāo)的向量。
                    10、矩陣的表示方法還有一種,就是向量按行表示,線性方程組矩陣就是這樣。也就是一行表示一個向量。所以看其它資料的時候要注意一下。


                     說了一這么些數(shù)學(xué),估計也看煩了,那么就先講一個實例:世界坐標(biāo)變換。
                     世界坐標(biāo)變換是渲染管線生成世界模型時的必備操作。
                     比如說,我有一個正方體,頂點坐標(biāo)為(1,1,1),(1,1,-1),(1,-1,1),(1,-1,-1),(-1,1,1),(-1,1,-1),(-1,-1,1),(-1,-1,-1)。  然后我需要在這個世界模型中放置很多個正方體,怎么辦呢?總不能手工的去輸入那么多的坐標(biāo)吧。我只能對這個正方體作一些變換,比如:放大縮小,旋轉(zhuǎn),移動。通過這樣一些操作,我就可以把這個正方體放到任何地方了。那么現(xiàn)在簡單說怎么實現(xiàn)。

                    這個正方體,我們存儲的時候就存下8個點就夠了,這8個點都各自是一個4維齊次向量,可以用靜態(tài)數(shù)組來實現(xiàn)。然后構(gòu)造一個矩陣,依次乘以這8個點,那么一次變換就算做完了。
                    放大縮小,我們就構(gòu)造這樣的矩陣 2  0  0  0 ,這樣就把正方體放大一倍
                                                                                  0  2  0  0
                                                                                  0  0  2  0
                                                                                  0  0  0  1

                    旋轉(zhuǎn): 這個相對比較復(fù)雜一點,在這里的旋轉(zhuǎn)我們會說 繞x軸旋轉(zhuǎn) a 弧度(角度),相應(yīng)的矩陣為
            1   0       0    0
            0 cosa  sina  0
            0 -sina  cosa 0
            0   0       0    1
                    平移: 把正方體中心移動到(1,2,3),矩陣為 1  0  0  1
                                                                                                  0  1  0  2
                                                                                                  0  0  1  3
                                                                                                  0  0  0  1
                    
                    一般情況下我們應(yīng)該按照這樣的順序來做這三種變換:  縮放、旋轉(zhuǎn)、平移。  如果改變順序,那么轉(zhuǎn)換出來的效果也將不一樣,有興趣的可以自己計算一下。

                    暫時就這么多吧,下次繼續(xù)說~


            Feedback

            # re: 我的第一個3D渲染管線(2)[未登錄]  回復(fù)  更多評論   

            2009-03-12 11:53 by cppexplore
            頂下!

            # re: 我的第一個3D渲染管線(2)  回復(fù)  更多評論   

            2009-03-15 21:26 by Jymstart
            師兄在哪公司實習(xí)呢

            # re: 我的第一個3D渲染管線(2)  回復(fù)  更多評論   

            2009-03-16 00:29 by 林森(L.S.Winson)
            @Jymstart
            額。。你是哪位來著~?

            # re: 我的第一個3D渲染管線(2)  回復(fù)  更多評論   

            2009-07-02 17:12 by waterpg
            怎么不更新了啊~~

            # re: 我的第一個3D渲染管線(2)  回復(fù)  更多評論   

            2012-06-07 10:40 by 吼吼

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


            伊人久久大香线蕉无码麻豆| 色偷偷888欧美精品久久久| 亚洲午夜精品久久久久久app| 青草久久久国产线免观| 狠狠色婷婷久久一区二区| 国产成人精品白浆久久69| 久久精品人人槡人妻人人玩AV| 久久国产精品免费一区二区三区| 久久精品中文字幕一区| 亚洲国产精品成人AV无码久久综合影院| 亚洲日本va午夜中文字幕久久| 久久精品卫校国产小美女| 国产精品免费福利久久| 亚洲人成无码久久电影网站| 日本精品久久久久中文字幕| 亚洲综合精品香蕉久久网| 久久99亚洲综合精品首页| 久久精品a亚洲国产v高清不卡| 亚洲国产天堂久久综合| 91麻豆精品国产91久久久久久| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 91久久精品国产91性色也| 久久中文字幕人妻熟av女| 国产精品狼人久久久久影院| 无码日韩人妻精品久久蜜桃 | 久久久国产精华液| 精品国产乱码久久久久久浪潮| 国内精品久久久久影院优| 欧美日韩精品久久久久| 伊人久久大香线蕉成人| 久久亚洲视频| 无码8090精品久久一区| 亚洲国产一成久久精品国产成人综合 | AAA级久久久精品无码区| 色欲久久久天天天综合网| 伊人久久大香线蕉AV色婷婷色| 久久亚洲中文字幕精品一区| 国内精品伊人久久久久网站| 国产99久久久久久免费看| 99久久伊人精品综合观看| 久久久久亚洲av毛片大|