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

            天行健 君子當(dāng)自強(qiáng)而不息

            3D中的方位和角位移(7)

            新建網(wǎng)頁 1

             

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

            為了將角位移從四元數(shù)轉(zhuǎn)換到矩陣形式,可以利用旋轉(zhuǎn)矩陣,它能計(jì)算繞任意軸的旋轉(zhuǎn):

            這個(gè)矩陣是用n和θ表示的,但四元數(shù)的分量是:

            w = cos(θ/2)

            x = nx sin(θ/2)

            y = ny sin(θ/2)

            z = nz sin(θ/2)

            讓我們看看能否將矩陣變形以代入wxyz,矩陣的9個(gè)元素都必須這樣做。幸運(yùn)的是,這個(gè)矩陣的結(jié)構(gòu)非常好,一旦解出對(duì)角線上的一個(gè)元素,其他元素就能用同樣的方法求出。同樣,非對(duì)角線元素之間也是彼此類似的。

            考慮矩陣對(duì)角線上的元素,我們將完整地解出m11m22m33解法與之類似:

            m11 = nx2(1 - cosθ) + cosθ

            我們將從上式的變形開始,變形方法看起來像是在繞圈子,但你馬上就能理解這樣做的目的:

            現(xiàn)在需要消去cosθ項(xiàng),而代之以包含cosθ/2sinθ/2的項(xiàng),因?yàn)樗脑獢?shù)的元素都是用它們表示的,像以前那樣,設(shè)α=θ/2,先用α寫出cos的倍角公式,再代入θ:

            上式是正確的,但它和其他的標(biāo)準(zhǔn)形式不同,即:

            m11 = 1 - 2y2 - 2z2

            實(shí)際上,還有其他的形式存在。最著名的一個(gè)形式是m11 = w2 + x2 - y2- z2因?yàn)?/span>w2 + x2 + y2 + z2 = 1,所以這三種形式是等價(jià)的。現(xiàn)在回過頭來看看能不能直接導(dǎo)出其他標(biāo)準(zhǔn)形式,第一步,n是單位向量,nx2+ny2 + nz2 = 1,則1 - nx2 = ny2 + nz2

            m11 = 1 - (1 - nx2)(2sin2(θ/2))

                   = 1 - (ny2 +nz2)(2sin2(θ/2))

                   = 1 - 2ny2sin2(θ/2) - 2nz2sin2(θ/2)

                   = 1 - 2y2 - 2z2

            元素m22m33可以用同樣的方法求得。

            讓我們來看看非對(duì)角線元素,它們比對(duì)角線元素簡(jiǎn)單一些,以m12為例子:

            m12 = nxny(1 - cosθ) + nzsinθ

            其他非對(duì)角線元素可用同樣的方法導(dǎo)出。

            最后,給出從四元素構(gòu)造的完整旋轉(zhuǎn)矩陣,如公式10.23所示:

             

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

            為了從旋轉(zhuǎn)矩陣中抽出相應(yīng)的四元數(shù),可以直接利用公式 10.23,檢查對(duì)角線元素的和(也稱作矩陣的軌跡)得到:

            通過使軌跡中三個(gè)元素中的兩個(gè)為負(fù),可以用類似的方法求得其他三個(gè)元素:

            不幸的是,這種方法并不總是能正確工作,因?yàn)槠椒礁慕Y(jié)果總是正值。(更加準(zhǔn)確地說,沒有選擇正根還是負(fù)根的依據(jù)。)但是,q-q代表相同的方位,我們能任意選擇用非負(fù)根作為4個(gè)分量中的一個(gè)并仍能得到正確的四元數(shù),只是不能對(duì)四元數(shù)的所有4個(gè)數(shù)都用這種方法。

            另一個(gè)技巧是檢查相對(duì)于對(duì)角線的對(duì)稱位置上元素的和與差:

            那么應(yīng)選用四種方法中的哪個(gè)呢?似乎最簡(jiǎn)單的策略是總是先計(jì)算同一個(gè)分量,如w,然后再計(jì)算xyz。這伴隨著問題,如果w=0,除法就沒有定義;如果w非常小,將會(huì)出現(xiàn)數(shù)值不穩(wěn)定。Shoemake建議先判斷wxyz中哪個(gè)最大(不用做平方根運(yùn)算),根據(jù)上面的表,用矩陣對(duì)角線計(jì)算該元素,再用它計(jì)算其他三個(gè)。

            下面的代碼用一種非常直接的方式實(shí)現(xiàn)了這個(gè)方法。

                        Listing 10.4: Converting a rotation matrix to a quaternion
               
               
            // Input matrix:
               
            float m11,m12,m13;
               
            float m21,m22,m23;
               
            float m31,m32,m33;
               
               
            // Output quaternion
               
            float w,x,y,z;
               
               
                // Determine which of w, x, y, or z has the largest absolute value
               
            float fourWSquaredMinus1 = m11 + m22 + m33;
               
            float fourXSquaredMinus1 = m11 – m22 – m33;
               
            float fourYSquaredMinus1 = m22 – m11 – m33;
               
            float fourZSquaredMinus1 = m33 – m11 – m22;
               
               
            int biggestIndex = 0;
               
               
            float fourBiggestSquaredMinus1 = fourWSquaredMinus1;
               
               
            if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) {
                  fourBiggestSquaredMinus1 = fourXSquaredMinus1;
                  biggestIndex = 1;
                }
               
               
            if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) {
                  fourBiggestSquaredMinus1 = fourYSquaredMinus1;
                  biggestIndex = 2;
                }
               
               
            if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) {
                  fourBiggestSquaredMinus1 = fourZSquaredMinus1;
                  biggestIndex = 3;
                }
               
               
                // Perform square root and division
               
            float biggestVal = sqrt(fourBiggestSquaredMinus1 + 1.0f) * 0.5f;
               
            float mult = 0.25f / biggestVal;
               
               
                // Apply table to compute quaternion values
               
            switch (biggestIndex) {
               
            case 0:
                  w = biggestVal;
                  x = (m23 – m32) * mult;
                  y = (m31 – m13) * mult;
                  z = (m12 – m21) * mult;
                  
            break;
               
               
            case 1:
                  x = biggestVal;
                  w = (m23 – m32) * mult;
                  y = (m12 + m21) * mult;
                  z = (m31 + m13) * mult;
                  
            break;
               
               
            case 2:
                  y = biggestVal;
                  w = (m31 – m13) * mult;
                  x = (m12 + m21) * mult;
                  z = (m23 + m32) * mult;
                  
            break;
               
               
            case 3:
                  z = biggestVal;
                  w = (m12 – m21) * mult;
                  x = (m31 + m13) * mult;
                  y = (m23 + m32) * mult;
                  
            break;
                }

            posted on 2008-02-16 11:23 lovedday 閱讀(739) 評(píng)論(0)  編輯 收藏 引用


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            99久久国产综合精品五月天喷水| 一级女性全黄久久生活片免费| 久久亚洲精品无码AV红樱桃| 亚洲午夜久久久久久久久电影网| 亚洲日本va中文字幕久久| 性欧美大战久久久久久久久| 国产亚洲美女精品久久久久狼| 久久久不卡国产精品一区二区| 中文字幕无码av激情不卡久久| 奇米综合四色77777久久| 久久99国产精品一区二区| 欧美一级久久久久久久大片| 中文字幕热久久久久久久| 久久九九亚洲精品| 久久久久人妻一区二区三区 | 久久综合亚洲鲁鲁五月天| 亚洲av成人无码久久精品| 久久www免费人成精品香蕉| 亚洲va中文字幕无码久久| 久久婷婷五月综合97色直播| 国产午夜免费高清久久影院| 欧美与黑人午夜性猛交久久久| 久久精品国产99国产精偷| 久久精品成人欧美大片| 久久精品国产99久久香蕉| 久久国产精品99国产精| 久久久黄色大片| 一本久久a久久精品综合香蕉| 久久久久久A亚洲欧洲AV冫 | 亚洲综合婷婷久久| 久久综合综合久久综合| 国产99久久久国产精品小说| 内射无码专区久久亚洲| 久久久久国产视频电影| 久久996热精品xxxx| 很黄很污的网站久久mimi色 | 99久久国产综合精品麻豆| 99久久国产亚洲综合精品| 欧洲性大片xxxxx久久久| 国产巨作麻豆欧美亚洲综合久久| www性久久久com|