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

天行健 君子當自強而不息

【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水蜜桃| 国产精品入口麻豆原神| 欧美二区在线播放| 狠狠色综合色区| 国产精品h在线观看| 欧美日本不卡高清| 蜜臀av性久久久久蜜臀aⅴ| 这里只有精品视频| 99精品欧美| 日韩一级在线观看| 9l视频自拍蝌蚪9l视频成人| 欧美国产免费| 欧美黄在线观看| 亚洲大胆人体视频| 久久在线免费观看| 亚洲一区二区三区成人在线视频精品| 亚洲欧洲精品一区二区三区不卡| 国产在线视频欧美一区二区三区| 国产亚洲a∨片在线观看| 国产精品自拍三区| 国产亚洲精品自拍| 好吊色欧美一区二区三区四区| 国产乱理伦片在线观看夜一区| 国产精品一区二区久激情瑜伽| 国产精品日韩一区| 黄色日韩在线| 亚洲人成毛片在线播放女女| 亚洲欧洲午夜| 中日韩高清电影网| 久久激情五月婷婷| 你懂的成人av| 日韩一级精品视频在线观看| 亚洲美女电影在线| 午夜精品久久久久久久| 美女网站在线免费欧美精品| 欧美精品黄色| 国产精品日韩精品| 在线电影院国产精品| 亚洲区在线播放| 亚洲精品免费一二三区| 亚洲综合精品一区二区| 麻豆乱码国产一区二区三区| 亚洲国产精品美女| 国产免费成人在线视频| 久久精品国产亚洲一区二区三区| 久久亚洲视频| 欧美日韩综合一区| 精品成人在线观看| 亚洲一区二区在线视频| 欧美在线高清视频| 亚洲激情六月丁香| 亚洲欧美在线观看| 欧美区日韩区| 欧美午夜电影一区| 亚洲国产成人tv| 性欧美1819性猛交| 亚洲乱码视频| 午夜精品免费视频| 欧美日韩国产综合网 | 国产日韩在线播放| 亚洲精品资源| 久久一区国产| 日韩一级不卡| 欧美精品大片| 亚洲黄色在线| 免费观看久久久4p| 久久久久久久成人| 国外精品视频| 久久电影一区| 久久久久国产精品一区二区| 亚洲国产cao| 亚洲精品一区二区三区婷婷月| 欧美日韩国产91| 小黄鸭视频精品导航| 亚洲免费在线视频| 国产主播喷水一区二区| 欧美 日韩 国产一区二区在线视频| 久久中文字幕一区二区三区| 亚洲精品在线视频| 亚洲一区二区视频在线观看| 国产精品一区视频| 麻豆国产精品777777在线| 免费av成人在线| 亚洲线精品一区二区三区八戒| 亚洲免费一级电影| 亚洲国产精品va在线看黑人动漫 | 一区二区三区毛片| 国产精品综合视频| 欧美高清视频在线| 国产精品啊啊啊| 久久中文字幕导航| 欧美日韩四区| 老牛影视一区二区三区| 欧美日韩另类丝袜其他| 小处雏高清一区二区三区| 久久综合色影院| 午夜精品一区二区三区在线视| 久久久久久久综合| 亚洲一级黄色| 亚洲欧洲一区二区天堂久久| 欧美专区在线观看| 亚洲精品欧美一区二区三区| 一区二区三区四区国产| 国产一区二区三区视频在线观看| 欧美国产极速在线| 国产手机视频精品| 99国产精品久久久久老师| 国内精品视频久久| 亚洲深夜av| 99国产一区| 麻豆91精品| 久久香蕉国产线看观看av| 欧美亚一区二区| 91久久精品视频| 亚洲大黄网站| 久久精品国产精品亚洲综合 | 亚洲一区二区高清| 久久在线免费视频| 久久久久久一区二区| 国产精品网站在线| 99re66热这里只有精品3直播| 亚洲国产91精品在线观看| 久久国产99| 久久精品亚洲精品| 国产精品一级在线| 亚洲影视在线播放| 亚洲欧美中文日韩v在线观看| 欧美日本国产精品| 亚洲激情精品| 亚洲三级免费观看| 欧美大片一区二区| 欧美激情乱人伦| 亚洲国产欧美国产综合一区| 久久久夜夜夜| 欧美不卡一卡二卡免费版| 亚洲成人在线| 美腿丝袜亚洲色图| 欧美国产视频在线观看| 在线观看欧美日韩国产| 老司机免费视频久久| 欧美成人一区二区| 99re成人精品视频| 欧美视频三区在线播放| 在线中文字幕一区| 久久动漫亚洲| 亚洲高清自拍| 欧美日韩不卡视频| 亚洲一区二区视频在线观看| 先锋影院在线亚洲| 国产日韩欧美中文在线播放| 欧美在线观看网址综合| 欧美成人免费va影院高清| 91久久极品少妇xxxxⅹ软件| 欧美母乳在线| 亚洲一区二区三区在线观看视频| 欧美一区二区三区四区在线观看| 国产日韩欧美制服另类| 理论片一区二区在线| 日韩小视频在线观看| 欧美在线观看视频| 亚洲国产精品一区在线观看不卡| 欧美福利一区二区| 亚洲一区久久| 欧美激情在线狂野欧美精品| 欧美韩日亚洲| 亚洲一区视频在线| 国产一区二区三区视频在线观看| 久久躁狠狠躁夜夜爽| 欧美成人免费在线| 亚洲午夜一级| 久热精品视频在线| 久久精品一二三| 欧美日韩成人一区| 欧美+亚洲+精品+三区| 欧美午夜理伦三级在线观看| 欧美xx视频| 国产综合18久久久久久| 99精品视频免费观看视频| 精品av久久久久电影| 亚洲免费在线精品一区| 亚洲一区二区毛片| 欧美日韩视频第一区| 欧美激情精品久久久六区热门 | 日韩一区二区免费高清| 香蕉成人久久| 久久亚洲一区二区三区四区| 国产精品午夜春色av| 亚洲欧美在线磁力| 久久免费少妇高潮久久精品99| 国产精品一国产精品k频道56| 妖精视频成人观看www| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美区日韩区| 亚洲一区二区在线观看视频| 欧美中文字幕在线播放| 精品成人在线| 欧美午夜不卡在线观看免费| 亚洲一区二区三区精品动漫| 欧美sm视频| 久久亚洲一区|