2012-03-28 14 views
0

私は3D空間内を移動する複数のオブジェクトを持っており、ボタンを押したときにカメラをスナップして選択したオブジェクトに従う方法を探しています。DirectXカメラは、3Dモデルの世界のマトリックスに基づいてフォローしますか?

各オブジェクトのworldMatrixを使用する方法はありますか?

//set up matrices for rendering 
D3DXMATRIX worldMatrixMer, viewMatrixMer, projectionMatrixMer; 
m_Camera->GetViewMatrix(viewMatrixMer); 
m_D3D->GetWorldMatrix(worldMatrixMer); 
m_D3D->GetProjectionMatrix(projectionMatrixMer); 
D3DXMatrixRotationX(&matRotateX, rx/65.0f); 
//Rotate about Y axis 
D3DXMatrixRotationY(&matRotateY, rotation * 15.0f); 
D3DXMatrixRotationZ(&matRotateZ, rz/65.0f); 
//Collate Rot Matrices 
D3DXMATRIX rotMatrixMer = matRotateX * matRotateY * matRotateZ; 
D3DXVECTOR3 newVecDirMer; 
D3DXVec3TransformCoord(&newVecDirMer, &initVecDirMer, &rotMatrixMer); 
D3DXVec3Normalize(&currentVecDirMer, &newVecDirMer); 
//Create the size of the object 
D3DXMATRIX matScaleMer; 
D3DXMatrixScaling(&matScaleMer, 0.1f, 0.1f, 0.1f); 
//Starting position of object 
D3DXMatrixTranslation(&matTranslateMer, 0.0f, 0.0f, 3.5983f * 3); 
//Rotate about it's own axis 
D3DXMatrixRotationY(&worldMatrixMer, rotation); 
worldMatrixMer *= rotMatrixMer * matScaleMer * matTranslateMer; 
//'Orbit' 
D3DXMatrixRotationY(&matOrbit, (-1000.0f * rotation)/88); 
worldMatrixMer *= matOrbit; 

私は本当にこれが起こる作るのエレガントな方法を見つけようとしている(以下は、1つのオブジェクトの例である。この1つは&軌道を回る惑星である)ので、任意の提案をいただければ幸いです。

おかげ

答えて

1

各オブジェクトのworldMatrixを使用する方法はありますか?形質転換されたオブジェクトX( 'ローカルX」 - - オブジェクトの位置ベクトル、objx

objx.x  objx.y  objx.z 0 //m[0][0]..m[0][3] or _11, _12, _13, _14 
objy.x  objy.y  objy.z 0 //m[1][0]..m[1][3] or _21, _22, _23, _24 
objz.x  objz.y  objz.z 0 //m[2][0]..m[2][3] or _31, _32, _33, _34 
objpos.x objpos.y objpos.z 1 //m[3][0]..m[3][3] or _41, _42, _43, _44 

m[][]_11 .. _44D3DMATRIXの要素、objposに対応している:

オブジェクトマトリックスは、このように表すことができます。

最後の列(m [0..3] [3])が0,0,0,1である限り、オブジェクトの位置とその "x"を抽出することができます。 "y"、 "z"ベクトル( "側"、 "上"、 "前" - これはアプリに依存しますカチオン)を含む。最後の列が "0、0、0、1"でなければ、それは投影行列であり、これから簡単にオブジェクトデータを抽出することはできません。

そこから、カメラで何でもできます。

+0

私のためにマトリックスを分解してくれてありがとう、これはおそらく私がそれについて行く方法です。 –

0

オブジェクトが従うべきと私は同じにカメラの位置を設定することにより、この近づくだろう。あなたのオブジェクトがベクトルに保持されている場合、これはベクトル内のインデックスを次のオブジェクトにインクリメントするだけで、どのオブジェクトを変更するのが簡単になります。オブジェクトの位置をカメラのワールド位置に適用したら、カメラに必要なオフセットでMatrixTranslationを呼び出す必要があります。これらは、良い効果を得るために一緒に遊ぶ価値です。カメラのlookat要素は、カメラが直接カメラを見ているように、オブジェクトの位置と等しくなければなりません。また、カメラでオブジェクトを直接見るのではなく、そのオブジェクトを翻訳することもできます。最後に、カメラ上の上のベクトルは、もちろん、指すべきです。

これが役に立ちます。

関連する問題