Terraingenerierung mit PerlinNoise-Verfahren



  • Hat jemand Erfahrung damit? Ich bin dabei nämlich auf ein seltsames Problem beim Rendern gestoßen. Irgendwie rendert er mir meine Trianglestrips nicht vollständig, sondern so, dass große Lücken im Terrain entstehen. Die Funktion, die das Terrain generiert sollte allerdings fehlerfrei sein.

    Ein Screenie des Fehlers ist hier verfügbar:
    http://mitglied.lycos.de/folleniusfamily/Unbenannt.JPG

    Wäre super, wenn mir jemand helfen könnte,

    Mfg, smasher1985



  • smasher1985 schrieb:

    Die Funktion, die das Terrain generiert sollte allerdings fehlerfrei sein.

    Hier sollte der Fehler liegen... 😉



  • OK, hab auch einen Teil des Problems behoben - lag tatsächlich in der Funktion, die das Terrein generiert 🙄
    Aber immer noch sind deutlich Lücken im Terrain zu sehen...ich hab den Screenshot mal aktualisiert...

    http://mitglied.lycos.de/folleniusfamily/Unbenannt.JPG

    Ich poste hier mal meine Terrain-Generierungs-funktion. Vielleicht hat ja jemand Zeit und Lust, sich das mal anzuschauen, und mir dann zu sagen, warum diese Lücken entstehen. Ich bin nämlich echt am Verzweifeln....

    /* create a terrain */
    bool omeRessourceStaticMesh::CreateTerrain( float fMinHeight, float fMaxHeight, int nWidth, int nHeight, float fStepSize, DWORD dwSeed ) {
    	bool bChange = false;
    	std::vector<ome3DVertex> VertexList;
    
    	omeExponentialNoise noise(fMaxHeight, fMinHeight, dwSeed);
    
    	for (float x=0.0f; x < nWidth; x+=fStepSize-0.1) {
    		bool bNormChange = false;
    		if (bChange) {
    			for (float y=nHeight; y >= 0.0f; y-=fStepSize-0.1) {
    				ome3DVertex v;
    				v.m_fX = x;
    				v.m_fY = noise.ExpNoiseValue(x, 0.0f, y);
    				v.m_fZ = -y;
    				omeVector3d hv = CalculateNormal(&noise, x, y, fStepSize);
    				v.m_fNX = hv.getX();
    				v.m_fNY = hv.getY();
    				v.m_fNZ = hv.getZ();
    				v.m_fTU = x*PERLIN_TEXOFFSET;
    				v.m_fTV = y*PERLIN_TEXOFFSET;
    
    				VertexList.push_back(v);
    
    				ome3DVertex v2;
    				v2.m_fX = x+fStepSize;
    				v2.m_fY = noise.ExpNoiseValue(x+fStepSize, 0.0f, y);
    				v2.m_fZ = -y;
    				hv = CalculateNormal(&noise, x+fStepSize, y, fStepSize);
    				v2.m_fNX = hv.getX();
    				v2.m_fNY = hv.getY();
    				v2.m_fNZ = hv.getZ();				
    				v2.m_fTU = (x+fStepSize)*PERLIN_TEXOFFSET;
    				v2.m_fTV = y*PERLIN_TEXOFFSET;
    
    				VertexList.push_back(v2);
    			}
    		} else {
    			for (float y=0.0f; y<nHeight; y+=fStepSize) {
    				ome3DVertex v2;
    				v2.m_fX = x+fStepSize;
    				v2.m_fY = noise.ExpNoiseValue(x+fStepSize, 0.0f, y);
    				v2.m_fZ = -y;
    				omeVector3d hv = CalculateNormal(&noise, x+fStepSize, y, fStepSize);
    				v2.m_fNX = hv.getX();
    				v2.m_fNY = hv.getY();
    				v2.m_fNZ = hv.getZ();				
    				v2.m_fTU = (x+fStepSize)*PERLIN_TEXOFFSET;
    				v2.m_fTV = y*PERLIN_TEXOFFSET;
    
    				VertexList.push_back(v2);
    
    				ome3DVertex v;
    				v.m_fX = x;
    				v.m_fY = noise.ExpNoiseValue(x, 0.0f, y);
    				v.m_fZ = -y;
    				hv = CalculateNormal(&noise, x, y, fStepSize);
    				v.m_fNX = hv.getX();
    				v.m_fNY = hv.getY();
    				v.m_fNZ = hv.getZ();
    				v.m_fTU = x*PERLIN_TEXOFFSET;
    				v.m_fTV = y*PERLIN_TEXOFFSET;
    
    				VertexList.push_back(v);
    			}
    		}
    
    		bChange = !bChange;
    	}
    
    	int nNumTerrainVertices = VertexList.size();
    
    	m_pMeshData->m_nPrimitiveType = PT_TRIANGLESTRIP;
    	m_pMeshData->m_nNumGroups = 1;
    	m_pMeshData->m_pGroupList = new omeMeshGroup[m_pMeshData->m_nNumGroups];
    	m_pMeshData->m_pVertexList = new ome3DVertex[nNumTerrainVertices];
    
    	omeRessourceManager::GetSingleton().LoadRessource(RES_TEXTURE, "boden3.bmp");
    
    	m_pMeshData->m_pGroupList[0].m_nNumIndices = nNumTerrainVertices;
    	m_pMeshData->m_pGroupList[0].m_pwIndexList = NULL;
    	m_pMeshData->m_pGroupList[0].m_pMaterial = NULL;
    	m_pMeshData->m_pGroupList[0].m_pTexture = ConvertSmartPointer<omeRessourceTexture, omeBaseRessource>(omeRessourceManager::GetSingleton().GetRessource("boden3.bmp", RES_TEXTURE));
    	m_pMeshData->m_pGroupList[0].m_strTexture = "";
    
    	for (int i=0; i<nNumTerrainVertices; ++i) {
    		m_pMeshData->m_pVertexList[i] = VertexList[i];
    	}
    
    	VertexList.erase(VertexList.begin(), VertexList.end());
    
    	omeLog::Get().Write(LOG_CLIENT, "created terrain: %d vertices", nNumTerrainVertices);
    
    	return true;
    }
    

    Danke schon mal für eure Mühen,

    Mfg, smasher1985



  • Ich hab mir den Source nicht durchgelesen, aber es sieht IMHO nach T-Cracks aus.



  • das Problem ist aber, dass mit dem PerlinNoise-Verfahren eigentlich keine T-Cracks entstehen dürften...

    Mfg, smasher1985


Anmelden zum Antworten