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

            修正D3DXQuaternionSquad不能正確處理反向Quaternions的BUG

            微軟DX庫里提供了對Quaternion進(jìn)行球面四邊形內(nèi)插的接口,能夠在多個Quaternion之間平滑插值。這里涉及到兩個接口:

            void D3DXQuaternionSquadSetup(
              __out  D3DXQUATERNION *pAOut,
              __out  D3DXQUATERNION *pBOut,
              __out  D3DXQUATERNION *pCOut,
              __in   const D3DXQUATERNION *pQ0,
              __in   const D3DXQUATERNION *pQ1,
              __in   const D3DXQUATERNION *pQ2,
              __in   const D3DXQUATERNION *pQ3
            );
            D3DXQUATERNION* D3DXQuaternionSquad(
              __inout  D3DXQUATERNION *pOut,
              __in     const D3DXQUATERNION *pQ1,
              __in     const D3DXQUATERNION *pA,
              __in     const D3DXQUATERNION *pB,
              __in     const D3DXQUATERNION *pC,
              __in     FLOAT t
            );
            其中,D3DXQuaternionSquadSetup用于返回內(nèi)插的控制點(diǎn)。它們具體的實(shí)現(xiàn)公式和用法,有興趣的同學(xué)可以參考MSDN。在此需要說明的是,
            D3DXQuaternionSquad使用了Slerp作為內(nèi)部實(shí)現(xiàn),會導(dǎo)致在兩個夾角為180°左右的Quaternion之間插值會出現(xiàn)斷裂的問題。下面代碼通過
            實(shí)現(xiàn)一個考慮了上述情況的Slerp版本,在q1和q2夾角在0°或者180°時,使用線性內(nèi)插而非球面,來解決該問題。
            1. Quaternion QuatSlerpNoInvert(const Quaternion& q1 , const Quaternion& q2 , float t)
            2. {
            3. ????float cosAngle = DotProduct(q1, q2);
            4.  
            5. ????float c1, c2;
            6. ????// Linear interpolation for close orientations
            7. ????if ((1.0f - fabs(cosAngle)) < 1e-5f)
            8. ????{
            9. ????????c1 = 1.0f - t;
            10. ????????c2 = t;
            11. ????}
            12. ????else
            13. ????{
            14. ????????// Spherical interpolation
            15. ????????float angle????= acos(fabs(cosAngle));
            16. ????????float sinAngle = sin(angle);
            17. ????????c1 = sin(angle * (1.0f - t)) / sinAngle;
            18. ????????c2 = sin(angle * t) / sinAngle;
            19. ????}
            20.  
            21. ????Quaternion q = q1 * c1 + q2 * c2;
            22. ????q.Normalize();
            23.  
            24. ????return q;
            25. }
            26.  
            27. Quaternion QuatSquad(const Quaternion& p1 , const Quaternion& p2 , const Quaternion& p3 , const Quaternion& p4 , float t)
            28. {
            29. ????static Quaternion a , b , c;
            30.  
            31. ????D3DXQuaternionSquadSetup((D3DXQUATERNION*)&a , (D3DXQUATERNION*)&b , (D3DXQUATERNION*)&c ,
            32. ????????(D3DXQUATERNION*)&p1 , (D3DXQUATERNION*)&p2 , (D3DXQUATERNION*)&p3 , (D3DXQUATERNION*)&p4);
            33.  
            34. ????return QuatSlerpNoInvert(QuatSlerpNoInvert(p2 , c , t) , QuatSlerpNoInvert(a , b , t) , 2 * t * (1-t));
            35. }

             

            參考:

            [1] http://msdn.microsoft.com/en-us/library/bb205419(v=vs.85).aspx

            [2] http://msdn.microsoft.com/en-us/library/bb205420(v=vs.85).aspx

            posted on 2011-08-21 22:16 Heath 閱讀(2313) 評論(0)  編輯 收藏 引用 所屬分類: Game Development

            国产精品久久久久久久午夜片 | 久久久噜噜噜久久| 国产AⅤ精品一区二区三区久久 | 91精品国产91热久久久久福利| 9999国产精品欧美久久久久久| 久久伊人中文无码| 国内精品九九久久久精品| 国内精品久久久久影院网站| 一97日本道伊人久久综合影院| 亚洲色婷婷综合久久| 伊人丁香狠狠色综合久久| 麻豆av久久av盛宴av| 99久久亚洲综合精品网站| 香蕉久久夜色精品国产尤物| 国产精品一久久香蕉国产线看| 久久精品国产精品亚洲| 亚洲va久久久噜噜噜久久男同| 99久久无码一区人妻| 国产精品9999久久久久| 久久久久亚洲AV成人网人人网站| 亚洲国产成人久久综合一| 久久久久亚洲精品无码蜜桃| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 久久精品中文騷妇女内射| 久久无码专区国产精品发布| 久久精品国产亚洲AV不卡| 久久精品国产91久久综合麻豆自制| 久久狠狠爱亚洲综合影院| 伊人久久精品影院| 亚洲精品国产第一综合99久久| 久久99精品国产麻豆不卡| 国产亚洲精午夜久久久久久| 97久久天天综合色天天综合色hd| 久久亚洲精品成人AV| 天天躁日日躁狠狠久久| 精品综合久久久久久98| 久久人妻AV中文字幕| 香蕉久久夜色精品升级完成| 亚洲国产精品无码久久| 久久亚洲日韩精品一区二区三区 | 久久精品国产亚洲AV忘忧草18|