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

            孔雀開發(fā)小屋

            專注并致力于手機(jī)客戶端開發(fā)
            <2011年7月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計(jì)

            • 隨筆 - 103
            • 文章 - 0
            • 評(píng)論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類

            隨筆檔案

            關(guān)注的博客

            朋友的博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            四元數(shù)概念及其應(yīng)用
            學(xué)習(xí)3D編程,四元數(shù)是不得不學(xué)的。其概念的引入和定義都比較抽象,今學(xué)了,總結(jié)歸納如下:

            介紹四元數(shù)之前,先做如下約定:

            1.采用右手坐標(biāo)系(OpenGL)

            2.旋轉(zhuǎn)次序:x->y->z

            3.  矩陣是列優(yōu)先存儲(chǔ)


            1.
            什么是四元數(shù)?

            直接用數(shù)學(xué)上的定義來(lái)解釋,因?yàn)槲液茈y在現(xiàn)實(shí)生活中找到可以描述明白的例子。

             

            i, j, k 為虛數(shù)

            Q = w + xi + yj + zk

            其中w是實(shí)數(shù),而x,y,z為復(fù)數(shù)。

            另外一種常見的表達(dá)方式是:

            Q = [w, v]

            其中v=(x,y,z)稱為矢量部(雖然稱為矢量,但是這個(gè)不是三維空間中的矢量,而是四維空間的,想象吧L),w稱為標(biāo)量部。


            2.
            四元數(shù)可以做什么?

            有了四元數(shù)的概念還不行,四元數(shù)可以干什么?四元數(shù)可以用來(lái)描述方向。

            先來(lái)看下如何求取四元數(shù)的長(zhǎng)度:

            ||q|| = Norm(q) = sqrt(w2 + x2 + y2 + z2)

            單位長(zhǎng)度的四元數(shù)有以下屬性:

            w2 + x2 + y2 + z2 = 1

            所以我們使用如下方法來(lái)標(biāo)準(zhǔn)化(Normalize)一個(gè)四元數(shù):

            q = q / ||q|| = q / sqrt(w2 + x2 + y2 + z2)

             

            使用一個(gè)單位四元數(shù)來(lái)描述方向,請(qǐng)記住必須是單位四元數(shù)才可以描述方向。


            3.
            四元數(shù)的乘法

            因?yàn)橐粋€(gè)單位四元數(shù)可以代表一個(gè)三維空間中的方向,那么兩個(gè)四元數(shù)相乘得到的結(jié)果仍然是一個(gè)四元數(shù),這個(gè)四元素依舊可以標(biāo)識(shí)一個(gè)方向。

             

            給定兩個(gè)四元數(shù):

            Q1 = (w1, x1, y1, z1)

            Q2 = (w2, x2, y2, z2)

             

            Q1 * Q2 = (w1.w2 – v1.v2, w1.v2 + w2.v1 + v1 x v2)

            注意:.代表向量間的點(diǎn)積,x代表叉積。v1=(x1, y1, z1)  v2=(x2, y2, z2)

             

            優(yōu)化一下:

            w=w1w2 - x1x2 - y1y2 - z1z2
            x = w1x2 + x1w2 + y1z2 - z1y2
            y = w1y2 + y1w2 + z1x2 - x1z2
            z = w1z2 + z1w2 + x1y2 - y1x2

             

            4.四元數(shù)的轉(zhuǎn)換

                   為什么要轉(zhuǎn)換,因?yàn)槲覀冞€不能直接使用四元數(shù)來(lái)進(jìn)行3D物體的旋轉(zhuǎn)。在OpenGL中和Direct3D中都是通過(guò)矩陣來(lái)描述3D旋轉(zhuǎn)的。


            4.1 四元數(shù)到矩陣的轉(zhuǎn)換

             

            使用單位四元數(shù)轉(zhuǎn)換到矩陣:

            Matrix = [ 1 - 2y2 - 2z2   2xy - 2wz      2xz + 2wy
                         2xy + 2wz      1 - 2x2 - 2z2   2yz - 2wx
                         2xz - 2wy      2yz + 2wx      1 - 2x2 - 2y2 ]

             

            4.2 四元數(shù)到軸角的轉(zhuǎn)換

            軸角也是一種表達(dá)空間旋轉(zhuǎn)的方式。

            如果旋轉(zhuǎn)軸是:(ax, ay, az)

            旋轉(zhuǎn)角度是:angle (單位:弧度)

            那么四元數(shù)與軸角之間的轉(zhuǎn)換關(guān)系如下:

             

            angle = 2 * acos(w)

            ax = x / scale

            ay = y / scale

            az = y / scale

            其中scale = sqrt(x2 + y2 + z2)


              4.3
            軸角到四元數(shù)的轉(zhuǎn)換

            假設(shè)旋轉(zhuǎn)軸是(ax, ay, az),記得必須是一個(gè)單位向量。

            旋轉(zhuǎn)角度是theta. (單位:弧度)

            那么轉(zhuǎn)換如下:

            w = cos(theta / 2 )

            x = ax * sin(theta / 2)

            y = ay * sin(theta / 2)

            z = az * sin(theta / 2 )


              4.4
            歐拉角到四元數(shù)的轉(zhuǎn)換

            如果你的歐拉角為(a, b, c)那么就可以形成三個(gè)獨(dú)立的四元數(shù),如下:

             

            Qx = [ cos(a/2), (sin(a/2), 0, 0)]
            Qy = [ cos(b/2), (0, sin(b/2), 0)]
            Qz = [ cos(c/2), (0, 0, sin(c/2))]


            最終的四元數(shù)是Qx * Qy * Qz的乘積的結(jié)果。

             

             
            5.
            使用四元數(shù)來(lái)避免Gimbal Lock

             

            基本思路如下:

            1)  使用一個(gè)四元數(shù)來(lái)標(biāo)識(shí)一個(gè)方向

            2)  創(chuàng)建一個(gè)臨時(shí)的四元數(shù)來(lái)標(biāo)識(shí)當(dāng)前方向到新方向的變化

            3)  右乘臨時(shí)的四元數(shù)和初始四元數(shù),結(jié)果是一個(gè)合并了兩個(gè)四元數(shù)的新的四元數(shù)

            4)  將四元數(shù)轉(zhuǎn)換成矩陣


            6.
            更深入的學(xué)習(xí)四元數(shù)

            SLERP:球狀線性插值對(duì)于三位模型進(jìn)行動(dòng)畫處理非常有用,因?yàn)檫@種方式在模型的各種方向之間提供了平滑的轉(zhuǎn)換。



            posted on 2010-08-18 14:01 孔雀 閱讀(5791) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Graphics

            評(píng)論

            # re: 四元數(shù)概念及其應(yīng)用 2010-08-19 22:08 普派

            球狀線性插值對(duì)于三位模型進(jìn)行動(dòng)畫處理非常有用,因?yàn)檫@種方式在模型的各種方向之間提供了平滑的轉(zhuǎn)換。
            久久久国产精品福利免费 | 久久久久无码精品国产| 国色天香久久久久久久小说| 久久超碰97人人做人人爱| 伊人久久免费视频| 波多野结衣久久精品| 国产亚洲美女精品久久久久狼| 久久久综合香蕉尹人综合网| 亚洲中文精品久久久久久不卡| 国产高潮国产高潮久久久91 | 久久精品国产亚洲AV蜜臀色欲| 国产V亚洲V天堂无码久久久| 一本久久a久久精品综合香蕉 | 久久国产精品二国产精品| 色婷婷综合久久久中文字幕| 亚洲欧美精品一区久久中文字幕 | 高清免费久久午夜精品| 亚洲欧美一区二区三区久久| 91久久九九无码成人网站| 久久久久99精品成人片直播| 2019久久久高清456| 人妻少妇精品久久| A级毛片无码久久精品免费| 久久久久久午夜成人影院| 2021最新久久久视精品爱| 久久青青草原亚洲av无码| 草草久久久无码国产专区| 91久久精品91久久性色| 欧美黑人又粗又大久久久| 99久久夜色精品国产网站| 国产精品久久久久久久久久影院| 久久夜色撩人精品国产| 久久久久99精品成人片牛牛影视| 亚洲欧美精品伊人久久| 午夜不卡888久久| 中文字幕一区二区三区久久网站| 99久久久精品免费观看国产| 久久99精品久久久久久久久久| 久久人人妻人人爽人人爽| 亚洲国产另类久久久精品小说| 国产成人无码精品久久久性色|