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

            孔雀開發小屋

            專注并致力于手機客戶端開發
            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統計

            • 隨筆 - 103
            • 文章 - 0
            • 評論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類

            隨筆檔案

            關注的博客

            朋友的博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            四元數概念及其應用
            學習3D編程,四元數是不得不學的。其概念的引入和定義都比較抽象,今學了,總結歸納如下:

            介紹四元數之前,先做如下約定:

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

            2.旋轉次序:x->y->z

            3.  矩陣是列優先存儲


            1.
            什么是四元數?

            直接用數學上的定義來解釋,因為我很難在現實生活中找到可以描述明白的例子。

             

            i, j, k 為虛數

            Q = w + xi + yj + zk

            其中w是實數,而x,y,z為復數。

            另外一種常見的表達方式是:

            Q = [w, v]

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


            2.
            四元數可以做什么?

            有了四元數的概念還不行,四元數可以干什么?四元數可以用來描述方向。

            先來看下如何求取四元數的長度:

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

            單位長度的四元數有以下屬性:

            w2 + x2 + y2 + z2 = 1

            所以我們使用如下方法來標準化(Normalize)一個四元數:

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

             

            使用一個單位四元數來描述方向,請記住必須是單位四元數才可以描述方向。


            3.
            四元數的乘法

            因為一個單位四元數可以代表一個三維空間中的方向,那么兩個四元數相乘得到的結果仍然是一個四元數,這個四元素依舊可以標識一個方向。

             

            給定兩個四元數:

            Q1 = (w1, x1, y1, z1)

            Q2 = (w2, x2, y2, z2)

             

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

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

             

            優化一下:

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

             

            4.四元數的轉換

                   為什么要轉換,因為我們還不能直接使用四元數來進行3D物體的旋轉。在OpenGL中和Direct3D中都是通過矩陣來描述3D旋轉的。


            4.1 四元數到矩陣的轉換

             

            使用單位四元數轉換到矩陣:

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

             

            4.2 四元數到軸角的轉換

            軸角也是一種表達空間旋轉的方式。

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

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

            那么四元數與軸角之間的轉換關系如下:

             

            angle = 2 * acos(w)

            ax = x / scale

            ay = y / scale

            az = y / scale

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


              4.3
            軸角到四元數的轉換

            假設旋轉軸是(ax, ay, az),記得必須是一個單位向量。

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

            那么轉換如下:

            w = cos(theta / 2 )

            x = ax * sin(theta / 2)

            y = ay * sin(theta / 2)

            z = az * sin(theta / 2 )


              4.4
            歐拉角到四元數的轉換

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

             

            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))]


            最終的四元數是Qx * Qy * Qz的乘積的結果。

             

             
            5.
            使用四元數來避免Gimbal Lock

             

            基本思路如下:

            1)  使用一個四元數來標識一個方向

            2)  創建一個臨時的四元數來標識當前方向到新方向的變化

            3)  右乘臨時的四元數和初始四元數,結果是一個合并了兩個四元數的新的四元數

            4)  將四元數轉換成矩陣


            6.
            更深入的學習四元數

            SLERP:球狀線性插值對于三位模型進行動畫處理非常有用,因為這種方式在模型的各種方向之間提供了平滑的轉換。



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

            評論

            # re: 四元數概念及其應用 2010-08-19 22:08 普派

            球狀線性插值對于三位模型進行動畫處理非常有用,因為這種方式在模型的各種方向之間提供了平滑的轉換。
              回復  更多評論    
            久久久久久免费一区二区三区 | 99久久国产热无码精品免费久久久久 | 99久久er这里只有精品18| 久久精品亚洲日本波多野结衣| 99精品久久久久中文字幕| 久久综合久久综合久久综合| 精品水蜜桃久久久久久久| 亚洲日本久久久午夜精品| 91精品国产综合久久婷婷| 精品无码人妻久久久久久 | 日本WV一本一道久久香蕉| 色综合久久久久综合体桃花网 | 欧美精品福利视频一区二区三区久久久精品 | 久久久久亚洲av综合波多野结衣| 久久天堂AV综合合色蜜桃网| 亚洲国产精品久久久久婷婷老年| 欧美一级久久久久久久大片| 久久狠狠爱亚洲综合影院| 日日噜噜夜夜狠狠久久丁香五月| 夜夜亚洲天天久久| 欧美亚洲国产精品久久久久| 夜夜亚洲天天久久| 久久亚洲国产成人精品性色| 欧美性大战久久久久久| 99热成人精品免费久久| 成人妇女免费播放久久久| 精品久久久久久久国产潘金莲| 国产伊人久久| 久久国产精品久久精品国产| 精品熟女少妇a∨免费久久| 亚洲欧美久久久久9999| 久久久国产精品| 品成人欧美大片久久国产欧美| www.久久99| 99久久成人国产精品免费| 97精品依人久久久大香线蕉97 | 久久亚洲AV成人出白浆无码国产| 少妇被又大又粗又爽毛片久久黑人| 99久久伊人精品综合观看| 成人午夜精品久久久久久久小说| 97久久精品人人做人人爽|