Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

07.08.2003, 20:24

MD3-Model-Dateiformat

Hi Leute,
vielleicht etwas OT, aber ich habe keine NG in normalisierter Richtung MD3 gefunden? ;-)

Ich habe im Web unzählige Webseiten zum MD3-Format
gefunden, aber in keiner habe ich einen Hinweis gefunden,
wie ich die Tags (nach Header) mit Hilfe der Tag-Position und der 3x3-Matrix an die richtige Stelle positioniere.
Ich habe angenommen, der im Tag vorhandene Positionsvector
kann direkt mit der World-Matrix multipiziert und dann mit
d3ddevice->SetTransform(..._WORLD, &matWorld); an die
richtigen Stellen positioniert werden.
Aber da stimmt was nicht. Die Teile werden völlig verschoben
dargestellt. Der Kopf steht auf den halb gedrehten Beinen (Mynx sieht vielleicht bschi... aus) :-)
Was fange ich mit der Matrix im MD3-Tag an? Wie
positioniere ich richtig?
Hat jemand einen Link dazu oder vielleich ne Info?
Danke
Jens

Anonymous

unregistriert

2

08.08.2003, 17:44

ähm immer noch das gleiche Thema :-(

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?

Anonymous

unregistriert

3

10.08.2003, 23:09

Also bei meinem Code saß Upper korrekt auf Lower, mit Head hatte ich aber Probleme. Die Matrix im Tag in Lower ist für die Positionierung von Upper. Wie Du den Head noch draufsetzt musst Du selbst mal probieren. Ich glaube dafür brauchst Du die Matrix von Lower UND Upper.

Anonymous

unregistriert

4

11.08.2003, 10:12

Die Matrix

Hallo,
danke Dir.

Bei Dir sitzt Upper korrekt?

Wie hast Du denn die Matrix ausgelesen? Ebenfalls so:
for (int j=0;j < m_iNumTags; j++)
{
if (!strcmp(m_md3Tags[iFromBoneFrame][j].cTagName, pstrTagName))
{
// y u. z vertauschen (versuchsweise) x,y,z -> x,z,y
pPos->x = m_md3Tags[iFromBoneFrame][j].pos[0];
pPos->y = m_md3Tags[iFromBoneFrame][j].pos[1];
pPos->z = m_md3Tags[iFromBoneFrame][j].pos[2];
// Anordnung der Matrix ist mir en Rätsel
pMatrix->_11 = m_md3Tags[iFromBoneFrame][j].fMatrix[0][0];
pMatrix->_12 = m_md3Tags[iFromBoneFrame][j].fMatrix[0][1];
pMatrix->_13 = m_md3Tags[iFromBoneFrame][j].fMatrix[0][2];
pMatrix->_14 = 0.0f;
pMatrix->_21 = m_md3Tags[iFromBoneFrame][j].fMatrix[1][0];
pMatrix->_22 = m_md3Tags[iFromBoneFrame][j].fMatrix[1][1];
pMatrix->_23 = m_md3Tags[iFromBoneFrame][j].fMatrix[1][2];
pMatrix->_24 = 0.0f;
// rechtsgerichtetes Weltkoordinatensystem (z = -z)
pMatrix->_31 = m_md3Tags[iFromBoneFrame][j].fMatrix[2][0];
pMatrix->_32 = m_md3Tags[iFromBoneFrame][j].fMatrix[2][1];
pMatrix->_33 = m_md3Tags[iFromBoneFrame][j].fMatrix[2][2];
pMatrix->_34 = 0.0f;
pMatrix->_41 = 0.0f;
pMatrix->_42 = 0.0f;
pMatrix->_43 = 0.0f;
pMatrix->_44 = 1.0f;
return TRUE;
}


Jens

Anonymous

unregistriert

5

11.08.2003, 11:42

Bin jetzt zu faul Deinen Sourcecode durchzugehen.

(Link)
Aber ich habe die 3x3-Matrix einfach in die linke obere Ecke der DirectX-typischen 4x4 Matrix gesetzt und die Position (x, y, z) in 41, 42, 43. Achja, 44 muss man auf 1 setzen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

11.08.2003, 12:17

Ich schätze mal, dass das MD3-Format andere Matrizen verwendet als Direct3D. Du musst die Matrix darum wahrscheinlich transponieren (M31 wird zu M13, M22 bleibt M22, M42 wird M24 usw.) und vielleicht noch y und z vertauschen. Das habe ich zumindest bei 3DS-Dateien immer tun müssen.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

11.08.2003, 12:34

Ich weiß ja nicht ob das bei den Models genau so ist aber bei den Q3 Maps zeigt die Z-Achse nach oben. Könnte sein das das bei den Models genau so ist dann musste Y und Z vertauschen. Wäre ja logisch weil es ja komisch wäre die Koordinaten bei den Maps zu ändern die Models aber zu lassen.

Anonymous

unregistriert

8

11.08.2003, 13:55

Ja ist so, aber deswegen dürfte nicht alles verschoben sein, da ja Lower UND Upper UND Head im Raum liegen anstatt stehen. ;-)

Anonymous

unregistriert

9

11.08.2003, 14:39

MD3-Matrix auslesen

Hallochen,
meinst Du Y und Z vertauschen so?

pPos->x = m_md3Tags[iFromBoneFrame][j].pos[0];
pPos->z = m_md3Tags[iFromBoneFrame][j].pos[1];
pPos->y = m_md3Tags[iFromBoneFrame][j].pos[2];


und die Matrixkomponenten z. B. so?

// Anordnung der Matrix ist mir en Rätsel
pMatrix->_34 = m_md3Tags[iFromBoneFrame][j].fMatrix[0][0];
pMatrix->_32 = m_md3Tags[iFromBoneFrame][j].fMatrix[0][1];
pMatrix->_31 = m_md3Tags[iFromBoneFrame][j].fMatrix[0][2];
pMatrix->_14 = 0.0f;
pMatrix->_23 = m_md3Tags[iFromBoneFrame][j].fMatrix[1][0];
pMatrix->_22 = m_md3Tags[iFromBoneFrame][j].fMatrix[1][1];
pMatrix->_21 = m_md3Tags[iFromBoneFrame][j].fMatrix[1][2];
pMatrix->_24 = 0.0f;
// rechtsgerichtetes Weltkoordinatensystem (z = -z)
pMatrix->_13 = m_md3Tags[iFromBoneFrame][j].fMatrix[2][0];
pMatrix->_12 = m_md3Tags[iFromBoneFrame][j].fMatrix[2][1];
pMatrix->_13 = m_md3Tags[iFromBoneFrame][j].fMatrix[2][2];
pMatrix->_34 = 0.0f;
pMatrix->_41 = 0.0f;
pMatrix->_42 = 0.0f;
pMatrix->_43 = 0.0f;
pMatrix->_44 = 1.0f;

Mir ist solch eine Vertauschung noch nie aufgefallen. Warte mal, Du sagtest, in Deiner 3Ds-Klasse...
Gut da sehe ich nach...
Bis danne
Jens

Anonymous

unregistriert

10

11.08.2003, 14:41

was issn hier passiert

ach mist, verschrieben. In der Matrix wollte ich natürlich immer
3
2
1
4
...
3
2
1
4
usw zuweisen und nicht son Mist wie da oben machen.

Werbeanzeige