御返事、ありがとうございます。
参考にしている書籍は、工学社の「はじめての3Dゲーム開発」です。
http://www.kohgakusha.co.jp/books/detai ... 775-1043-6
THING構造体の中身を下記に記します。
コード:
struct THING
{
LPD3DXMESH pMesh;
D3DMATERIAL9* pMeshMaterials;
LPDIRECT3DTEXTURE9* pMeshTextures;
DWORD dwNumMaterials;
D3DXVECTOR3 vecPosition;
THING()
{
ZeroMemory(this,sizeof(THING));
}
};
THING Thing[THING_AMOUNT]; // 構造体配列の宣言
HRESULT InitThing(THING *,LPSTR,D3DXVECTOR3*);
InitThing()の中身です。
コード:
HRESULT InitThing(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)
{
//ワールドトランスフォーム(絶対座標変換)
D3DXMATRIXA16 matWorld,matRotation,matPosition;
//行列の初期化
D3DXMatrixIdentity(&matRotation);
D3DXMatrixIdentity(&matWorld);
//Y軸を中心に回転する変換行列の作成
D3DXMatrixRotationY(&matRotation,pThing->vecPosition.y);
D3DXMatrixMultiply(&matWorld,&matWorld,&matRotation);
//平行移動行列の作成
D3DXMatrixTranslation(&matPosition,pThing->vecPosition.x,pThing->vecPosition.y,
pThing->vecPosition.z);
D3DXMatrixMultiply(&matWorld,&matWorld,&matPosition);
pDevice->SetTransform( D3DTS_WORLD, &matWorld );
// ビュートランスフォーム(視点座標変換)
D3DXVECTOR3 vecEyePt( 0.0f, 15.0f,-15.0f ); //カメラ(視点)位置
D3DXVECTOR3 vecLookatPt( 0.0f, 3.0f, 0.0f );//注視位置
D3DXVECTOR3 vecUpVec( 0.0f, 5.0f, 0.0f );//上方位置
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vecEyePt, &vecLookatPt, &vecUpVec );
pDevice->SetTransform( D3DTS_VIEW, &matView );
// プロジェクショントランスフォーム(射影変換)
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
pDevice->SetTransform( D3DTS_PROJECTION, &matProj );
// ライトをあてる 白色で鏡面反射ありに設定
D3DXVECTOR3 vecDirection(1,1,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 );
// レンダリング
for( DWORD i=0; i<pThing->dwNumMaterials; i++ )
{
pDevice->SetMaterial( &pThing->pMeshMaterials[i] );
pDevice->SetTexture( 0,pThing->pMeshTextures[i] );
pThing->pMesh->DrawSubset( i );
}
}