Würfel wird nicht richtig angezeigt
-
Hallo,
ich bin noch ein totaler Anfänger, was die Spieleprogrammierung betrifft. Ich habe mir dieses Tutorial angeschaut: http://www.directxtutorial.com/tutorial9/b-direct3dbasics/dx9B4.aspxNun habe ich mir eine Klasse namens Würfel geschrieben. Nur wird der Würfel nicht richtig angezeigt. Die ganzen Vektoren stimmen ja, aber es ist immer genau die Hälfte der Dreiecke Transparent. Wenn der Würfel sich dann um 180° gedreht hat, sind die transparenten Dreiecke sichtbar, aber die anderen verschwinden dann..
Hier meine Würfel.h:#include <d3dx9.h> #pragma comment (lib, "d3dx9.lib") #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL) struct CUSTOMVERTEX {FLOAT X, Y, Z; D3DVECTOR NORMAL;}; #ifndef Würfel_h #define Würfel_h class Würfel { private: //Deklarationen CUSTOMVERTEX vektoren[24]; LPDIRECT3DVERTEXBUFFER9 v_buffer; LPDIRECT3DINDEXBUFFER9 i_buffer; VOID* pVoid; LPDIRECT3DDEVICE9 d3ddev; public: //Konstruktor Würfel() {}; //Destruktor ~Würfel() { v_buffer->Release(); i_buffer->Release(); }; void Create(float x, float y, float z, LPDIRECT3DDEVICE9 device) { d3ddev = device; CUSTOMVERTEX vektoren[24] = { //linke Seite {x - 0.5f, y - 0.5f, z - 0.5f, -0.5f, 0.0f, 0.0f}, //0 {x - 0.5f, y - 0.5f, z + 0.5f, -0.5f, 0.0f, 0.0f}, {x - 0.5f, y + 0.5f, z + 0.5f, -0.5f, 0.0f, 0.0f}, {x - 0.5f, y + 0.5f, z - 0.5f, -0.5f, 0.0f, 0.0f}, //rechte Seite {x + 0.5f, y - 0.5f, z - 0.5f, 0.5f, 0.0f, 0.0f}, //4 {x + 0.5f, y - 0.5f, z + 0.5f, 0.5f, 0.0f, 0.0f}, {x + 0.5f, y + 0.5f, z + 0.5f, 0.5f, 0.0f, 0.0f}, {x + 0.5f, y + 0.5f, z - 0.5f, 0.5f, 0.0f, 0.0f}, //obere Seite {x - 0.5f, y + 0.5f, z + 0.5f, 0.0f, 0.5f, 0.0f}, //8 {x - 0.5f, y + 0.5f, z - 0.5f, 0.0f, 0.5f, 0.0f}, {x + 0.5f, y + 0.5f, z - 0.5f, 0.0f, 0.5f, 0.0f}, {x + 0.5f, y + 0.5f, z + 0.5f, 0.0f, 0.5f, 0.0f}, //untere Seite {x - 0.5f, y - 0.5f, z + 0.5f, 0.0f, -0.5f, 0.0f}, //12 {x - 0.5f, y - 0.5f, z - 0.5f, 0.0f, -0.5f, 0.0f}, {x + 0.5f, y - 0.5f, z - 0.5f, 0.0f, -0.5f, 0.0f}, {x + 0.5f, y - 0.5f, z + 0.5f, 0.0f, -0.5f, 0.0f}, //hintere Seite {x - 0.5f, y - 0.5f, z + 0.5f, 0.0f, 0.0f, 0.5f}, //16 {x - 0.5f, y + 0.5f, z + 0.5f, 0.0f, 0.0f, 0.5f}, {x + 0.5f, y + 0.5f, z + 0.5f, 0.0f, 0.0f, 0.5f}, {x + 0.5f, y - 0.5f, z + 0.5f, 0.0f, 0.0f, 0.5f}, //vordere Seite {x - 0.5f, y - 0.5f, z - 0.5f, 0.0f, 0.0f, -0.5f}, //20 {x - 0.5f, y + 0.5f, z - 0.5f, 0.0f, 0.0f, -0.5f}, {x + 0.5f, y + 0.5f, z - 0.5f, 0.0f, 0.0f, -0.5f}, {x + 0.5f, y - 0.5f, z - 0.5f, 0.0f, 0.0f, -0.5f}, }; short indexe[36] = { //linke Seite 0, 1, 2, 0, 3, 2, //rechte Seite 4, 5, 6, 4, 7, 6, //obere Seite 8, 9, 10, 8, 11, 10, //untere Seite 12, 13, 14, 12, 15, 14, //hintere Seite 16, 17, 18, 16, 19, 18, //vordere Seite 20, 21, 22, 20, 23, 22, }; d3ddev->CreateVertexBuffer(24*sizeof(CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &v_buffer, NULL); v_buffer->Lock(0, 0, (void**)&pVoid, 0); memcpy(pVoid, vektoren, sizeof(vektoren)); v_buffer->Unlock(); d3ddev->CreateIndexBuffer(36*sizeof(short), 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &i_buffer, NULL); i_buffer->Lock(0, 0, (void**)&pVoid, 0); memcpy(pVoid, indexe, sizeof(indexe)); i_buffer->Unlock(); } void Draw() { d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX)); d3ddev->SetIndices(i_buffer); d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12); }; }; #endif
Meine Verwendung:
Würfel würfel1;
würfel1.Create(0.0f, 0.0f, 0.0f, d3ddev)
Etwas später:
würfel1.Draw()Wo liegt der Fehler? Ich finde ihn einfach nicht...
-
das stichwort ist backface culling
kurz:
vertausche jeweils zwei indices, von jeder zweiten zeile deiner index liste (damit drehst du diese dreiecke um).
-
Vielen Dank!
Ich wusste gar nicht dass es sowas gibt
Mit diesen hier funktioniert's://linke Seite 0, 1, 2, 2, 3, 0, //rechte Seite 6, 5, 4, 4, 7, 6, //obere Seite 10, 9, 8, 8, 11, 10, //untere Seite 12, 13, 14, 14, 15, 12, //hintere Seite 18, 17, 16, 16, 19, 18, //vordere Seite 20, 21, 22, 22, 23, 20,
Kleine Frage noch:
Muss man das SetStreamSource bei jeder Frame machen oder reicht es, das nur 1 mal zu machen?
-
Müsste 1x für alle Frames reichen, wenn es nie verändert wird.
Normalerweise kommt man aber nicht ohne Wechsel aus, d.h. man wird es früher oder später sowieso 1x pro Frame setzen müssen.
-
Okay vielen Dank.