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

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

11

05.06.2007, 15:15

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.

tbModel::GetNumVertices() liefert eigentlich die Anzahl der Vertizes und nicht den größten Vertex (müsste dann +1 bedeuten). Somit stimmt es nicht: Es steht ja nicht iVertex<= X ;)

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

Hier lösche ich den Speicher wieder, denn ich mit new erzeugt hatte.
To go back to the drawing board is not everyone's cup of tea! :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

05.06.2007, 15:54

Hab ichs mir doch gedacht. ;-) Dieses Überprüfen auf einen Nullpointer (if ( x )) ist Schwachsinn und ist nicht notwendig.

Aber das wird eher nicht dein Problem darstellen. Geh mal Schrittweise die Funktion mit dem Debugger durch.
@D13_Dreinig

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

13

05.06.2007, 18:58

Zitat von »"David_pb"«

Hab ichs mir doch gedacht. Wink Dieses Überprüfen auf einen Nullpointer (if ( x )) ist Schwachsinn und ist nicht notwendig.

Wenn du meinst? Aber das musst du mit dem Autor regeln. Ich sehe eigentlich nicht ein, wo das Problem liegt.

Also ich habe jetzt 2 Fehler gefunden:
1. Der Fehler tritt doch in dieser Zeile:

C-/C++-Quelltext

1
TB_SAFE_DELETE(pVertexBuffer);

Wenn ich die auskommentiere, dann kann ich wenigstens etwas auf dem Bildschirm sehen, bis es dann mit der Fehlermeldung abstürzt. Ich lösche hier den Speicher, denn es wahrscheinlich nicht exestiert. Ich benutze hier ja den =-Operator und nicht die Init-Funktion. Genauer weis ich es nicht.

2. Es wird über den Heapspeicher geschrieben. Grund: Ein Vertex in diesem Modell verbraucht 32 Bytes an Speicher, aber tbVector3 erst 12. In tbVertexBuffer::SetVertex heißt es dann "m_pBuffer + dwVertex * m_dwVertexSize". Also geht der letzte Vertex (um genau 20 Bytes) aus dem Speicher des Buffers heraus. Ich habe dann eine Struktur erzeugt, die tbVector3 und zwei weitere Elemente hat (zusammen 32 Bytes). Die letzteren werden aber gar nicht benutzt. Gibt es hier eigentlich eine bessere Methode?

Jetzt startet sich zwar das Programm und läuft einweindfrei, nur mit einem winzigen Problem: Man kann kaum das Modell erkennen --> Irgendwie werden die Positionsvektoren falsch transformiert. Ich werde dann weiter suchen. ;)
To go back to the drawing board is not everyone's cup of tea! :-)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

05.06.2007, 20:07

Zitat von »"Progater"«

Wenn du meinst? Aber das musst du mit dem Autor regeln. Ich sehe eigentlich nicht ein, wo das Problem liegt.


er meint, dass es sinnlos ist. der c++ standard garantiert, dass delete 0; nichts tut. die abfrage ob x == 0 ist also überflüssig. problem gibts hier keines ;)

Zitat von »"Progater"«


Quellcode

1
Expression: _CrtIsValidHeapPointer(pUserData)



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.

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

15

05.06.2007, 21:04

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.

Also: 1. Ich habe das Problem gelöst (steht oben). Es ging halt darum, dass in der for-Schleife etwas von den Grenzen des Vertex-Buffers ging.

2. Wie der Titel und die Funktion verraten, möchte ich die Positionsvektoren des Modells manuell transformieren. Klar geht es auch besser, ich wollte es mal auf die andere Art versuchen (steht auch oben):

Zitat von »"Progater"«

Also der Fehler steckt definitiv in dieser Funktion.
Probe:
Code (C++):
tbDirect3D::Instance().SetTransform(D3DTS_WORLD, mWorld);
, statt TransformVertices.


3. Das jetzige Problem liegt darin, dass die Vertizes falsch transformiert werden. Ich versuche grad mit dem Debugger die Fehlerquelle zu finden. ;)
To go back to the drawing board is not everyone's cup of tea! :-)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

05.06.2007, 21:09

Zitat von »"Progater"«

3. Das jetzige Problem liegt darin, dass die Vertizes falsch transformiert werden.


dann solltest du uns evtl. mal zeigen wie die vertices transformiert werden ;)

z.b. mit welcher matrix werden sie transformiert? wie sieht diese matrix aus?
wie renderst du das ergebnis dann?

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

17

05.06.2007, 21:30

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); 

Ich hoffe, ich muss es nicht noch mal angeben. ;)

Zitat von »"dot"«

z.b. mit welcher matrix werden sie transformiert? wie sieht diese matrix aus?
wie renderst du das ergebnis dann?

Ich glaube nicht, dass es an der Matrix liegt. Wenn ich statt der Funktion "tbDirect3D::Instance().SetTransform(D3DTS_WORLD, mWorld); " aufrufe, wird alles richtig transformiert.
Ansonsten wird die Funktion so aufgerufen:

C-/C++-Quelltext

1
    if(TransformVertices(g_pModel, mWorld)) TB_ERROR("Fehler beim Transformieren der Vertizes", TB_STOP);
To go back to the drawing board is not everyone's cup of tea! :-)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

05.06.2007, 21:34

also transformierst du die vertices mit der weltmatrix.
beim rendern des ganzen setzt du D3DTS_WORLD dann auf die einheitsmatrix? bzw. ist sichergestellt, dass D3DTS_WORLD die einheitsmatrix ist? (wenn nicht, dann solltest du das tun)

C-/C++-Quelltext

1
tbVector3TransformCoords(pModelVertex[iVertex].vPosition, mMatrix);


ja, aber wer sagt, dass diese funktion das richtige tut?
bekommt sie überhaupt den richtigen input (sind die werte die du aus dem vertexbuffer liest richtig)?

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

19

05.06.2007, 21:54

Zitat von »"dot"«

ja, aber wer sagt, dass diese funktion das richtige tut?

Blöde Frage: Hast du überhaupt mal mit der TriBase-Engine gearbeitet?
Diese Funktion tut schon das Richtige. Hab' ich mit etwas anderem schon ausprobiert.
Das mit DXTS_WORLD auf die Identitätsmatrix zu setzen war eine gute Idee. Hat leider aber nicht viel gebracht.

Also so rufe ich die 3 Funktionen in der Render-Methode:

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();


Die überarbeitete TransformVertices-Methode schaut so aus:

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


Und den Debugger habe ich schon hundert mal laufen lassen und nichts gefunden. Das sind alle Informationen, die ich jetzt habe. ;)
To go back to the drawing board is not everyone's cup of tea! :-)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

05.06.2007, 21:59

Zitat von »"Progater"«

Blöde Frage: Hast du überhaupt mal mit der TriBase-Engine gearbeitet?

nein, ich weis nur, dass hie und da mal leute bugs in der tribase engine finden/gefunden haben...

mit "tut die funktion das richtige" war eher auch gemeint, ob das was rauskommt dem entspricht was du erwartest. du hattest da ja einige probleme mit deiner vertexstruktur und so. wer sagt also dass die funktion überhaupt mit den richtigen daten arbeitet (wer sagt überhaupt dass aus dem vertexbuffer sinnvolle daten kommen)...
außerdem macht es einen unterschied ob man jetzt z.b. einen punkt-, richtungs- oder normalvektor mit einer matrix transformiert und deshalb gibts vermutlich auch in der triBase engine mehrere funktionen um vektoren mit matritzen zu multiplizieren. vom namen her sollte die aber passen.

Zitat von »"Progater"«


Und den Debugger habe ich schon hundert mal laufen lassen und nichts gefunden. Das sind alle Informationen, die ich jetzt habe. ;)


was hat dir der debugger zum thema "bekommt die funktion auch den richtigen input" gesagt?

Werbeanzeige