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

            Heath's Blog

            There is no end, it is just the beginning! - A Game Developer's Notes

            Real-time Cutscene中的攝像機插值研究

                 很多DCC工具都提供了Curves Editor,通過控制點來構造插值曲線,這樣可以精確地插值軌跡。在我們游戲的過場編輯器中,我們并沒有開發這類工具,一方面由于時間人力有限,另一方面希望能夠提供一種直觀簡便的方式達到想要的效果。因此我們支持兩種攝像機路徑創建方法:1)以攝像機視角直接將攝像機擺到想要位置,保存此時攝像機的位置與旋轉;2)將3DS Max中的路徑導出為游戲的過場格式。前者可以滿足90%的過場編輯需求,后者滿足了10%的復雜路徑編輯需求。

                 不管使用那種方式,都需要將離散點進行插值(interpolation)以便得到平滑路徑。這里就牽涉到位置插值和朝向插值。

                 從插值函數上可分為三類:1)線性;2)多項式;3)樣條。顧名思義,線性插值采用線性函數,多項式插值采用多項式,而樣條插值則采用了一組多項式組成的分段函數。由于攝像機的關鍵路徑點通常都會大于2個,所以插值方法上就必須選取樣條方法。

            一、位置插值

            1.1 樣條類型選擇

                 在這里我們僅考慮三次樣條插值,因為它們可達到C2連續。三次樣條中主要以Bezier、Catmull-Rom、均勻B樣條為考查對象,它們都具有計算開銷小的優點。可以通過下面公式來定義它們:

            Image(18)

                 簡化為:

            Image(19)

                 下面表格列出了三種插值曲線對應的G和M:

            Image(20)

                 如下圖所示,對4個點進行Bezier插值得到的曲線只會有兩個點被曲線穿過,而B-Spline插值得到的曲線不會經過控制點,只有Catmull-Rom Spline可以得到穿過除起點和終點之間的所有控制點。正因為Catmull-Rom具有這個特性,使得它被廣泛地應用在關鍵幀平滑插值上,因此我們選擇了Catmull-Rom樣條作為攝像機位置點的插值算法。

            Image(21)

            1.2 實現

            Image

            參考:

            [1] Mathematics for 3D Game Programming and Computer Graphics 3e by Eric Lengyel

            [2] http://en.wikipedia.org/wiki/Catmull-Rom_spline#Catmull.E2.80.93Rom_spline

            [3] http://www.codeproject.com/Articles/30838/Overhauser-Catmull-Rom-Splines-for-Camera-Animatio

            二、朝向(旋轉)插值  

            2.1 Euler Angles VS Quaternion        

                 三維空間中描述旋轉的主要方法有Euler Angles和Quaternion。Euler Angles有三個明顯的問題:1)三軸上的旋轉順序敏感;2)Gimbal Lock現象導致旋轉自由度丟失;3)獨立地對三個旋轉分量進行插值,忽略了三軸之間的依賴關系,導致插值結果不理想。與Euler Angles不同的是,Quaternion沒有將旋轉分解到三個軸向上,而是用一個旋轉軸和繞該軸的旋轉角度來描述,所以從根本上消除了Euler Angles的三大問題。有關Quaternion的詳細描述可參考[1],在此不再累述。

            2.2 LERP VS SLERP

                 四元數線性插值(Linear Quaternion interpolation)的計算公式為:

            Image(1)

                 四元數球面線性插值(Spherical Linear Quaternion interpolation)的計算公式為:

            Image(2)

            Image(3)

                 其中,θ為兩個四元數的夾角。

                 為了方便展示,我們考慮在2D情況對角度V進行兩次插值,兩種算法在插值效果上存在的差異,如下圖(b為LERP、c為SLERP):

            Image(4)

                 從圖中可以看出LERP其實是對兩四元數在圓上的弦進行了等分,而SLERP則是對圓弧進行等分。由此得出的結論是,SLERP得到了比LERP更平滑的插值結果。

                 為了保證插值曲線的C2連續性,需要使用球面四邊形插值(Spherical Quadrangle interpolation)方法。例如,對q1和q2插值,首先要用q0、q1、q2、q3計算出兩個控制點(Inner Quadrangle Point),公式如下:

            Image(5)

                 然后通過下式得到最終插值結果:

            Image(6)

            2.3 實現

            Image(7)

                 上面代碼沒有考慮兩個四元數之間夾角大于180°的情況。例如,考慮q1->q2的插值角度θ>180°,我們可以讓q1->q2反向旋轉2π-θ,即旋轉-(2π-θ),根據四元數的定義[v*sin(θ/2) , cos(θ/2)],那么對q2進行處理變為[-v*sin(θ/2) , -cos(θ/2)]。這個處理可以放在AddSplinePoint中來做:

            Image(8)

            參考:

            [1] Quaternions, Interpolation and Animation by EB Dam - 1998

            [2] Game Engine Architecture by Jason Gregory - 2009

            [3] https://theory.org/software/qfa/writeup/node12.html

            posted on 2013-10-26 09:07 Heath 閱讀(2805) 評論(1)  編輯 收藏 引用 所屬分類: Game Development

            Feedback

            # re: Real-time Cutscene中的攝像機插值研究[未登錄] 2013-10-27 14:53 煙圈

            博主用的什么編程字體,看著好酷。  回復  更多評論   

            欧美亚洲国产精品久久久久| 人人狠狠综合久久亚洲婷婷| 久久99久国产麻精品66| 麻豆成人久久精品二区三区免费 | 亚洲精品无码久久千人斩| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国内精品久久久久久野外| 亚洲精品成人久久久| 狠狠88综合久久久久综合网| 欧美亚洲日本久久精品| 久久99国产精品久久99果冻传媒| 午夜精品久久影院蜜桃| 色综合久久中文色婷婷| 久久夜色精品国产欧美乱| 久久亚洲欧洲国产综合| 久久久国产精品福利免费| 亚洲日本va午夜中文字幕久久| 99re久久精品国产首页2020| 国产精品久久久久久久久软件| 国产精品99久久久久久www| 欧美一区二区三区久久综| 久久人人爽人人爽人人av东京热 | 伊人久久亚洲综合影院| 99久久免费只有精品国产| 久久91精品国产91久久户| 亚洲日韩中文无码久久| 麻豆av久久av盛宴av| 欧美亚洲另类久久综合婷婷| 久久久久免费精品国产| 久久久九九有精品国产| 久久99国产精品久久99| 99久久婷婷国产综合精品草原| 久久综合久久久| 久久精品女人天堂AV麻| 精品久久人人做人人爽综合| 久久久精品免费国产四虎| 伊人久久综合热线大杳蕉下载| 国产精品青草久久久久婷婷| 丁香五月网久久综合| 亚洲国产精品婷婷久久| 久久久久亚洲av成人无码电影|