Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Перевод OpenGL-> DirectX


Автор: kurlyak 8.3.2012, 14:06
Я пробую кусок программы из 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);

Заранее благодарен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)