• <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中的方位和角位移(6)

            新建網(wǎng)頁(yè) 1

             

            四元數(shù)樣條 ---- “squad”

            Slerp提供了兩個(gè)方位間的插值,當(dāng)有多于兩個(gè)的方位序列(它描述了我們想要經(jīng)過(guò)的插值“路徑)時(shí)怎么辦?我們可以在”控制點(diǎn)“之間使用slerp。類似于基本幾何學(xué)中的線性插值,控制點(diǎn)之間是以直線連接的。顯然,控制點(diǎn)上會(huì)有不連續(xù)性 ---- 這是我們想要避免的,我們給出squad(Spherical and Quadrangle)的公式,用來(lái)描繪控制點(diǎn)間的路徑。

            設(shè)控制點(diǎn)由四元數(shù)序列所定義:

            q1,q2,q3,qn-2qn-1,qn

            另外,引進(jìn)一個(gè)輔助四元數(shù)si,將它作為臨時(shí)控制點(diǎn):

            注意,qi-1qi+1計(jì)算出si,所以s1sn是未定義的。換句話說(shuō),曲線從q2延伸到qn-1,第一個(gè)和最后一個(gè)控制點(diǎn)僅用于控制中間的曲線。如果曲線一定要經(jīng)過(guò)這兩點(diǎn),必須在頭部和尾部增加虛控制點(diǎn),一個(gè)顯而易見(jiàn)的方法就是復(fù)制這兩個(gè)控制點(diǎn)。

            給定四個(gè)相鄰的控制點(diǎn),squad用于計(jì)算中間兩點(diǎn)間的插值,這點(diǎn)非常像三次樣條。

            設(shè)四個(gè)控制點(diǎn)為: qi-1,qi,qi+1,qi+2

            還要引入一個(gè)插值變量h,h0變化到1時(shí),squad描繪qiqi+1之間的曲線。

            整條插值曲線能夠分段應(yīng)用squad方法來(lái)獲得,如公式10.12所示:

             

            四元數(shù)的優(yōu)點(diǎn)和缺點(diǎn)

            四元數(shù)有一些其他角位移表示方法所沒(méi)有的優(yōu)點(diǎn):

            (1)平滑插值。slerpsquad提供了方位間的平滑插值,沒(méi)有其他方法能提供平滑插值。

            (2)快速連接和角位移求逆。四元數(shù)叉乘能將角位移序列轉(zhuǎn)換為單個(gè)角位移,用矩陣作同樣的操作明顯會(huì)慢一些。四元數(shù)共軛提供了一種有效計(jì)算反角位移的方法,通過(guò)轉(zhuǎn)置旋轉(zhuǎn)矩陣也能達(dá)到同樣的目的,但不如四元數(shù)來(lái)得容易。

            (3)能和矩陣形式快速轉(zhuǎn)換。四元數(shù)和矩陣間的轉(zhuǎn)換比歐拉角與矩陣之間的轉(zhuǎn)換稍微快一點(diǎn)。

            (4)僅用四個(gè)數(shù)。四元數(shù)僅包含4個(gè)數(shù),而矩陣用了9個(gè)數(shù),它比矩陣"經(jīng)濟(jì)"得多(當(dāng)然仍然比歐拉角多33%)。


            要獲得這些優(yōu)點(diǎn)是要付出代價(jià)的,四元數(shù)也有和矩陣相似的問(wèn)題,只不過(guò)問(wèn)題程度較輕:

            (1)比歐拉角稍微大一些。這個(gè)額外的數(shù)似乎沒(méi)有太大關(guān)系,但在需要保存大量角位移時(shí),如存儲(chǔ)動(dòng)畫(huà)數(shù)據(jù),這額外的33%也是數(shù)量可觀的。

            (2)四元數(shù)可能不合法。壞的輸入數(shù)據(jù)或浮點(diǎn)數(shù)舍入誤差積累都可能使四元數(shù)不合法(能通過(guò)四元數(shù)標(biāo)準(zhǔn)化解決這個(gè)問(wèn)題,確保四元數(shù)為單位大小)。

            (3)難于使用。在所有三種形式中,四元數(shù)是最難于直接使用的。

             

            各方法比較

             

            不同的方位表示方法適用于不同的情況,下面是我們對(duì)合理選擇格式的一些建議:

            (1)歐拉角最容易使用。當(dāng)需要為世界中的物體指定方位時(shí),歐拉角能大大簡(jiǎn)化人機(jī)交互,包括直接的鍵盤輸入方位、在代碼中指定方位(如為渲染設(shè)定攝像機(jī))、在調(diào)試中測(cè)試。這個(gè)優(yōu)點(diǎn)不應(yīng)被忽視,不要以優(yōu)化為名義而犧牲易用性,除非你確定這種優(yōu)化的確有效果。

            (2)如果需要在坐標(biāo)系間轉(zhuǎn)換向量,那么就選擇矩陣形式。當(dāng)然,這并不意味著你就不能用其他格式來(lái)保存方位,并在需要的時(shí)候轉(zhuǎn)換到矩陣形式。另一種方法是用歐拉角作為方位的主拷貝,但同時(shí)維護(hù)一個(gè)旋轉(zhuǎn)矩陣,當(dāng)歐拉角發(fā)生改變時(shí)矩陣也要同時(shí)進(jìn)行更新。

            (3)當(dāng)需要大量保存方位數(shù)據(jù)(如動(dòng)畫(huà))時(shí),就使用歐拉角或四元數(shù)。歐拉角將少占用25%的內(nèi)存,但它在轉(zhuǎn)換到矩陣時(shí)要稍微慢一些。如果動(dòng)畫(huà)數(shù)據(jù)需要嵌套坐標(biāo)系之間的連接,四元數(shù)可能是最好的選擇。

            (4)平滑的插值只能用四元數(shù)完成。如果你用其他格式,也可以先轉(zhuǎn)換到四元數(shù)然后再插值,插值完畢后再轉(zhuǎn)換回原來(lái)的形式。

             

             

            從歐拉角轉(zhuǎn)換到矩陣

            歐拉角描述了一個(gè)旋轉(zhuǎn)序列。分別計(jì)算出每個(gè)旋轉(zhuǎn)的矩陣再將它們連接成一個(gè)矩陣,這個(gè)矩陣就代表了整個(gè)角位移。當(dāng)然,它和我們是想要物體到慣性坐標(biāo)的變換矩陣還是慣性到物體坐標(biāo)的變換矩陣是相關(guān)的。

            我們對(duì)歐拉角的定義是一個(gè)旋轉(zhuǎn)序列,該旋轉(zhuǎn)序列將物體(和它的坐標(biāo)空間)從慣性坐標(biāo)空間轉(zhuǎn)換到物體坐標(biāo)空間。因此,可以用歐拉角定義的直接轉(zhuǎn)換來(lái)直接產(chǎn)生慣性 ---- 物體旋轉(zhuǎn)矩陣的一般形式:

            M慣性 --> 物體 = HPB

            H、P、B分別為headingpitchbank的旋轉(zhuǎn)矩陣,它們分別繞y、x、z軸旋轉(zhuǎn),僅僅旋轉(zhuǎn)"坐標(biāo)空間"就是旋轉(zhuǎn)"點(diǎn)"的嚴(yán)格相反操作??梢韵胂筮@些旋轉(zhuǎn)發(fā)生時(shí)點(diǎn)是固定在空間中不變的,例如,pitch使坐標(biāo)空間向下,點(diǎn)實(shí)際上關(guān)于坐標(biāo)空間向上。歐拉角公式明確指明是物體和它的坐標(biāo)空間旋轉(zhuǎn),但我們需要的是變換"點(diǎn)"的矩陣,所以計(jì)算矩陣H、PB時(shí),用相反的旋轉(zhuǎn)量來(lái)旋轉(zhuǎn)。設(shè)headingpitchbank的旋轉(zhuǎn)角分別為變量hpb:

             

            以適當(dāng)?shù)捻樞蜻B接這些矩陣得到公式10.21

            如果要從物體坐標(biāo)空間變換到慣性坐標(biāo)空間,應(yīng)該使用慣性----物體旋轉(zhuǎn)矩陣的逆。因?yàn)樾D(zhuǎn)矩陣是正交的,所以求它的逆就是求它的轉(zhuǎn)置,下面驗(yàn)證這一點(diǎn)。

            為了從物體坐標(biāo)空間變換到慣性坐標(biāo)空間,順序應(yīng)該為"un-bank""un-pitch""un-heading",公式表示為:

            M物體->慣性 = (M慣性->物體-1 = (HPB-1 = B-1P-1H-1

            注意,可以認(rèn)為旋轉(zhuǎn)矩陣B-1、P-1H-1為它們對(duì)應(yīng)矩陣的逆,或者是使用相反旋轉(zhuǎn)角b、ph的一般旋轉(zhuǎn)矩陣。(慣性 --- 物體矩陣中,使用負(fù)的旋轉(zhuǎn)角,因此這里的角不用變負(fù)。)

            以適當(dāng)?shù)捻樞蜻B接這些矩陣得到公式10.22:

            比較公式10.21和公式10.22,可以看到物體---慣性矩陣確實(shí)慣性---物體矩陣的轉(zhuǎn)置。

             

            從矩陣轉(zhuǎn)換到歐拉角

            將角位移從矩陣形式轉(zhuǎn)換到歐拉角需要考慮以下幾點(diǎn):

            (1)必須清楚矩陣代表什么旋轉(zhuǎn):物體 -- 慣性還是 慣性 -- 物體,這里討論使用慣性 -- 物體矩陣的技術(shù),物體 -- 慣性矩陣轉(zhuǎn)換成歐拉角的過(guò)程與之類似。

            (2)對(duì)任意給定角位移,存在無(wú)窮多個(gè)歐拉角可以用來(lái)表示它。因?yàn)?/span>"別名"問(wèn)題,這里討論的技術(shù)總是返回"限制歐拉角",headingbank的范圍±180°,pitch的范圍為±90°。

            (3)矩陣可能是病態(tài)的,我們必須忍受浮點(diǎn)數(shù)精度的誤差。有些矩陣還包括除旋轉(zhuǎn)外的變換,如縮放、鏡像等。這里只討論工作在旋轉(zhuǎn)矩陣上的變換。

            考慮這些因素后,我們嘗試從公式10.21直接解得歐拉角:


            If cos p = 0, then we cannot use the above trick since all the matrix elements involved are zero.
            However, notice that when cos p = 0, then p = 90°, which means we are either looking straight
            up or straight down. This is the Gimbal lock situation, where heading and bank effectively rotate
            about the same physical axis (the vertical axis). In this case, we will arbitrarily assign all rotation
            about the vertical axis to heading and set bank equal to zero. Now we know the value of pitch and
            bank, and all we have left is to solve for heading. Armed with the following simplifying
            assumptions:

            cosp = 0

            b = 0

            sinb = 0

            cosb = 1

            將它們代入公式10.21:

             

            現(xiàn)在,能夠通過(guò)-m31m11計(jì)算h,它們分別包含了hsin和cos值。

            讓我們看看使用上面的技術(shù)從慣性 ---- 物體旋轉(zhuǎn)矩陣中抽取歐拉角的代碼,為了使示例簡(jiǎn)單,假設(shè)輸入輸出為全局變量。

                 Listing 10.3: Extracting Euler angles from an inertial-to-object rotation matrix
               
                
            // Assume the matrix is stored in these variables:
               
            float m11,m12,m13;
               
            float m21,m22,m23;
               
            float m31,m32,m33;
               
               
                // We will compute the Euler angle values in radians and store them here:
               
            float h,p,b;
               
               
                // Extract pitch from m23, being careful for domain errors with asin(). We could have
                // values slightly out of range due to floating point arithmetic.
               
            float sp = –m23;
               
               
            if (sp <= –1.0f) {
                  p = –1.570796f; 
            // –pi/2
               
            else if (sp >= 1.0) {
                  p = 1.570796; 
            // pi/2
               
            else {
                  p = asin(sp);
                }
               
               
            // Check for the Gimbal lock case, giving a slight tolerance
                // for numerical imprecision
               
            if (sp > 0.9999f) {
                  
            // We are looking straight up or down.
                  // Slam bank to zero and just set heading
               
              b = 0.0f;
                  h = atan2(–m31, m11);
                } 
            else {
                  
            // Compute heading from m13 and m33
               
              h = atan2(m13, m33);
               
                  
            // Compute bank from m21 and m22
               
              b = atan2(m21, m22);
                }

            posted on 2008-02-14 18:07 lovedday 閱讀(2129) 評(píng)論(0)  編輯 收藏 引用

            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            国产成人久久精品区一区二区| 久久乐国产精品亚洲综合| 亚洲愉拍99热成人精品热久久| 久久免费高清视频| 国产综合成人久久大片91| 久久精品久久久久观看99水蜜桃| 久久久亚洲欧洲日产国码aⅴ| 久久久中文字幕| 亚洲日本va中文字幕久久| 久久99精品国产麻豆蜜芽| 麻豆AV一区二区三区久久| 国产成人久久精品二区三区| 久久无码AV一区二区三区| 久久青青草原精品影院| 天堂久久天堂AV色综合| 国产高清美女一级a毛片久久w | 天天躁日日躁狠狠久久| 久久久黄片| 久久精品嫩草影院| 久久久久亚洲av无码专区导航 | 久久中文字幕人妻丝袜| 国内精品久久久久久久涩爱| 国产亚洲精品美女久久久| 亚洲人成电影网站久久| 久久精品国产99久久丝袜| 久久精品国产福利国产秒| 国产精品99久久久久久人| 亚洲AV无码久久寂寞少妇| 久久精品人人做人人爽电影| 欧美亚洲另类久久综合婷婷| 精品国产婷婷久久久| 91超碰碰碰碰久久久久久综合| 精品999久久久久久中文字幕 | 狠狠色综合久久久久尤物| 久久精品蜜芽亚洲国产AV| 午夜天堂av天堂久久久| 久久香综合精品久久伊人| 久久综合给久久狠狠97色| 99久久人妻无码精品系列| 999久久久免费精品国产| 精品一区二区久久|