DirectX .Obj Loader Object Durchsichtig



  • Moin moin...
    Ich bin neu hier und habe jetzt ein wenig im Forum nach meinem Problem gesucht, aber keine Lösung gefunden.

    Ich bin dabei einen .OBJ Loader für Exporte von Blender zu programmieren.
    Ich habe es auch soweit hinbekommen, dass die Dateien eingelesen werden und mir das Object auch angezeigt wird.
    Das Problem liegt jetzt darin, dass sobald Licht ins Spiel kommt alles komisch aussieht. Manchmal sind die Frontflächen durchsichtig und man sieht das Licht auf den Flächen die eigentlich aus diesem Winkel garnicht zu sehen sein sollten.

    Ich denke ich mache irgendwas mit den Normals falsch, finde den fehler aber nicht.
    Würde ich über ein bisschen Hilfe freuen..
    ´
    Hier mal der Code den ich nutze um die .Obj zu lesen und den Code zum erstellen des VertexBuffers

    /*****************************************************************************
    **	Funktionsname:	void CGraphics::LoadObjIntoVertexBuffer					**
    **	Funktion:		Lädt eine .obj Datei in den VertexBuffer				**
    **	Parameter:		strFilename		= Dateiname								**
    ******************************************************************************/
    void CGraphics::LoadObjIntoVertexBuffer(const WCHAR* strFilename)
    {
    	ifstream ifInput(strFilename);																			//Datei Öffnen
    	if(! ifInput.is_open())
    	{
    		MessageBox(NULL, L".Obj Datei nicht gefunden", NULL, MB_OK | MB_ICONEXCLAMATION);
    		return;
    	}
    
    	vector<s_TriVertex*> v_psTriVertex;
    	vector<s_TriFaces*>	 v_psTriFaces;
    	vector<s_TriVertex*> v_psTriNormals;
    	int i = 0;
    	while(!ifInput.eof())																					//Durch alle eingelesenen Zeilen Loopen
    	{
    		i++;
    		char cBuffer[255];
    		string str_line;
    		ifInput.getline(cBuffer, 255);
    		str_line = cBuffer;
    		if(str_line[0] == '#')																				//Bei Kommentaren
    		{
    			continue;																						//Nichts tun Schleife fotsetzen
    		}
    		if(str_line[0] == 'v' && str_line[1] == ' ')														//Bei Vertex Daten
    		{
    			float fx, fy, fz;
    			sscanf_s(str_line.c_str(), "v %f %f %f", &fx, &fy, &fz);
    			v_psTriVertex.push_back(new s_TriVertex(fx, fy, fz));											//Vertexte in vector schieben
    			continue;																						//Schleife fortsetzen
    		}
    		if(str_line[0] == 'v' && str_line[1] == 'n')														//Bei Normal Daten
    		{
    			float fx, fy, fz;
    			sscanf_s(str_line.c_str(), "vn %f %f %f", &fx, &fy, &fz);
    
    			v_psTriNormals.push_back(new s_TriVertex(fx, fy, fz));											//Normals in vector schieben
    			continue;																						//Schleife fortsetzen
    		}
    		if(str_line[0] == 'f')																				//Bei Face Daten
    		{
    			int tmp1, tmp2, tmp3, tmp4;
    			sscanf_s(str_line.c_str(), "f %i//%i %i//%i %i//%i", &tmp1, &tmp4, &tmp2, &tmp4, &tmp3, &tmp4);
    			v_psTriFaces.push_back(new s_TriFaces(tmp1-1, tmp2-1, tmp3-1, tmp4 -1 ));						//Faces in Vector schieben(-1 für opperator)
    			continue;																						//Schleife fortsetzen
    		}
    }
    
    	ifInput.close();
    
    	s_TriVertex* pvData;
    
    	pvData = new s_TriVertex[v_psTriFaces.size() *3];
    
    	for(unsigned int i = 0; i < v_psTriFaces.size(); i++)
    	{
    
    			pvData[i * 3 + 0].x = v_psTriVertex[v_psTriFaces[i]->n1]->x;
    			pvData[i * 3 + 0].y = v_psTriVertex[v_psTriFaces[i]->n1]->y;
    			pvData[i * 3 + 0].z = v_psTriVertex[v_psTriFaces[i]->n1]->z;
    			pvData[i * 3 + 0].vNormal.x = v_psTriNormals[v_psTriFaces[i]->nNormal]->x;
    			pvData[i * 3 + 0].vNormal.y = v_psTriNormals[v_psTriFaces[i]->nNormal]->y;
    			pvData[i * 3 + 0].vNormal.z = v_psTriNormals[v_psTriFaces[i]->nNormal]->z;
    
    			pvData[i * 3 + 1].x = v_psTriVertex[v_psTriFaces[i]->n2]->x;
    			pvData[i * 3 + 1].y = v_psTriVertex[v_psTriFaces[i]->n2]->y;
    			pvData[i * 3 + 1].z = v_psTriVertex[v_psTriFaces[i]->n2]->z;
    			pvData[i * 3 + 1].vNormal.x = v_psTriNormals[v_psTriFaces[i]->nNormal]->x;
    			pvData[i * 3 + 1].vNormal.y = v_psTriNormals[v_psTriFaces[i]->nNormal]->y;
    			pvData[i * 3 + 1].vNormal.z = v_psTriNormals[v_psTriFaces[i]->nNormal]->z;
    
    			pvData[i * 3 + 2].x = v_psTriVertex[v_psTriFaces[i]->n3]->x;
    			pvData[i * 3 + 2].y = v_psTriVertex[v_psTriFaces[i]->n3]->y;
    			pvData[i * 3 + 2].z = v_psTriVertex[v_psTriFaces[i]->n3]->z;
    			pvData[i * 3 + 2].vNormal.x = v_psTriNormals[v_psTriFaces[i]->nNormal]->x;
    			pvData[i * 3 + 2].vNormal.y = v_psTriNormals[v_psTriFaces[i]->nNormal]->y;
    			pvData[i * 3 + 2].vNormal.z = v_psTriNormals[v_psTriFaces[i]->nNormal]->z;
    
    	}
    
    	this->CreateVertexBufferFromList(&pvData[0], v_psTriFaces.size()*3);
    
    	delete[] pvData;																		//DxVertex Variable löschen
    
    	for(unsigned int i = 0; i < v_psTriNormals.size(); i++)									//Normal Daten löschen
    	{
    		delete v_psTriNormals[i];	
    	}
    	v_psTriNormals.clear();
    	for(unsigned int i = 0; i < v_psTriVertex.size(); i++)									//Vertex Daten löschen
    	{
    		delete v_psTriVertex[i];
    	}
    	v_psTriVertex.clear();
    	for(unsigned int i = 0; i < v_psTriFaces.size(); i++)									//Face Daten löschen
    	{
    		delete v_psTriFaces[i];	
    	}
    	v_psTriFaces.clear();
    }
    
    /*****************************************************************************
    **	Funktionsname:	void CGraphics::CreateVertexBufferFromList				**
    **	Funktion:		Erstellt einen VertexBuffer für eine Triangel liste		**
    **	Parameter:		struct s_TriVertex	= Triangel liste					**
    **					int nVertCount		= Vertex count						**
    **	Anmerkung:		nVertCount = sizeof(liste)/ sizeof(s_TriVertex)			**
    ******************************************************************************/
    void CGraphics::CreateVertexBufferFromList(struct s_TriVertex *vertex, int nVertCount)
    {
    	int nByteCount;
    
    	m_nVertexCount = nVertCount;
        nByteCount=nVertCount*sizeof(s_TriVertex);
    
    	m_pDevice->CreateVertexBuffer(nByteCount,
    								  D3DUSAGE_WRITEONLY,
    								  POINT_FVF,
    								  D3DPOOL_MANAGED,
    								  &m_pVertexBuffer,
    								  NULL);
    	void *p_vVertex;
    
    	m_pVertexBuffer->Lock(0,0, &p_vVertex, 0);
    	memcpy(p_vVertex, vertex, nByteCount);
    	m_pVertexBuffer->Unlock();
    	m_pDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(s_TriVertex));
    }
    

    Oh ja. hab vergessen den Link mit reinzuschrieben.
    Hier ein Screenshot
    http://img5.fotos-hochladen.net/uploads/durchsichtigzevhg3kp65.gif



  • ein screenshot sagt mehr als 1000zeilen code


Anmelden zum Antworten