いつも教えて下さいましてありがとうございます。
また少し教えて頂きたいことがあります。
鎌田茂雄氏著のGAMECODINGとか逆引き大全500とかをコピペしながら勉強しています。
メッシュを表示したり、移動させたりできて、自分では出来てる感があったのですが、
やっぱりコピペ主体なもので理解できない部分が多々あります。
移動させるメッシュに丸い影を付けていたのですが、シャドウボリュームでやってみようと思っています。
メッシュの面数を取得したいのですが止まってしまいます。
レンダリングの最後の方の、
DWORD mensu = Thing[0].pMesh->GetNumFaces();
で止まってしまうみたいです。
動かないメッシュだと大丈夫なのですが、アニメするメッシュだと止まってしまいます。
以下のコードは本に出ていた一部変更したものですが(ほとんどコピペですが)、
アニメファイル読み込みの、xfileの読み込み1だと止まり、静止ファイル読み込みの、xfileの読み込み2だと大丈夫なようです。
xfileの読み込み1では、pMeshに情報が入っていないと思うのですが、メッシュ情報がどこにあるのかもわかりません。
教えて頂ければと思います。
Windows7
DirectX9
Microsoft Visual Studio 2008
(CなのかC++なのかも実はあまり分かっていません)
です。
よろしくお願いします。
//構造体 ////////////////////////////////////////////////////////////////////////////////////////////////////
struct THING
{
LPD3DXMESH pMesh;
LPD3DXFRAME pFrameRoot;
LPD3DXANIMATIONCONTROLLER pAnimController;
D3DMATERIAL9* pMeshMaterials;
LPDIRECT3DTEXTURE9* pMeshTextures;
DWORD dwNumMaterials;
D3DXVECTOR3 vecPosition;
D3DXMATRIX matRotation;
D3DXMATRIX matWorld;
THING()
{
ZeroMemory(this,sizeof(THING));
}
};
//xfileの読み込み1 ////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT InitThing1(THING *pThing,LPSTR szXFileName,D3DXVECTOR3* pvecPosition)
{
// メッシュの初期位置
memcpy(&pThing->vecPosition,pvecPosition,sizeof(D3DXVECTOR3));
// Xファイルからアニメーションメッシュを読み込み作成する
if( FAILED(
D3DXLoadMeshHierarchyFromX(szXFileName, D3DXMESH_MANAGED, pDevice, &cHierarchy,
NULL, &pThing->pFrameRoot, &pThing->pAnimController)))
{
MessageBox(NULL, "Xファイルの読み込みに失敗しました",szXFileName, MB_OK);
return E_FAIL;
}
//
AllocateAllBoneMatrices(pThing,pThing->pFrameRoot);
return S_OK;
}
//xfileの読み込み2 ////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT InitThing2(THING *pThing,LPSTR szXFileName,D3DXVECTOR3* pvecPosition)
{
// メッシュの初期位置
memcpy(&pThing->vecPosition,pvecPosition,sizeof(D3DXVECTOR3));
// Xファイルからメッシュをロードする
LPD3DXBUFFER pD3DXMtrlBuffer = NULL;
if( FAILED( D3DXLoadMeshFromX( szXFileName, D3DXMESH_SYSTEMMEM,
pDevice, NULL, &pD3DXMtrlBuffer, NULL,
&pThing->dwNumMaterials, &pThing->pMesh ) ) )
{
MessageBox(NULL, "Xファイルの読み込みに失敗しました",szXFileName, MB_OK);
return E_FAIL;
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
pThing->pMeshMaterials = new D3DMATERIAL9[pThing->dwNumMaterials];
pThing->pMeshTextures = new LPDIRECT3DTEXTURE9[pThing->dwNumMaterials];
for( DWORD i=0; i<pThing->dwNumMaterials; i++ )
{
pThing->pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
pThing->pMeshMaterials[i].Ambient = pThing->pMeshMaterials[i].Diffuse;
pThing->pMeshTextures[i] = NULL;
if( d3dxMaterials[i].pTextureFilename != NULL &&
lstrlen(d3dxMaterials[i].pTextureFilename) > 0 )
{
if( FAILED( D3DXCreateTextureFromFile( pDevice,
d3dxMaterials[i].pTextureFilename,
&pThing->pMeshTextures[i] ) ) )
{
MessageBox(NULL, "テクスチャの読み込みに失敗しました", NULL, MB_OK);
}
}
}
pD3DXMtrlBuffer->Release();
return S_OK;
}
//レンダリング////////////////////////////////////////////////////////////////////////////////////////////////////
VOID RenderThing(THING* pThing)
{
static FLOAT fAnimTimeHold=fAnimTime;
//ワールドトランスフォーム(絶対座標変換)
D3DXMATRIXA16 matWorld,matPosition;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixTranslation(&matPosition,pThing->vecPosition.x,pThing->vecPosition.y,
pThing->vecPosition.z);
D3DXMatrixMultiply(&matWorld,&matWorld,&matPosition);
pDevice->SetTransform( D3DTS_WORLD, &matWorld );
// ビュートランスフォーム(視点座標変換)
D3DXVECTOR3 vecEyePt( 4.0f, 4.0f,-5.5f ); //カメラ(視点)位置
D3DXVECTOR3 vecLookatPt( 0.0f, 0.0f, 0.0f );//注視位置
D3DXVECTOR3 vecUpVec( 0.0f, 1.0f, 0.0f );//上方位置
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vecEyePt, &vecLookatPt, &vecUpVec );
pDevice->SetTransform( D3DTS_VIEW, &matView );
// プロジェクショントランスフォーム(射影変換)
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, (FLOAT)WINDOW_WIDTH/(FLOAT)WINDOW_HEIGHT, 1.0f, 100.0f );
pDevice->SetTransform( D3DTS_PROJECTION, &matProj );
// ライトをあてる 白色で鏡面反射ありに設定
D3DXVECTOR3 vecDirection(1,-0.5,1);
D3DLIGHT9 light;
ZeroMemory( &light, sizeof(D3DLIGHT9) );
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Specular.r=1.0f;
light.Specular.g=1.0f;
light.Specular.b=1.0f;
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDirection );
light.Range = 200.0f;
pDevice->SetLight( 0, &light );
pDevice->LightEnable( 0, TRUE );
//レンダリング
UpdateFrameMatrices(pThing->pFrameRoot, &matWorld);
DrawFrame(pDevice,pThing->pFrameRoot);
pThing->pAnimController->AdvanceTime(fAnimTime-fAnimTimeHold,NULL);
fAnimTimeHold=fAnimTime;
if(boPlayAnim)
{
fAnimTime+=0.0001f;
}
//ここを加えて見ました//////////////////////////////////
DWORD mensu = Thing[0].pMesh->GetNumFaces();//←←←←←ここで止まってしまうみたいです。
char co[30];
sprintf_s(co,"面数:%2d",int(mensu));
RenderString(co,10,64);
////////////////////////////////////////////////////////
}