2 D To 3 D Terrain Generator

29
Mehmet Aydın Bahadır Muhammed Fatih Polat Ahmet Taşçı

Transcript of 2 D To 3 D Terrain Generator

Page 1: 2 D To 3 D Terrain Generator

Mehmet Aydın Bahadır

Muhammed Fatih Polat

Ahmet Taşçı

Page 2: 2 D To 3 D Terrain Generator

XNA Nedir? 2004 – San Jose

Öğrenciler, Hobi

.NET altyapısı

C# dili

DirectX

Windows, Xbox 360

Page 3: 2 D To 3 D Terrain Generator

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

Page 4: 2 D To 3 D Terrain Generator

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

Page 5: 2 D To 3 D Terrain Generator

2D to 3D

Page 6: 2 D To 3 D Terrain Generator

Effect Dosyası ? XNA – Üçgenler, üçgenler, üçgenler

Üçgeni nasıl göstereceğim?

.fx

Effect effect

effect = Content.Load<Effect> ("effects");

Page 7: 2 D To 3 D Terrain Generator

Indisleme

Page 8: 2 D To 3 D Terrain Generator

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);

Page 9: 2 D To 3 D Terrain Generator

Basit bir Terrain?

Page 10: 2 D To 3 D Terrain Generator

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 ...

Page 11: 2 D To 3 D Terrain Generator

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;}

Page 12: 2 D To 3 D Terrain Generator

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.

Page 13: 2 D To 3 D Terrain Generator

Ne oldu şimdi? -2

Page 14: 2 D To 3 D Terrain Generator

Renksiz ?

Page 15: 2 D To 3 D Terrain Generator

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;

Page 16: 2 D To 3 D Terrain Generator

Karıştır ?

Page 17: 2 D To 3 D Terrain Generator

Kör oldum Işık verelim:

Page 18: 2 D To 3 D Terrain Generator

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?

Page 19: 2 D To 3 D Terrain Generator

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 ),

};}

Page 20: 2 D To 3 D Terrain Generator

Işık – Sonuç?

Page 21: 2 D To 3 D Terrain Generator

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;

}

Page 22: 2 D To 3 D Terrain Generator

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);

Page 23: 2 D To 3 D Terrain Generator

Terrain’im Işık İster - 3

Page 24: 2 D To 3 D Terrain Generator

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!

Page 25: 2 D To 3 D Terrain Generator

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();

Page 26: 2 D To 3 D Terrain Generator

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

Page 27: 2 D To 3 D Terrain Generator

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

Page 28: 2 D To 3 D Terrain Generator

Demo

Page 29: 2 D To 3 D Terrain Generator

Teşekkürler Mehmet Aydın Bahadır

Muhammed Fatih Polat

Ahmet Taşçı