我有多个物体在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( ¤tVecDirMer, &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;
我真的想找到一种优雅的方式来实现这一点,所以任何建议都会非常感激。
由于
答案 0 :(得分: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
.. _44
是D3DMATRIX
的对应元素,objpos - 对象位置向量,objx - 对象x('本地x'转换为世界空间)矢量等。
因此,只要最后一列(m [0..3] [3])为0,0,0,1,就可以提取对象位置及其“x”,“y”,“z”向量(矩阵中的“边”,“上”,“前” - 这取决于应用。如果最后一列不是“0,0,0,1”,那么它就是投影矩阵,你不能轻易地从中提取对象数据。
从那里你可以用相机做任何你想做的事。
答案 1 :(得分:0)
我会通过将相机的位置设置为与要遵循的对象相同的位置来实现此目的。如果您的对象保存在向量中,则可以通过简单地将向量中的索引递增到下一个对象来更轻松地更改要遵循的对象。将对象的位置应用到摄像机的世界位置后,您应该根据摄像机所需的偏移调用MatrixTranslation。这些将成为获得良好效果的价值观。相机的lookat元素应该等于对象的位置,以便相机直接看它。如果您不希望相机直接看到对象,您也可以翻译它。最后,相机上的向上矢量当然应该指向上方。
希望这有帮助。