15 Nisan 2008 Salı

Managed Directx Bölüm - 4 3D Koordinat Sistemleri ve Projeksiyonlar

3D Koordinat Sistemleri ve Projeksiyonlar

Üç boyutlu oyun yazmakla hiçbir ilişkimiz olmasa dahi 3D koordinat sisteminin temel konseptlerini anlamalıyız çünkü Direct 3D'de yaptığımız her şey 3D bir dünya içindeki noktalar ve şekillerle tanımlanmıştır. Elbette z değerini ihmal edebiliriz ve 2D bir dünyada olduğumuzu farz edebiliriz ama sıfır dahi olsa z değeri hala orada duruyor olacak.

Üç kartezyen boyutla çalıştığımız zaman iki tip koordinat sistemi kullanabiliriz: sol-el(left-handed) ve sağ-el(right-handed). Bu isimler, x ve y eksenine göre değişen z eksenini referans alır. bu pozisyonu tanımlamak için, bir elinizin parmaklarıyla x ekseninin pozitif yönüne işaret edin ve y ekseninin pozitif yönüne doğru, saat yönünün tersine hareket ettirin; z ekseni baş parmağınızın işaret ettiği doğrultu olacaktır. Baş parmağınızın işaret ettiği yön ise z ekseninin pozitif bileşenlerine işaret edecektir.



Farklı bir açıdan bakacak olursak, sol-el koordinat sisteminde, ekrandan uzaklaştıkça, z değeri pozitif yönde büyüyecektir(x ve y ekseninin ekranda kaldığını varsayarsak). Sağ-el koordinat sistemi de tam tersi şekilde; ekrandan izleyiciye doğru geldikçe z değeri pozitif yönde küçülecektir.

Direct 3D, sol-el koordinat sistemini kullanır, bu da z'nin pozitif değerinin göründüğü anlamına gelir ve negatif değerler görünmez(ta ki biz kamera pozisyonunu değiştirene kadar ki Direct 3D ile bu da mümkün).

3D koordinat sistemlerini anladıktan sonra sıradaki adım; bu sistemlerin 3D objeleri 2D ekranımızda nasıl gösterdiğini anlamaktır.

Şanslıyız ki bütün zor matematiksel işlemler DirectX tarafından yapılmakta ama projeksiyonların konseptini ve ekranda objelerin nasıl görüneceği ile ilgili temel bilgiyi DirectX'e nasıl adapte ettiklerini bilmeliyiz.

Direct 3D iki farklı projeksiyon tipini destekler;

• Perspektif Projeksiyonu:En yaygın kullanılan projeksiyon tipidir, z farkını hesaplayıp objeleri buna göre ayarlar. Bu projeksiyon tipi, ekrandan uzaklaşan objelerin daha küçük görünmesini sağlar -yani objeler gerçekte olduğu gibi deforme olurlar-. Düz bir yol üzerindeki kesikli şeritlerin ufukta birleşmiş gibi görüneceğini hatırlayın. Şekil 2 perspektif projeksiyonunu grafiksel olarak göstermektedir. 



• Orthogonal Projeksiyon:Bu projeksiyon tipinde, z bileşeni ihmal edilmiştir ve ekrandan uzaklaştıkça, objeler küçülmez ya da yakınlaştıkça büyümez. Bu projeksiyon genellikle 2D oyunlarda veya basit 3D oyunlarda kullanılır. 

Projeksiyon tipini tanımlarken, koordinat sitemi tipini seçmeli ve projeksiyonun tipine bağlı olarak birtakım parametreleri belirtmeliyiz. Direct 3D altı adet ana fonksiyon sunar(bunlardan dördü özel koordinat sistemleri oluşturmak içindir) ve bu fonksiyonlarla oyunumuz için seçtiğimiz projeksiyonu açıkça belirtmemizi sağlar. Bu fonksiyonlar, Direct 3D tarafından, 3D koordinatlardan ekran koordinatlarına yapılacak dönüşümü hesaplamak için kullanılmak üzere matrisler döndürür.

• Matrix.OrthoRH, Matrix.OrthoLH:Bir orthogonal projeksiyon tanımlamak için obje koordinatlarına uygulanması gereken dönüşümleri(transformations) içeren bir matris döndürür(RH =>Right-Handed,LH=>Left-Handed). Her iki fonksiyon da, ekranın genişlik ve yükseklik değerini ve gösterilecek olan z ekseni menzilini parametre olarak alır (ilk z değerinden önceki ve son z değerinden sonraki noktalar gösterilmeyecektir). 
• Matrix.PerspectiveRH, Matrix.PerspectiveLH:Sağ ve sol-el koordinat sistemlerinde, belirtilen ekran genişlik ve yükseklik değerleri ile birlikte z ekseni menzilini(ilk ve son noktalar) parametre olarak alır ve perspektif projeksiyonu için dönüşüm(transformation) matrisi döndürür. 
Matrix.PerspectiveFovRH, Matrix.PerspectiveFovLH:Sağ ve sol-el koordinat sistemlerinde, Fov'un(Field of view-görüntü alanı) radyan cinsinden açı değerini ve z ekseni menzilini parametre olarak alır ve perspektif projeksiyonu için transformation(dönüşüm) matrisi döndürür. 


Hiç yorum yok: