青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

【ZT】模擬實現ID3DXSkinInfo::UpdateSkinnedMesh

原文出處:http://blog.csdn.net/cywater2000/archive/2006/01/05/571299.aspx

一.公式:

FinalPos = MeshPos + ∑( Difference_i * Weight_i)

= MeshPos + ∑( (NewMeshPos_i - MeshPos) * Weight_i )

= MeshPos + ∑( (MeshPos × OffsetMatix_i × CombinedMatrix_i - MeshPos) * Weight_i ) [1]


其中:

MeshPos:                  某頂點在mesh中的原始位置

NewMeshPos_i:         此頂點受某骨骼i影響后變換到的新位置

Difference_i:              兩者之間的位移差值

Weight_i::                  此頂點受某骨骼i的影響權重

OffsetMatix_i:            骨骼i的偏移矩陣

CombinedMatrix_i:       骨骼i經過層次更新后的混合矩陣

∑:                              求和(對所有影響該頂點的骨骼)

FinalPos:                    此頂點的最終位置

 

法線計算同理。

 

二.模擬代碼(沒有優化):


HRESULT UpdateSkinnedMesh(ID3DXSkinInfo *pSkinInfo,
                  
const D3DXMATRIX *pBoneTransforms,
                  
const D3DXMATRIX *pBoneInvTransposeTransforms, //not use(原函數也沒用)
                  LPCVOID pVerticesSrc,
                  PVOID pVerticesDst,
//注意下面增加的兩個變量是原函數在調用時沒有的,因為ID3DXSkinInfo的內部機制可以獲得
                  DWORD numTotalVerts, 
// 指mesh的頂點個數
                  DWORD dwStride 
// 指mesh每個頂點的間距,即每個頂點結構的大小
                  )
{
    DWORD 
*pVertsIndic = NULL;
    
float *pVertsWeigh = NULL;
    DWORD dwNumVerts;
    DWORD offsetByte;

    BYTE 
*pDest = (BYTE*)pVerticesDst; //目標頂點緩沖
    
const BYTE *pSrc = (BYTE*)pVerticesSrc; //源頂點緩沖

    memcpy(pDest, pSrc, numTotalVerts 
* dwStride);

    
for(DWORD i = 0; i < pSkinInfo->GetNumBones(); i++)
    {
       dwNumVerts 
= pSkinInfo->GetNumBoneInfluences(i); //得到受影響的頂點個數

       
if(dwNumVerts <= 0)
           
continue;

       pVertsIndic 
= new DWORD[dwNumVerts];
       pVertsWeigh 
= new float[dwNumVerts];

       pSkinInfo
->GetBoneInfluence(i, pVertsIndic, pVertsWeigh);

       
while(dwNumVerts--)
       {
           DWORD index 
= pVertsIndic[dwNumVerts]; //當前受影響的頂點索引
           
float weight = pVertsWeigh[dwNumVerts]; //當前受影響頂點的權重

           offsetByte 
= index * dwStride;

           D3DXVECTOR3 vecPos 
= *(D3DXVECTOR3 *)(pSrc + offsetByte); //位置
           D3DXVECTOR3 vecNor 
= *(D3DXVECTOR3 *)(pSrc + offsetByte + sizeof(D3DXVECTOR3)); //法線

           D3DXVECTOR3 vecPos2, vecNor2;
           D3DXVec3TransformCoord(
&vecPos2, &vecPos, &pBoneTransforms[i]);
           D3DXVec3TransformNormal(
&vecNor2, &vecNor, &pBoneTransforms[i]);

           D3DXVECTOR3 
*pV = (D3DXVECTOR3 *)(pDest + offsetByte);
           D3DXVECTOR3 
*pN = (D3DXVECTOR3 *)(pDest + offsetByte + sizeof(D3DXVECTOR3));

           D3DXVECTOR3 diff 
= (vecPos2 - vecPos) * weight;
           
*pV += diff;

           diff 
= (vecNor2 - vecNor) * weight;
           
*pN += diff;
       }

       delete[] pVertsIndic;
       delete[] pVertsWeigh;
    }
 
    
return S_OK;

}

    注意在調用UpdateSkinnedMesh前,pBoneTransforms已經是OffsetMatix與CombinedMatrix的連接矩陣了(ID3DXSkinInfo::UpdateSkinnedMesh也是這么要求的)。

 

重要更新:

骨骼動畫屬于Geometry Blending,因此標準做法應該是:
 [2]
即FinalPos =∑(NewMeshPos_i  * Weight_i) + NewMeshPos_n * (1 - ∑Weight_i ) , i=0,1..n-1
=∑(MeshPos × OffsetMatix_i × CombinedMatrix_i * Weight_i) + (MeshPos × OffsetMatix_n × CombinedMatrix_n) * (1 - ∑Weight_i ) , i=0,1..n-1 [3]
(顯然只有當影響頂點的所有權重之和等于1時,公式[1]與[3]才等價)


posted on 2008-04-22 15:22 lovedday 閱讀(1091) 評論(0)  編輯 收藏 引用 所屬分類: ■ DirectX 9 Program

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美福利视频网站| 99国产精品久久久久久久成人热| 国内成人精品2018免费看| 欧美午夜三级| 国产精品mm| 国产日本亚洲高清| 韩国av一区二区三区| 极品尤物久久久av免费看| 在线观看三级视频欧美| 亚洲国产成人一区| 99国产精品99久久久久久粉嫩| 日韩午夜激情| 性做久久久久久免费观看欧美| 欧美一区亚洲一区| 欧美r片在线| 最新国产の精品合集bt伙计| 亚洲韩国一区二区三区| av成人手机在线| 欧美一级视频| 欧美成人日本| 国产精品国产精品| 极品尤物av久久免费看 | 久久噜噜噜精品国产亚洲综合| 久热精品视频在线| 欧美日韩亚洲综合| 一区久久精品| 亚洲在线视频观看| 欧美激情麻豆| 欧美在线一区二区三区| 欧美日韩视频在线第一区| 国一区二区在线观看| 一本色道久久综合亚洲二区三区| 久久久久久久一区二区三区| 亚洲国产经典视频| 欧美在线视频免费播放| 欧美日韩在线免费视频| 亚洲国产高清aⅴ视频| 欧美一区国产二区| 日韩视频在线一区二区三区| 久久精品综合网| 国产精品日韩一区二区| 久久久久久久久久久久久9999| 欧美国产在线电影| 在线观看欧美| 欧美伊人精品成人久久综合97| 亚洲激情成人在线| 久久综合九色综合久99| 国产欧美在线视频| 亚洲欧美激情诱惑| 亚洲精品视频在线看| 美女精品国产| 136国产福利精品导航| 久久精品亚洲乱码伦伦中文 | 久久久久一区二区三区| 国产精品丝袜久久久久久app| 亚洲免费成人av| 亚洲国产精品美女| 欧美77777| 亚洲精品一区在线观看| 亚洲第一精品电影| 免费在线欧美视频| 亚洲欧洲一区二区三区| 欧美国产欧美综合| 欧美韩日视频| 亚洲美女网站| 亚洲美女区一区| 欧美午夜精品一区| 亚洲免费在线播放| 亚洲免费在线电影| 国产一区二区福利| 欧美sm极限捆绑bd| 欧美激情1区2区3区| 99www免费人成精品| 亚洲理论在线| 国产精品视频久久一区| 久久久91精品国产一区二区三区| 欧美一站二站| 亚洲国产精品一区二区尤物区 | 欧美精品一区二区三区久久久竹菊 | 蜜月aⅴ免费一区二区三区| 亚洲免费婷婷| 国内久久视频| 亚洲大胆美女视频| 欧美日韩在线播放一区二区| 亚洲一区视频| 午夜精品久久久久久久久久久久| 欧美视频一区在线| 性色av一区二区怡红| 久久爱www.| 亚洲乱码国产乱码精品精98午夜| 亚洲精品视频免费| 国产亚洲欧美日韩在线一区| 欧美 日韩 国产一区二区在线视频| 久久青青草综合| 99国产精品视频免费观看一公开 | 亚洲午夜高清视频| 麻豆精品91| 亚洲精品三级| 亚洲在线中文字幕| 亚洲国产欧美在线| 亚洲一二三区视频在线观看| 一区精品久久| 亚洲校园激情| 亚洲精品一区二区三区福利| 亚洲一区激情| 亚洲三级视频| 欧美专区在线| 亚洲永久精品国产| 久久综合九色99| 午夜精品视频一区| 欧美激情小视频| 可以看av的网站久久看| 国产精品国产福利国产秒拍| 欧美jjzz| 精品va天堂亚洲国产| 亚洲专区一二三| 亚洲图片欧美一区| 免费一区二区三区| 久久中文欧美| 国产日韩欧美中文| 在线亚洲一区观看| 99精品欧美一区二区三区综合在线 | 久久综合色播五月| 亚洲一区二区三区激情| 久久婷婷久久| 久久精品国产99| 国产精品久久久久三级| 最新国产成人在线观看| 亚洲国产99精品国自产| 欧美在线国产精品| 欧美一区高清| 国产欧美精品一区二区色综合| 亚洲精品久久久久中文字幕欢迎你 | 99av国产精品欲麻豆| 国内精品久久久| 亚洲欧美激情诱惑| 欧美一区二区三区日韩| 国产精品久久久久久久久免费樱桃| 亚洲黄色三级| 99精品黄色片免费大全| 欧美国产高清| 亚洲精品乱码| 一区二区三区四区五区精品| 欧美区一区二区三区| 亚洲国产精品一区| 一本一本久久a久久精品综合妖精| 欧美成人久久| 亚洲美女福利视频网站| 一区二区三区免费看| 欧美视频一区二区三区…| 99精品国产福利在线观看免费 | 新狼窝色av性久久久久久| 亚洲一区二区三区精品在线观看 | 久久精品一区二区| 久久人人爽人人爽| 在线观看成人一级片| 蜜桃av久久久亚洲精品| 亚洲电影免费| 亚洲视频一区| 国产日韩欧美91| 另类天堂视频在线观看| 亚洲精品影院| 久久高清国产| 亚洲精品国产精品国产自| 欧美日韩裸体免费视频| 午夜精品视频在线| 亚洲国产精彩中文乱码av在线播放| 一区二区三区av| 国产视频不卡| 欧美激情一区二区三区| 午夜精品久久| 欧美国产日本| 午夜精品影院| 亚洲第一精品久久忘忧草社区| 免费成年人欧美视频| 在线综合亚洲欧美在线视频| 久久久久久久综合| 亚洲视频免费在线| 影音先锋日韩资源| 国产精品久久久久久亚洲调教| 久久久九九九九| 日韩视频在线一区| 美女诱惑黄网站一区| 亚洲欧美日韩中文播放| 亚洲激情自拍| 国产一区二区三区直播精品电影| 欧美风情在线观看| 久久久99爱| 亚洲天堂偷拍| 亚洲精品国产精品国自产观看浪潮| 欧美一区二区三区在线视频| 亚洲精品欧美专区| 在线看欧美日韩| 国产欧美日韩专区发布| 欧美日韩福利在线观看| 久久综合久久综合久久| 欧美在线观看视频一区二区三区| 日韩亚洲欧美中文三级| 欧美国产极速在线| 久久嫩草精品久久久精品|