Я пробую кусок программы из OpenGL перевести в DirectX и стокнулся с проблемой матриц. А именно glPushMatrix, glPopMatrix. Я аналогично этим GL функциям сделал так в программе DirectX (просьба не обращать внимания на неизвестность в коде и неизвестные переменные меня интересует только работа glPushMatrix, glPopMatrix): | Код | bool bPopMx; D3DXMATRIX mxRes; D3DXMatrixIdentity(&mxRes); i=0;
for (UINT k = 0; k < m_pMeshes[i].nNumMeshes; k++) { if (k == 0) { // first mesh - position to world coordinates, set rotation D3DXMATRIX RotYAbs, Transl1, Transl2; D3DXMatrixTranslation(&Transl1, ItemAbsX, ItemAbsY, ItemAbsZ); D3DXMatrixRotationY(&RotYAbs, ItemAbsRotY); D3DXMatrixTranslation(&Transl2, ItemAnimX, ItemAnimY, ItemAnimZ); mxRes = Transl1 * RotYAbs * Transl2; /* glTranslated(ItemAbsX, ItemAbsY, ItemAbsZ); glRotated(ItemAbsRotY, 0, 1, 0); glTranslated(ItemAnimX, ItemAnimY, ItemAnimZ); */
ItemRelX = 0; ItemRelY = 0; ItemRelZ = 0; } else { // (i > 0): second+ meshes - position relative to first mesh (from MeshTree) bit32 *itmp; tr2_meshtree *MeshTree;
itmp = (bit32 *)Level->MeshTrees; MeshTree = (tr2_meshtree *)&itmp[Level->Moveables[k].MeshTree + ((i - 1) * 4)];
ItemRelX = MeshTree->x; ItemRelY = MeshTree->y; ItemRelZ = MeshTree->z; if (MeshTree->Flags & 0x01) { // return to last anchor //glPopMatrix(); bPopMx = true; } if (MeshTree->Flags & 0x02) { // make new anchor //glPushMatrix(); bPopMx = false; } }
// translate, rotate, and render. //glTranslated(ItemRelX, ItemRelY, ItemRelZ); D3DXMATRIX mxTransl3; D3DXMatrixTranslation(&mxTransl3,ItemRelX, ItemRelY, ItemRelZ); D3DXMATRIX mxRotY, mxRotX, mxRotZ; if (FrameRotationY[i]) { D3DXMatrixRotationY(&mxRotY,FrameRotationY[i]); //glRotated(FrameRotationY[i], 0, 1, 0); } if (FrameRotationX[i]) { D3DXMatrixRotationX(&mxRotX,FrameRotationX[i]); //glRotated(FrameRotationX[i], 1, 0, 0); } if (FrameRotationZ[i]) { D3DXMatrixRotationZ(&mxRotZ,FrameRotationZ[i]); //glRotated(FrameRotationZ[i], 0, 0, 1); }
if(bPopMx) { mxRes = mxRes * mxRotX * mxRotY * mxRotZ; } else { D3DXMatrixIdentity(&mxRes); }
m_pD3DDevice->SetTransform(D3DTS_WORLD, &mxRes);
|
Заранее благодарен.
|