首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于3D模型的世界矩阵的DirectX相机?

基于3D模型的世界矩阵的DirectX相机?
EN

Stack Overflow用户
提问于 2012-03-29 02:21:03
回答 2查看 1.8K关注 0票数 0

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

有没有办法利用每个对象的worldMatrix?(下面是一个对象的示例。这是一颗自转和公转的行星)

代码语言:javascript
复制
//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;

我真的在努力寻找一种优雅的方式来实现这一点,所以任何建议都会非常感谢。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-29 11:35:22

有没有办法利用每个对象的worldMatrix?

对象矩阵可以这样表示:

代码语言:javascript
复制
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’)向量等的对应元素。

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-03-29 10:12:59

我会通过将相机的位置设置为与要跟踪的对象相同的位置来实现这一点。如果您的对象保存在向量中,这将使您更容易通过简单地将向量中的索引递增到下一个对象来更改要跟随的对象。将对象的位置应用于摄影机的世界位置后,应根据摄影机的偏移量调用MatrixTranslation。这些都是为了获得好的效果而需要调整的值。摄像机的lookat元素应该等于对象的位置,以便摄像机直接看着它。如果你不想让相机直接看着物体,你也可以平移它。最后,相机上的上方向向量当然应该指向上方。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9913421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档