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
[...]Schreiben Sie eine Funktion namens TransformVertexPositions, die einen Vertex-Buffer und eine Matrix als Parameter erwartet und dann alle Vertizes im Vertex-Buffer mit dieser Matrix transformiert![...]
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 |
tbResult TransformVertexPositions(PDIRECT3DVERTEXBUFFER9 VertexBuffer,tbMatrix TransfMatrix) { D3DVERTEXBUFFER_DESC Desc; VertexBuffer->GetDesc(&Desc); if (Desc.FVF != SVertex::dwFVF) // wie frage ich einzelne Flags ab??? { TB_ERROR("Der VertexBuffer hat nicht das D3DFVF_XYZ Flag!",TB_ERROR); } UINT FVFSize = D3DXGetFVFVertexSize(Desc.FVF); int VerticesInBuffer = Desc.Size / FVFSize; SVertex* pvVertex = NULL; VertexBuffer->Lock(0,0,(void**) (&pvVertex),D3DLOCK_NOSYSLOCK); for (int i = 0; i < VerticesInBuffer; i++) { pvVertex[i].vPosition = tbVector3TransformCoords(pvVertex[i].vPosition,TransfMatrix,NULL); } VertexBuffer->Unlock(); return TB_OK; } |
Alter Hase
Zitat von »"Zipfeklatscher"«
C-/C++-Quelltext
1 if (Desc.FVF != SVertex::dwFVF) // wie frage ich einzelne Flags ab???
C-/C++-Quelltext |
|
1 2 3 4 |
if (!(Desc.FVF & D3DFVF_XYZ)) { // D3DFVF_XYZ nicht gesetzt! } |
Anonymous
unregistriert
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 |
void transform_vertex_positions ( IDirect3DVertexBuffer9* const vertex_buffer, const tbMatrix& transform_matrix ) { D3DVERTEXBUFFER_DESC buffer_description; if ( !vertex_buffer -> GetDesc ( &buffer_description ) ) return; if ( buffer_description.FVF ^ D3DFVF_XYZ ) return; void* vertex; if ( vertex_buffer -> Lock ( 0, buffer_description.Size, &vertex, D3DLOCK_NOSYSLOCK ) ) return; const std::size_t vertex_size = D3DXGetFVFVertexSize ( buffer_description.FVF ); for ( std::size_t number_of_vertices = buffer_description.Size / vertex_size; number_of_vertices; --number_of_vertices ) { *static_cast < tbVector3* > ( vertex ) = tbVector3TransformCoords ( *static_cast < tbVector3* > ( vertex ), transform_matrix ); vertex = reinterpret_cast < void* > ( reinterpret_cast < unsigned long > ( vertex ) + vertex_size ); } vertex_buffer -> Unlock (); }; |
Zitat
Hier nochmal die Aufgabe:
Schreiben Sie eine Funktion TransformVertexPositions, die einen Vertex-Buffer und eine Matrix als Parameter erwartet und dann alle Vertizes im Vertex-Buffer mit dieser Matrix transformiert! Es müssen nur die Positionsvektoren der Vertizes verändert werden. Beachten Sie, dass das Vertexformat beliebig sein kann!
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 38 39 40 41 42 43 44 45 46 |
// TransformVertexPositions // // Aufgabe: Positionsvektoren aller Vertizes im übergebenen Buffer mit // der übergebenen Matrix Transformieren // tbResult TransformVertexPositions(PDIRECT3DVERTEXBUFFER9 pVertexBuffer, const tbMatrix &mMatrix) { // Buffer-Description D3DVERTEXBUFFER_DESC Desc; // Beschreibung holen pVertexBuffer->GetDesc(&Desc); // Ungültiges Vertex-Format if(!(Desc.FVF & D3DFVF_XYZ)) return TB_ERROR; // Vertex-Größe int iVertexSize = D3DXGetFVFVertexSize(Desc.FVF); // Anzahl Vertizes berechnen int iNumVertices = Desc.Size / iVertexSize; // Buffer sperren char *pVertices; pVertexBuffer->Lock(0, 0, (void**)&pVertices, D3DLOCK_NOSYSLOCK); // Zeiger auf Positionsvektor void *pPosition; // Vertex-Positionen transformieren for(int iVertex = 0; iVertex < iNumVertices; iVertex++) { // Adresses des Positionsvektors des aktuellen Vertex berechnen pPosition = (void*)&pVertices[iVertex * iVertexSize]; // Vektor transformieren *((tbVector3*)pPosition) = tbVector3TransformCoords(*((tbVector3*)pPosition), mMatrix, NULL); } // Buffer entsperren pVertexBuffer->Unlock(); return TB_OK; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// TransformVertexPositions tbResult TransformVertexPositions(PDIRECT3DVERTEXBUFFER9 pVertexBuffer, const tbMatrix &mMatrix) { // ... // Zeiger auf Positionsvektor tbVector3 *pPosition; //!!! // Vertex-Positionen transformieren for(int iVertex = 0; iVertex < iNumVertices; iVertex++) { // Adresses des Positionsvektors des aktuellen Vertex berechnen pPosition = reinterpret_cast<tbVector3*>(&pVertices[iVertex * iVertexSize]); // Vektor transformieren *pPosition = tbVector3TransformCoords(*pPosition), mMatrix, 0); } // ... } |
Zitat von »"Faule Socke"«
Es heißt "voraus", nicht "vor-raus".
Werbeanzeige