2 d to 3 d terrain generator

Post on 02-Jul-2015

931 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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şçı

top related