2 D To 3 D Terrain Generator
-
Upload
mehmet-aydin-bahadir -
Category
Technology
-
view
924 -
download
5
Transcript of 2 D To 3 D Terrain Generator
Mehmet Aydın Bahadır
Muhammed Fatih Polat
Ahmet Taşçı
XNA Nedir? 2004 – San Jose
Öğrenciler, Hobi
.NET altyapısı
C# dili
DirectX
Windows, Xbox 360
XNA Nedir? - 2 http://creators.xna.com/en-US/
Raven XNA http://www.codeplex.com/RavenXNA
Reactor 3D http://www.reactor3d.com/site/
Carot http://www.carotengine.com/
Physic http://www.codeplex.com/FarseerPhysics
Hadi Başlayalım Microsoft XNA Game Studio 3.1
Visual Studio 2008 SP1
.NET Framework 2.0 Runtime
XNA Framework Runtime
Directx SDK
Directx Runtime
2D to 3D
Effect Dosyası ? XNA – Üçgenler, üçgenler, üçgenler
Üçgeni nasıl göstereceğim?
.fx
Effect effect
effect = Content.Load<Effect> ("effects");
Indisleme
Basit bir terrain? 4x3’lük bir matris.
private float[,] heightData;
private void LoadHeightData()
private void SetUpVertices()
private void SetUpIndices()
vertices[x + y * terrainWidth].Position = new Vector3(x, heightData[x,y], -y);
Basit bir Terrain?
Dosyadan Terrain (?) Grayscale resimler
En yükseğe beyazlar! Siyahlar inin aşağıya!
Oku bakalım: Texture2D heightMap = Content.Load<Texture2D> ("heightmap");LoadHeightData(heightMap);
Content – bmp, jpg, png ...
Okudum! private void LoadHeightData(Texture2D heightMap)
{terrainWidth = heightMap.Width;terrainHeight = heightMap.Height;
Color[] heightMapColors = new Color[terrainWidth * terrainHeight];
heightMap.GetData(heightMapColors);
heightData = new float[terrainWidth, terrainHeight];for (int x = 0; x < terrainWidth; x++)
for (int y = 0; y < terrainHeight; y++)heightData[x, y] = heightMapColors[x + y *
terrainWidth].R / 5.0f;}
Ne oldu şimdi? Her bir nokta için yükseklik bilgisi var.
SetUpIndice – her noktanın arrayı için vertex.
SetUpIndices – Terraini kurmak için her üçgene 3 indis.
Draw – indisler dizileri izin verdikçe üçgenleri renderlemeye devam et.
Ne oldu şimdi? -2
Renksiz ?
Karıştır Karıştır Karıştır vertices[x + y * terrainWidth].Position = new
Vector3(x, heightData[x, y], -y);
if (heightData[x, y] < minHeight + (maxHeight -minHeight) / 4)
vertices[x + y * terrainWidth].Color = Color.Blue;else if (heightData[x, y] < minHeight + (maxHeight -minHeight) * 2 / 4)
vertices[x + y * terrainWidth].Color = Color.Green;else if (heightData[x, y] < minHeight + (maxHeight -minHeight) * 3 / 4)
vertices[x + y * terrainWidth].Color = Color.Brown;else
vertices[x + y * terrainWidth].Color = Color.White;
Karıştır ?
Kör oldum Işık verelim:
Işık? Tüm vertexlerin normalizesini istiyorum.
Bu verileri vertex datasına iletmeliyim
Bir normalize, bir renk ve bir pozisyon XNA için fazla!
Fakat bu sorun olmasa gerek?
Işık - 2 public struct VertexPositionNormalColored
{public Vector3 Position;public Color Color;public Vector3 Normal;
public static int SizeInBytes = 7 * 4;public static VertexElement[] VertexElements = new VertexElement[]{
new VertexElement( 0, 0, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.Position, 0 ),
new VertexElement( 0, sizeof(float) * 3, VertexElementFormat.Color, VertexElementMethod.Default, VertexElementUsage.Color, 0 ),
new VertexElement( 0, sizeof(float) * 4, VertexElementFormat.Vector3, VertexElementMethod.Default, VertexElementUsage.Normal, 0 ),
};}
Işık – Sonuç?
Terrain’im Işık İster! private void CalculateNormals()
{for (int i = 0; i < vertices.Length; i++)
vertices[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 = vertices[index1].Position - vertices[index3].Position;Vector3 side2 = vertices[index1].Position - vertices[index2].Position;Vector3 normal = Vector3.Cross(side1, side2);
vertices[index1].Normal += normal;vertices[index2].Normal += normal;vertices[index3].Normal += normal;
}
Terrain’im Işık İster - 2 for (int i = 0; i < vertices.Length; i++)
vertices[i].Normal.Normalize();
Load Content’te unutmayıver şunu yazmayı:CalculateNormals();
Okus pokus desin ışıklar terrainime!
Vector3 lightDirection = new Vector3(1.0f, -1.0f, -1.0f);lightDirection.Normalize();effect.Parameters["xLightDirection"].SetValue(lightDirection);effect.Parameters["xAmbient"].SetValue(0.1f);
Terrain’im Işık İster - 3
Eee Optimizasyonu Nerde Bunun? Optimizasyona birebir: Vertexbuffer, Indexbuffer! “İlaç
gibi keser.”
Neden? Bırakalım da ekran kartı biraz şekerleme yapabilsin!
Vertex’lerin IndexBuffer’a gideceği yok ya!
Neymiş kodları? VertexBuffer myVertexBuffer;
IndexBuffer myIndexBuffer;
private void CopyToBuffers(){
myVertexBuffer = new VertexBuffer(device, vertices.Length * VertexPositionNormalColored.SizeInBytes, BufferUsage.WriteOnly);
myVertexBuffer.SetData(vertices);}
Yazmayı unutmamalı Load Content alınır sonra: CopyToBuffers();
Ne ekledik? Biraz hoş görünsün istedik, güneş ekledik, hava
ekledik, su ve sis eklemeye çalıştık.
Heightmap düzenleme araçları ekledik, colormap eklemeye çalıştık pek de başarılı olamadık.
Kamera kontrol kodları çarptık sağdan soldan hemen ekledik
Ne ekledik? - 2 Yüksekliği, ışığı, güneşi, gökyüzünü kullanıcının
emrine verdik!
Boyama aracı yapmaya çalıştık elimize yüzümüze bulaştırdık
Kullanıcıya farklı doku görünümleri sunduk (Geometrik ve Doku olarak)
Tasarımı kaydetme, tasarım açma seçenekleri ekledik!
Bu kadar yeter dedik
Demo
Teşekkürler Mehmet Aydın Bahadır
Muhammed Fatih Polat
Ahmet Taşçı