mal etwas genauer, in der Hoffnung, dass MD3 nicht OT ist, denn MD2 habe ich ja auch schon irgendwo im Forum entdeckt.
(vielleicht könnte man diesen Thread irgendwie doch in die Spieleprogrammierung umrubeln... oder eben löschen)
ich habe folgenden Code (diesmal richtig geschrieben :-):
HRESULT hr = E_FAIL;
TCHAR strDir[MAX_PATH] = "", strFN[MAX_PATH];
if (pstrModelsRootDir)
{
lstrcpy(strDir, pstrModelsRootDir);
int iLen = lstrlen(strDir);
if (iLen > 0 && strDir[iLen - 1] != '\\')
lstrcat(strDir, "\\");
}
D3DXVECTOR3 vHeadPos, vUpperPos, vLowerPos, vTempPos;
D3DXMATRIX matHeadDir, matUpperDir, matLowerDir, matTempDir;
if (m_pMD3Head)
{
sprintf(strFN, "%s%s\\%s.md3", strDir, m_strName, m_pMD3Head->GetName());
hr = m_pMD3Head->CreateModel(lpD3Ddevice, strFN, bLogFile);
if (FAILED(hr))
return hr;
m_pMD3Head->GetMD3Tag(&vTempPos, &matTempDir, "tag_head");
m_pMD3Head->SetPosition(&vTempPos);
m_pMD3Head->SetMatrixRotation(&matTempDir);
if (m_pMD3Upper)
{
sprintf(strFN, "%s%s\\%s.md3", strDir, m_strName, m_pMD3Upper->GetName());
hr = m_pMD3Upper->CreateModel(lpD3Ddevice, strFN, bLogFile);
if (FAILED(hr))
return hr;
// nun ham wa das Tag-Dreieck mit seinen drei ecken
m_pMD3Upper->GetMD3Tag(&vTempPos, &matTempDir, "tag_head");
// Positionierung des Heads
m_pMD3Head->SetPosition(&vTempPos);
// Rotation des Heads
m_pMD3Head->SetMatrixRotation(&matTempDir);
m_pMD3Upper->GetMD3Tag(&vTempPos, &matTempDir, "tag_weapon");
m_pMD3Upper->GetMD3Tag(&vTempPos, &matTempDir, "tag_torso");
m_pMD3Upper->SetPosition(&vTempPos);
m_pMD3Upper->SetMatrixRotation(&matTempDir);
if (m_pMD3Lower)
{
sprintf(strFN, "%s%s\\%s.md3", strDir, m_strName, m_pMD3Lower->GetName());
hr = m_pMD3Lower->CreateModel(lpD3Ddevice, strFN, bLogFile);
if (FAILED(hr))
return hr;
m_pMD3Lower->GetMD3Tag(&vTempPos, &matTempDir, "tag_torso");
m_pMD3Upper->SetPosition(&vTempPos);
// Positionierung des Torsos
m_pMD3Upper->SetPosition(&vTempPos);
m_pMD3Upper->SetMatrixRotation(&matTempDir);
// m_pMD3Lower->GetMD3Tag(&vTempPos, &matTempDir, "tag_lower");
// m_pMD3Lower->SetPosition(&vTempPos);
// D3DXMatrixTranslation(&m_matLowerPos, 0.0f, vTempPos.y, vTempPos.z);
}
}
}
return hr;
dort kann man schön sehen, dass ich die einzelnen Modellkomponenten Head, Upper und Lower lade. Diese Komponente Lower enthält die Position für Upper. Upper enthält eine Rotationsmatrix für sich selbst, Upper enthält die relative Position für Head und Head enthält die Rotationsmatrix für sich selbst.
(Soweit ich das überhaupt richtig begriffen habe)
Nun Kann ich doch Upper mit der relativen Position, die in Lower enthalten ist, mit SetPosition TransformCoords(...) verschieben und die Rotation mit der Upper-Matrix durchführen, nich?
Dann müsste doch Upper auf Lower "sitzen" und evtl. etwas gedreht.
(Ich hoffe, ich habe die Matrix richtig ausgelesen...)
Aber Upper sitzt irgendwo anders im weiten Raum. Das gleiche Problem hat der Kopf. Diese kopflosen Figuren eignen sich nicht so gut für meine Tests. ;-)
Hat jemand ne Ahnung, wo hier der Hund begraben liegt?