0

複数のオブジェクトが 3D 空間内を動き回っており、ボタンを押すと、カメラがスナップして選択したオブジェクトを追跡する方法を探しています。

各オブジェクトの worldMatrix を利用する方法はありますか? (以下は 1 つのオブジェクトの例です。これは、回転および周回する惑星です)

//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;

私は本当にこれを実現するエレガントな方法を見つけようとしているので、どんな提案でも大歓迎です。

ありがとう

4

2 に答える 2

1

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

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

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 - オブジェクト位置ベクトル、objx - オブジェクト x (ワールド空間に変換された「ローカル x」) ベクトルなどの対応する要素です。

したがって、最後の列 (m[0..3][3]) が 0、0、0、1 である限り、オブジェクトの位置とその "x"、"y"、"z" ベクトル ("side" 、「上」、「前」 - アプリケーションによって異なります) マトリックスから。最後の列が「0、0、0、1」でない場合、それは射影行列であり、そこからオブジェクト データを簡単に抽出することはできません。

そこから、カメラでやりたいことが何でもできます。

于 2012-03-29T03:35:21.863 に答える
0

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

お役に立てれば。

于 2012-03-29T02:12:58.867 に答える