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

ThePhil

Frischling

  • »ThePhil« ist der Autor dieses Themas

Beiträge: 23

Beruf: Schüler

  • Private Nachricht senden

1

12.07.2008, 20:11

Problem beim Transformieren aus dem VertexBuffer

Hi alle miteinander *wink*


Endlich bin ich wieder mal dazugekommen ein bisschen in Davids genialem Buch weiterzumachen.
Ich bin gerade dabei die Beispiele des Vertex/Index-Buffer-Kapitel zu machen. Beispiel 1 und 2 hab ich geschafft aber nun hänge ich beim 3. fest.

Aufgabe war eine Funktion zu schreiben, der man einen VertexBuffer und eine Matrix übergibt. Danach soll man die Positionskoordinaten aller Vertizes mit der Matrix transformieren.


Das Problem, welches ich jetzt habe ist folgendes:
Sobald ich das Programm starte und alle Einstellungen vornehme, sieht man zwar die Würfeln kurz aber sie bewegen sich extrem schnell weg, bis der gesamte Bildschirm schwarz ist.
Ich hab schon probiert die Bewegung um Faktoren wie 0.0001 oder noch weniger zu verringern. Hat aber nichts gebracht.
Mit dem Debuger hab ich mir die Funktion auch schon mal angesehen, aber mir wären keinen "abnormalen" Koordinaten aufgefallen.


Hier der Code der Funktion:

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
tbResult TransformVertexPosition(IDirect3DVertexBuffer9* pVertexBuffer, const tbMatrix& mTransform)
{
    // Beschreibung des Vertex-Buffers

    D3DVERTEXBUFFER_DESC VBDesc;
    pVertexBuffer->GetDesc(&VBDesc);

    if(VBDesc.FVF & D3DFVF_XYZ) // Besitzt Positionskoordination

    {
        // Anzahl der Vertices berechnen

        unsigned int iVertexSize = D3DXGetFVFVertexSize(VBDesc.FVF);
        unsigned int iNumVertices = VBDesc.Size / iVertexSize;

        // Vertex Buffer sperren und Daten lesen

        BYTE* pVertexData;
        pVertexBuffer->Lock(0, 0, reinterpret_cast<void**>(&pVertexData), D3DLOCK_NOSYSLOCK);
        
        for(unsigned int iVertex = 0; iVertex < iNumVertices; iVertex++)
        {
            // Positionsdaten auslesen

            tbVector3 vPosition(reinterpret_cast<float*>(&pVertexData[iVertex * iVertexSize]));
            
            // Vektor transformieren

            vPosition = tbVector3TransformCoords(vPosition, mTransform);

            // Positionsdaten schreiben

            float* pfPosition = reinterpret_cast<float*>(&pVertexData[iVertex * iVertexSize]);
            pfPosition[0] = vPosition.x;
            pfPosition[1] = vPosition.y;
            pfPosition[2] = vPosition.z;
        }

        pVertexBuffer->Unlock();
    }

    return TB_OK;
}



Wenn noch mehr Code erforderlich ist, kann ich ihn natürlich auch Posten.
Da der selbe Code (bis auf die Fkt) im vorigen Beispiel aber funktioniert hat, würde es mich wundern wenn da wo ein Fehler wäre.


lg
Phil

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.07.2008, 22:31

Zitat

pVertexData[iVertex * iVertexSize]


warum? :?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

12.07.2008, 22:40

Weil es ein BYTE-Zeiger ist ;)

ThePhil

Frischling

  • »ThePhil« ist der Autor dieses Themas

Beiträge: 23

Beruf: Schüler

  • Private Nachricht senden

4

12.07.2008, 22:45

Damit ich die Startadresse des jeweiligen Vertex bekomme.

pVertexData ist ja ein byte Array und iVertexSize gibt die Größe eines Vertex in bytes an.

Also sollte man so auf die Adresse des Vertex kommen.
... Hoffe ich zumindest einmal ;)


edit: zu langsam ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

12.07.2008, 22:47

puh, ich gehör heute wirklich schon ins bett xD

ThePhil

Frischling

  • »ThePhil« ist der Autor dieses Themas

Beiträge: 23

Beruf: Schüler

  • Private Nachricht senden

6

14.07.2008, 14:09

Hab den Fehler gefunden (glaube ich)!

Die Funktion ist anscheinend korrekt.


Ich habe im Programm die Weltmatrix durch die Funktion ersetzt.
Naja hat ja nicht ganz geklappt ;)

Das Problem dass dadurch entstand war, dass ich beim nächsten Durchgang der MessageLoop die transformierten Vertizes nocheinmal tranformiert hab. Und das immer und immer wieder *g*

Werbeanzeige