Wie mache ich einen einfachen Quader mit IB und VB?



  • Hallo miteinander,
    ich habe ein Problem damit, einen Quader vernünftig darzustellen, irgendwie kommt bei meinen bisherigen Versuchen nur Quatsch raus. Im Prinzip soll ein Quader auf ein Terrain gesetzt werden, dass ich mittels Heightmapping erzeugt habe. Hingesetzt wird er, ein Quader ists aber noch nicht.
    Hier mal mein Code für das Gebäude, dass ich bauen will:

    struct Vertexkoordinaten
    	{
    	D3DXVECTOR3 position;
    
    	};
    
    class CGebaeudeModell
    	{
    	public:
    	WORD * IndexArray;
    
    	INDEXBUFFER GebaeudeIB;
    	VERTEXBUFFER GebaeudeVB;
        long  AnzVertices;
        long  AnzTriangles;
        long  AnzQuads;
        long  AnzIndices;
        long seitenlaenge;
        long tiefe;
    
    	CGebaeudeModell()
    		{
            AnzVertices       = 36;//AnzVerticesZeile*AnzVerticesSpalte;
            AnzQuads          = 6;//(AnzVerticesZeile-1)*(AnzVerticesSpalte-1);
            AnzTriangles      = 12; //2*AnzQuads;
            AnzIndices        = 3*AnzTriangles;
            IndexArray        = new WORD[AnzIndices];
    		seitenlaenge = 50;
    		tiefe = 20;
    		long zeile  = 1;
                long spalte = 1;
                Vertexkoordinaten vertices[24];
    		//Indexarray
    		WORD indexes[64] =  {0,1,2,2,3,0,
    							7,6,5,5,4,7,
    							3,2,6,6,7,3,
    							4,5,1,1,0,4,
    							1,5,6,6,2,1,
    							4,0,3,3,7,4};
    
    		//kopieren der Indices in das IndexArray
    		for (int i = 0; i < 36; i++)
    			{
    			IndexArray[i] = indexes[i];
    			}
    
    		 g_pd3dDevice->CreateIndexBuffer(AnzIndices*sizeof(WORD),
                                            D3DUSAGE_WRITEONLY, D3DFMT_INDEX16,
                                            D3DPOOL_MANAGED, &GebaeudeIB, NULL );
    
    		WORD* var = NULL;
                GebaeudeIB->Lock(0, 0, (VOID**)&var, 0);
                memcpy(var, IndexArray, AnzIndices*sizeof(WORD) );
                GebaeudeIB->Unlock();
    
    		SAFE_DELETE_ARRAY(IndexArray)
    
     g_pd3dDevice->CreateVertexBuffer(AnzVertices*sizeof(SPACEOBJEKT3DVERTEX_EX),
                                    D3DUSAGE_WRITEONLY,SPACEEOBJEKT3DVERTEX_EX,
                                    D3DPOOL_MANAGED, &GebaeudeVB, NULL );
    
            //koordinaten, aufgrund derer die Indexes festgelegt wurden              
            vertices[0].position = D3DXVECTOR3(-1.0, -1.0, -1.0); 
            vertices[1].position = D3DXVECTOR3(-1.0, 1.0, -1.0); 
            vertices[2].position = D3DXVECTOR3(1.0, 1.0, -1.0); 
            vertices[3].position = D3DXVECTOR3(1.0, -1.0, -1.0);
    
            vertices[4].position = D3DXVECTOR3(-1.0, -1.0, 1.0);
            vertices[5].position = D3DXVECTOR3(-1.0, 1.0, 1.0);
            vertices[6].position = D3DXVECTOR3(1.0, 1.0, 1.0);
            vertices[7].position = D3DXVECTOR3(1.0, -1.0, 1.0);
    
            //Skalierung aller Koordinaten
            for (int i = 0; i < 8; i++)
    			{
    			vertices[i].position.x *= seitenlaenge;
    			vertices[i].position.y *= seitenlaenge;
    			vertices[i].position.z *= seitenlaenge;
    			}
    
            SPACEOBJEKT3DVERTEX_EX * pVertices;
            GebaeudeVB->Lock(0, 0, (VOID**)&pVertices, 0);
    
    		//Positionen aller Vertices festlegen
            for (int i = 0; i < 36; i++)
    			{
    			pVertices[i].position = vertices[indexes[i]].position;
                      //Normalenberechnung hab ich erstmal ausgeklammert
    			//pVertices[i].normal = pVertices[i].position;
    			}
    
            GebaeudeVB->Unlock();
    		}
    		~CGebaeudeModell()
    			{
    			SAFE_RELEASE(GebaeudeIB)
    			SAFE_RELEASE(GebaeudeVB)
    			SAFE_DELETE_ARRAY(IndexArray)
    			}
    
    	};
    	CGebaeudeModell * GebaeudeModell = NULL;
    
    class CGebaeude
    	{
    	public:
    	D3DXVECTOR3 ortsvektor;
    	D3DXMATRIX   VerschiebungsMatrix;
        float Entfernung;
    
    	CGebaeude()
    		{
    		ortsvektor = D3DXVECTOR3(250.0f, 0.0f, 300.0f);
    		Entfernung = D3DXVec3Length(&ortsvektor);
    		}
    
    void Render_Gebaeude()
    		{
    	D3DXMatrixIdentity(&VerschiebungsMatrix);
    	VerschiebungsMatrix._41 = ortsvektor.x - PlayerVerschiebungsvektor.x;
    	VerschiebungsMatrix._42 = ortsvektor.y - PlayerVerschiebungsvektor.y -  GroundTileHeight;
    	VerschiebungsMatrix._43 = ortsvektor.z - PlayerVerschiebungsvektor.z;
          g_pd3dDevice->SetTransform( D3DTS_WORLD, &VerschiebungsMatrix);  
    	g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);                       g_pd3dDevice->SetFVF(D3DFVF_SPACEOBJEKT3DVERTEX_EX);	
    	g_pd3dDevice->SetStreamSource(0, GebaeudeModell->GebaeudeVB, 0,sizeof(SPACEOBJEKT3DVERTEX_EX));
    	g_pd3dDevice->SetIndices(GebaeudeModell->GebaeudeIB);                  
    	g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0,
    				0, GebaeudeModell->AnzVertices,
    				0, GebaeudeModell->AnzTriangles);
    
    		}
    
    	};
    

    Ich vermute, dass es mit meinem IndexArray zusammenhängt. Kann aber auch ein beliebig anderer Fehler sein!
    SPACEOBJEKT3DVERTEX_EX ist eine struct, die Position, und Normalenvektor der einzelnen Vertices speichert.
    Wenn irgendwer eine Idee hat, wär ich sehr dankbar!



  • Was genau ist denn das Problem?



  • Das Problem besteht darin, dass das Ding, was da berechnet wird, nicht aussieht wie ein Quader, sondern mir unverständliche Formen produziert. Ich weiß leider nich, woran es liegen kann, habe schon einiges versucht, passt aber nicht. Ich hatte den Indexbuffer und dessen Initialisierung im Verdacht, hab aber nichts erreicht.



  • Probiers vielleicht mal mit folgender Methode:
    Zeichne nicht den ganzen Würfel auf einmal, sondern Quad für Quad. Im ersten Schritt erzeugst du also 6 (oder 4) Vertices und 6 (oder 4) Indizes. Dann renderst du NUR diese Fläche. So fährst du dann Seite für Seite fort. Dadurch merkst du automatisch, wo dein Fehler auftritt. Solche Fehler entstehen ja meistens durch eine falsche Winding Order, durch falsche Vertexpositionen oder falsche Indizes.



  • Werd ich mal probieren! Ist denn mein Aufbau des Indexbuffers und des Vertexbuffers korrekt? Ich hab auch die Variablen AnzIndices und AnzTriangles im Verdacht, da die ja später bei der DrawIndexedPrimitive() - Methode verwendet werden. Da hats mir inzwischen einige Male den Rechner weggeschossen.



  • Problem gelöst! Hatte das Prinzip des Indexbuffers nicht richtig verstanden, und dann konnte ja nur Quatsch rauskommen! Jetzt funktionierts einwandfrei! Danke für die Hilfe!


Anmelden zum Antworten