|
電腦遊戲製作開發設計論壇 任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
Zero 偶而上來逛逛的過客
註冊時間: 2009-01-04 文章: 10
0.00 果凍幣
|
發表於: 2009-1-13, PM 10:36 星期二 文章主題: |
|
|
模型檔案是版主讓入下戴的147ef2685d960c.rar壓縮檔內的123456.x模型,
希望各位先進能幫小弟解惑謝謝 |
|
回頂端 |
|
|
Zero 偶而上來逛逛的過客
註冊時間: 2009-01-04 文章: 10
0.00 果凍幣
|
發表於: 2009-1-13, PM 10:37 星期二 文章主題: |
|
|
另外再請教各位先進:
要如何才可以上傳檔案呢? |
|
回頂端 |
|
|
mirror 散播福音的祭司
註冊時間: 2007-07-27 文章: 174
828.60 果凍幣
|
發表於: 2009-1-13, PM 11:51 星期二 文章主題: Re: [範例] Direct3D9 - Mesh 動態模型 |
|
|
Mesh.Draw();的上面少了這一行
Mesh.pAnimationContainer->AdvanceTime(Time, NULL);
另外這個模型沒有設定動畫名稱
所以不用去抓動畫名稱來用..
改天我有上傳動畫模型的時候你再下載來測試吧..
到時我會註明上面有哪些名稱可以用
這個論壇沒有空間可以給你上傳檔案
要自己去找.. |
|
回頂端 |
|
|
Zero 偶而上來逛逛的過客
註冊時間: 2009-01-04 文章: 10
0.00 果凍幣
|
發表於: 2009-1-14, PM 12:05 星期三 文章主題: |
|
|
首先先感謝mirror先進您的回覆您真有心,非常感謝您。
目前我有依照你說的有在Mesh.Draw();的上面再加一行SetTime();但模型它還是不會正常動作,我覺得比較有問題的是,因為我是使用DirectX9.0b的版本,對於原程式內有一些函式例如AdvanceTime(),ResetTime(),
GetAnimationSetByName()我沒辨法使用,我在想是否我使用的替代的函式有問題,
AdvanceTime(),我使用SetTime()
ResetTime(),找不到類似的功能函式,註解掉
GetAnimationSetByName(cString[1],&ppAnimSet),我使用GetAnimationSet(0,&ppAnimSet)
不知道是不是這幾句的關係,請先進幫我看一下是否那裡還有可能造成錯誤,謝謝 |
|
回頂端 |
|
|
mirror 散播福音的祭司
註冊時間: 2007-07-27 文章: 174
828.60 果凍幣
|
發表於: 2009-1-14, PM 9:09 星期三 文章主題: |
|
|
9.0b現在還有人在用嗎?(不清楚)
很抱歉幫不上忙..
9.0c的使用者也在減少了吧..
差不多快要進入dx10以上的時代了..
不過那個提供的動態範例
下載來用9.0c是正常的..
未來新的功能寫法可能也會做大改革也不一定
先從容易著手的去做吧 |
|
回頂端 |
|
|
mirror 散播福音的祭司
註冊時間: 2007-07-27 文章: 174
828.60 果凍幣
|
|
回頂端 |
|
|
mirror 散播福音的祭司
註冊時間: 2007-07-27 文章: 174
828.60 果凍幣
|
發表於: 2009-6-2, PM 1:26 星期二 文章主題: |
|
|
實際內容請參考NPC大大提供的範例
有其它問題再來補充@@
【1】.建立D3D視窗
【2】.建立AnimatedMesh類別(產生新類別)
【3】.建立D3DXFRAME_DERIVE:D3DXFRAME框架pFrameRoot
代碼: |
struct D3DXFRAME_DERIVED: public D3DXFRAME
{
D3DXMATRIXA16 CombinedTransformationMatrix;
};
D3DXFRAME_DERIVED * pFrameRoot;
|
【4】.實作ID3DXAllocateHierarchy界面(配置架構)
※ID3DXAllocateHierarchy為抽象類別
所以最起碼要實作CreateFrame、CreateMeshContainer、DestroyFrame、DestroyMeshContainer四個函數
代碼: |
class CAllocateHierarchy : public ID3DXAllocateHierarchy
{
STDMETHOD (CreateFrame) (LPCSTR Name, LPD3DXFRAME *ppNewFrame);
STDMETHOD (CreateMeshContainer) (LPCSTR Name, CONST D3DXMESHDATA *pMeshData, CONST D3DXMATERIAL *pMaterials, CONST D3DXEFFECTINSTANCE *pEffectInstances, DWORD NumMaterials, CONST DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo, LPD3DXMESHCONTAINER *ppNewMeshContainer);
STDMETHOD (DestroyFrame) (LPD3DXFRAME pFrameToFree);
STDMETHOD (DestroyMeshContainer) (LPD3DXMESHCONTAINER pMeshContainerBase);
CHAR* AllocName (CHAR* Name);
HRESULT GenerateSkinnedMesh (IDirect3DDevice9 *pDevice, D3DXMESHCONTAINER_DERIVED *pMeshContainer);
};
|
【5】.導入模型檔(D3DXLoadMeshHierarchyFromX)
必備資訊:
1.配置架構(ID3DXAllocateHierarchy)
2.框架pFrameRoot(D3DXFRAME_DERIVED:D3DXFRAME)
3.網格動畫容器pAnimationContainer(ID3DXAnimationController))
【6】.建立網格容器(pMeshContainer 即傳入的 pMeshContainerBase 位址)設定骨骼到網格上(SetupBoneMatrixPointersOnMesh、SetupBoneMatrixPointers)
(它在這裡是用遞迴的方式,不過建議改用迴圈代替,否則程式執行速度會下降很多)
代碼: |
HRESULT AnimatedMesh::SetupBoneMatrixPointersOnMesh (LPD3DXMESHCONTAINER pMeshContainerBase)
{
D3DXMESHCONTAINER_DERIVED *pMeshContainer = (D3DXMESHCONTAINER_DERIVED*)pMeshContainerBase;
// if there is a skinmesh, then setup the bone matrices
if (pMeshContainer->pSkinInfo != NULL)
{
UINT iBone, cBones;
D3DXFRAME_DERIVED *pFrame;
cBones = pMeshContainer->pSkinInfo->GetNumBones();
pMeshContainer->ppBoneMatrixPtrs = new D3DXMATRIX*[cBones];
if (pMeshContainer->ppBoneMatrixPtrs == NULL)
return E_OUTOFMEMORY;
for (iBone = 0; iBone < cBones; iBone++)
{
pFrame = (D3DXFRAME_DERIVED*)D3DXFrameFind(pFrameRoot, pMeshContainer->pSkinInfo->GetBoneName(iBone) );
if (pFrame == NULL)
return E_FAIL;
pMeshContainer->ppBoneMatrixPtrs[iBone] = &pFrame->CombinedTransformationMatrix;
}
}
return D3D_OK;
}
HRESULT AnimatedMesh::SetupBoneMatrixPointers (LPD3DXFRAME pFrame)
{
HRESULT hr;
if (pFrame->pMeshContainer != NULL)
{
hr = SetupBoneMatrixPointersOnMesh(pFrame->pMeshContainer);
if (hr != D3D_OK)
return hr;
}
if (pFrame->pFrameSibling != NULL)
{
hr = SetupBoneMatrixPointers(pFrame->pFrameSibling);
if (hr != D3D_OK)
return hr;
}
if (pFrame->pFrameFirstChild != NULL)
{
hr = SetupBoneMatrixPointers(pFrame->pFrameFirstChild);
if (hr != D3D_OK)
return hr;
}
return D3D_OK;
}
|
|
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 可以 在這個版面附加檔案 您 可以 在這個版面下載檔案
|
|