private void CalculateNormals(ref VertexMultitextured[] terrainVertices) { for (int i = 0; i < terrainVertices.Length; i++) terrainVertices[i].Normal = new Vector3(0, 0, 0); for (int i = 0; i < indices.Length / 3; i++) { int index1 = indices[i * 3]; int index2 = indices[i * 3 + 1]; int index3 = indices[i * 3 + 2]; Vector3 side1 = terrainVertices[index1].Position - terrainVertices[index3].Position; Vector3 side2 = terrainVertices[index1].Position - terrainVertices[index2].Position; Vector3 normal = Vector3.Cross(side1, side2); terrainVertices[index1].Normal += normal; terrainVertices[index2].Normal += normal; terrainVertices[index3].Normal += normal; } for (int i = 0; i < terrainVertices.Length; i++) terrainVertices[i].Normal.Normalize(); }
public void CreateTerrain() { VertexMultitextured[] terrainVertices = new VertexMultitextured[terrainWidth * terrainHeight]; for (int x = 0; x < terrainWidth; x++) { for (int y = 0; y < terrainHeight; y++) { float height = heightMap[x, y];// GetHeight(x, y); //* 10 +20; terrainVertices[x + y * terrainWidth].Position = new Vector3(x, heightMap[x, y], y); terrainVertices[x + y * terrainWidth].TextureCoordinate.X = (float)x / 30.0f; terrainVertices[x + y * terrainWidth].TextureCoordinate.Y = (float)y / 30.0f; terrainVertices[x + y * terrainWidth].TexWeights.X = MathHelper.Clamp(1.0f - Math.Abs(height - 0) / 8.0f, 0, 1); terrainVertices[x + y * terrainWidth].TexWeights.Y = MathHelper.Clamp(1.0f - Math.Abs(height - 12) / 6.0f, 0, 1); terrainVertices[x + y * terrainWidth].TexWeights.Z = MathHelper.Clamp(1.0f - Math.Abs(height - 20) / 6.0f, 0, 1); terrainVertices[x + y * terrainWidth].TexWeights.W = MathHelper.Clamp(1.0f - Math.Abs(height - 30) / 6.0f, 0, 1); float total = terrainVertices[x + y * terrainWidth].TexWeights.X; total += terrainVertices[x + y * terrainWidth].TexWeights.Y; total += terrainVertices[x + y * terrainWidth].TexWeights.Z; total += terrainVertices[x + y * terrainWidth].TexWeights.W; terrainVertices[x + y * terrainWidth].TexWeights.X /= total; terrainVertices[x + y * terrainWidth].TexWeights.Y /= total; terrainVertices[x + y * terrainWidth].TexWeights.Z /= total; terrainVertices[x + y * terrainWidth].TexWeights.W /= total; /* vertexArray.Add(new VertexMultitextured(new Vector3(i, heightMap[i, j], j), new Color(0, 0, (byte)(heightMap[i, j]*10+20),255),));*/ } } SetUpIndices(); CalculateNormals(ref terrainVertices); vertexPositionColor = terrainVertices; PrepareBuffers(); //LightDirection = new Vector3(0.5f, -0.7f, -1.0f); LightDirection = new Vector3(1.0f, -1.0f, -1.0f); LightDirection.Normalize(); }