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
Zitat von »"Tobias Ribizel"«
for(int iVertex = 0; iVertex < pModel->GetNumVertices()-1; iVertex++)
Die Anzahl ist bei Arrays, die bei 0 anfangen zu zählen, um eins größer als der größte Index.
Zitat von »"David_pb"«
Mal so nebenbei, was macht egtl die Zeile:
Code (C++):
TB_SAFE_DELETE_ARRAY(pModelVertex);
C-/C++-Quelltext |
|
1 |
#define TB_SAFE_DELETE_ARRAY(x) {if((x)) {delete[] (x); (x) = NULL;}} // Sicheres Löschen eines Arrays |
Zitat von »"David_pb"«
Hab ichs mir doch gedacht. Wink Dieses Überprüfen auf einen Nullpointer (if ( x )) ist Schwachsinn und ist nicht notwendig.
C-/C++-Quelltext |
|
1 |
TB_SAFE_DELETE(pVertexBuffer); |
Zitat von »"Progater"«
Wenn du meinst? Aber das musst du mit dem Autor regeln. Ich sehe eigentlich nicht ein, wo das Problem liegt.
Zitat von »"Progater"«
Quellcode
1 Expression: _CrtIsValidHeapPointer(pUserData)
Zitat von »"dot"«
der pointer scheint müll zu sein. deswegen nochmal die frage:
welchen wert hat er und wo bekommt er ihn her
erklär mit mal was genau du mit dem code da oben erreichen willst. es gibt sicher viele wege das besser und vor allem performanter zu machen.
Zitat von »"Progater"«
Also der Fehler steckt definitiv in dieser Funktion.
Probe:
Code (C++):
tbDirect3D::Instance().SetTransform(D3DTS_WORLD, mWorld);
, statt TransformVertices.
Zitat von »"Progater"«
3. Das jetzige Problem liegt darin, dass die Vertizes falsch transformiert werden.
Zitat von »"dot"«
dann solltest du uns evtl. mal zeigen wie die vertices transformiert werden Wink
C-/C++-Quelltext |
|
1 |
pModelVertex[iVertex].vPosition = tbVector3TransformCoords(pModelVertex[iVertex].vPosition, mMatrix);
|
Zitat von »"dot"«
z.b. mit welcher matrix werden sie transformiert? wie sieht diese matrix aus?
wie renderst du das ergebnis dann?
C-/C++-Quelltext |
|
1 |
if(TransformVertices(g_pModel, mWorld)) TB_ERROR("Fehler beim Transformieren der Vertizes", TB_STOP); |
C-/C++-Quelltext |
|
1 |
tbVector3TransformCoords(pModelVertex[iVertex].vPosition, mMatrix); |
Zitat von »"dot"«
ja, aber wer sagt, dass diese funktion das richtige tut?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
g_D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity()); // Vertizes manuell transformieren if(TransformVertices(g_pModel, mWorld)) TB_ERROR("Fehler beim Transformieren der Vertizes", TB_STOP); // Das Modell rendern g_pModel->Render(); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
tbResult TransformVertices(tbModel *pModel, const tbMatrix& mMatrix) { // Vertexbuffer abfragen tbVertexBuffer *pVertexBuffer = pModel->GetVertexBuffer(); struct Vertex { tbVector3 vPosition; DWORD Reserved1; tbColor Reserved2; }; // Speicher für Vertizes (Positionen) reservieren Vertex *pModelVertex = NULL; pModelVertex = new Vertex[pModel->GetNumVertices()]; for(DWORD iVertex = 0; iVertex < pModel->GetNumVertices(); iVertex++) { // Vertex abfragen pVertexBuffer->GetVertex(iVertex, (void*)(&pModelVertex[iVertex])); // Transformieren... pModelVertex[iVertex].vPosition = tbVector3TransformCoords(pModelVertex[iVertex].vPosition, mMatrix); // Wieder setzen pVertexBuffer->SetVertex(iVertex, (void*)(&pModelVertex[iVertex])); } pVertexBuffer->Update(); // Speicher freigeben TB_SAFE_DELETE_ARRAY(pModelVertex); // TB_SAFE_DELETE(pVertexBuffer); return TB_OK; } // TransformVertices |
Zitat von »"Progater"«
Blöde Frage: Hast du überhaupt mal mit der TriBase-Engine gearbeitet?
Zitat von »"Progater"«
Und den Debugger habe ich schon hundert mal laufen lassen und nichts gefunden. Das sind alle Informationen, die ich jetzt habe.
Werbeanzeige