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.aspx

    Nun 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...


  • Mod

    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.


Anmelden zum Antworten