0

我有多个对象在 3D 空间中移动,我正在寻找方法来按下按钮,让相机捕捉并跟随所选对象。

有没有办法利用每个对象的世界矩阵?(下面是一个物体的例子。这个是一个自转和轨道的行星)

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

有没有办法利用每个对象的世界矩阵?

对象矩阵可以这样表示:

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.._44是 的对应元素D3DMATRIX,objpos - 对象位置向量,objx - 对象 x('local x' 转换为世界空间)向量等。

所以只要最后一列 (m[0..3][3]) 为 0, 0, 0, 1 就可以提取对象位置及其“x”、“y”、“z”向量(“side” , "up", "front" - 这取决于应用程序)来自矩阵。如果最后一列不是“0, 0, 0, 1”,那么它是投影矩阵,你不能这么容易地从中提取对象数据。

从那里你可以用你的相机做任何你想做的事情。

于 2012-03-29T03:35:21.863 回答
0

我会通过将相机的位置设置为与要跟踪的对象相同来解决这个问题。如果您的对象保存在一个向量中,这将更容易通过简单地将向量中的索引增加到下一个对象来更改要跟随的对象。将对象的位置应用到相机的世界位置后,您应该通过您想要的相机偏移量调用 MatrixTranslation。这些将是获得良好效果的价值。相机的lookat 元素应该等于对象的位置,以便相机直接看它。如果你不想让相机直接看物体,你也可以翻译它。最后,相机上的向上矢量当然应该指向上方。

希望这可以帮助。

于 2012-03-29T02:12:58.867 回答