Merhabalar; bir önceki yazımda
kısaca XNA’de hatta ve hatta genel oyun programlama dünyasında matrislerin
nasıl kullanıldığından ve ne gibi avantajlar sağladığından kısaca bahsetmiştim.
Bu yazımda ise XNA’de matris yapısı (struct) ile neler yapabiliriz, hangi
metodu ne amaçla kullanabiliriz gibi konulardan bahsedeceğim.
Öncelikle tarzım olduğu üzere metotları tanıyalım,
sonra nasıl kullanıldıklarından bahsedeceğim.
CreateRotationX() ->
CreateRotationY() ->
CreateRotationZ() -> Z ekseni etrafında dönme
hareketini sağlayacak olan matrisi geri döndürür.
CreateTranslation() -> Bir yada daha fazla
eksene göre, dorusal hareket sağlayan matrisi geri döndürür.
CreateScale() -> varlığı ölçekleyecek bir matris geri döndürür.
CreateLookAt() -> Kameranın bakış
açısındakileri gösteren bakış matrisini (View matrix) oluşturur. Kameranın
yerini, görüntülerin yerini ve hangi yönün yukarı olduğunu biz belirleriz.
Not: Kamerayı monitörümüz aracılığı ile
görebildiğimiz alan için, mönitörün ekranıdır diyebiliriz, sonuçta perspektif
bir bakış açısında, görüntünün başladığı sınır ekrandır sonra z indexine göre
görüntü derinlik kazanır. Yada basitçe bir FPS (counter strike gibi oyunlar)
oyununda karakterimizin gözleri kameradır diyerek bunu kafamızda canlandıralım.
CreatePerspectiveFieldOfView() -> Perspektif
izdüşüm kullanarak, görünür alanın matrisini yaratır, görünür dünyayı bir
matrisle temsil eder. Bu method ile bakış matrisini (View Matrix), ekranın görüntü
oranını (Aspect Ratio) , yakın ve uzak
görüntü sınırlarını paremetre olarak kullanırız, dolasıyla bu metod, View
Matriximize bağımlıdır. Özetle bu metot bir perspektif görüş için ekrandan
itibaren görebileceğimiz son sınıra kadar trepezoit (yamuk) bir alan oluşturur.
Not: Aspect Ratio (ekran oranı) GraphicsDevice
türünden bir aygıtın,
aygıt.ViewPort.width /
aygıt.ViewPort.Height şeklinde
kurabileceğimiz bir oranla hesaplanır. Sonuç genellikle 4:3 veya 16:9 gibi
günümüz standart oranlarıdır.
CreatePerspectiveOffCenter() -> View Matrix’ten
bağımsız bir perspektif izdüşüm matrisi oluşturur.
CreateWorld() -> Dünya matrisimizi oluşturur.
Şimdilik bu kadar metodu anlatmanın yeterli
olduğunu düşünüyorum; fazlasını merak edenler MSDN kütüphanesinden
yaralanabilirler.
Metotlarımızı tanıdığımıza göre şimdi
matrisleri nasıl kullanacağımız konusuna değinelim;
Öncelikle dünyamızı temsil edecek bir dünya
matrisi tanımlayalım;
Matrix
worldMatrix = Matrix.Identity;
Matrix.Identity birim matris geri döndürür.
Şimdi de hareket işlemini nasıl sağlayacağımızı
görelim;
worldMatrix*=
Matrix.CreateRotationX(1.0f)*Matrix.CreateRotationY(1.0f);
Bir önceki yazımda
iki matrisi çarparak haraket sağlayabileceğimizi anlatmıştım. Burda da
yaptığımız aynen bu. Sadece matrisin değerlerini XNA’e tanımlatıyoruz, biz
bildiğimiz klasik anlamda matrisi görmüyoruz. Gördüğünüz gibi her çarpı (*)
işareti bir hareket anlamına geliyor, ikinci * işaretinde Y ekseni etrafında
bir birimlik hareket, birinci * işaretinde de Y ekseni etrafında bir birimlik
hareket yapıyoruz. Yani nesnemiz tek bir işlem dizisinde art arda iki hareket
yapmış oluyor;
Gördüğünüz gibi XNA’de nesnelere hareket vermek
bu kadar kolay, yazının başında verdiğim metotları da çarpma değeri ile
çarparak hareketi çeşitlendirebiliriz.
Altın kural şu; önce, dünyayı nesneyi vb.
tanımlayan bir matris atıyoruz, sonra hangi hareketi yaptıracağımıza karar
veriyoruz, nesnemizi temsil eden matrisi hareketimizi sağlayacak matrisle
çarpıp nesne matrisimize bu sonucu atıyoruz. Gördüğünüz gibi XNA’de
matrislerden korkmanızı gerektirecek pek bir şey yok.