Direct3D

**Direct3D**; DirectX teknolojisinin alt kümesini oluşturan API'sidir. Tamamıyla 3D teknolojisi üzerine geliştirilmiştir. Genelde Video Oyunu Geliştiricilerinin kullandığı bir kütüphanesi vardır. Bu; *direct3d.h* dır.


**Ön bilgi:** İki boyutlu bir ortamı oluşturmak için iki ordinata, üç boyutlu bir ortam oluşturmak için üç ordinata ihtiyacımız var. İki boyut için ordinatlar X ve Y olup oluşan koordinat A(X,Y) ve üç boyut için ise ordinatlar X, Y, Z ordinatlarıdır, oluşan koordinat sistemi ise; B(X,Y,Z) dir.


Bildiğiniz gibi bir nokta, hangi boyutta oluşturulmuşsa o boyuta göre koordinat parametreleri oluşur. İki boyutlu bir çizim için ki örnek olarak doğru parçası oluşturmak için **A** ve **B** noktaları verelim... A noktası için X ve Y ordinatlarının parametresi olarak sırasıyla 30 ve 42 birimlerini verelim. Yani A(30,42) oluşmuş durumda. B noktası ise B(-30,-42) olsun. Evet şu anda birbirine simetrik iki nokta çizdik. Bu noktaların her birine **VERTEX** diyoruz. Yani iki boyutlu bir çizim için bağlantı noktaları...

Neden bağlantı noktası dedik? Çünkü; iki nokta arasına bir doğru parçası çizeceğiz ve bize lazım olan iki noktanın parametrelerini aldık. Ve bu sayede çizim işlemini gerçekleştirdik... Noktaların her biri bizim bağlantı noktalarımızdır. Üç boyutlu bir nesne yani küp için de aynı yöntem geçerli. Fakat küpü oluşturmak için minimum sekiz vertexe yani 8 noktaya ihtiyacımız var.

Eğer üç boyut hakkında bilgilendiyseniz veya bilgileriniz güncellendiyse ilk Direct3D örneğimizi verelim...

Direct3D teknolojisi primitive type (ilkel verileri) bile destekler. Örneğin programlamada, DirectX teknolojisini kullanıyorsanız ve koordinatları belli bir nokta kümesi verdiyseniz, yani örneğin;

* **nokta1 için x=14, y=16, z=42;** (bu; üç boyutlu üçgen çizimi için verilen birinci vertex; yani bağlantı noktası)
* **nokta2 için x=21, y=72, z=15;** (bu; üç boyutlu üçgen çizimi için verilen ikinci vertex; yani bağlantı noktası)
* **nokta3 için x=12, y=15, z=12;** (bu; üç boyutlu üçgen çizimi için verilen üçüncü vertex; yani bağlantı noktası)

koordinatlarını verip DirectX'in bize bu noktaları bir üçgen oluşturacak şeklinde deklare ettiysek, koordinatları verilen noktalar birbirleriyle birleştirilir ve uzayda üçboyutlu bir üçgen çizilir.

Bunun yanında Direct3D; **Video Oyunu Geliştiricileri için;** çeşitli üç boyutlu hesaplamaları üstlenir.

* Mesela; bir video oyunu geliştiricisi olan X firması, geliştirdiği video oyununda kullanmak üzere üç boyutlu grafikler tasarladı. Tasarlanan en küçük yapıdaki üç boyutlu grafik, yaklaşık 720 vertex yani bağlantı noktası içermekte. Varsayım olarak bu üç boyutlu grafik bir insan vücudu. Gövde kısmında 170 kadar, kol kısımlarında 120 kadar, bacak kısımlarında ise 200 kadar vertex var. Tanımlanmış diğer vertexler de grafiğin baş kısmını oluştursun... Eğer bu şirket oluşturulan grafikleri bir video oyununda kullancaksa, karakterin doğal olarak hareket etmesini de isteyecektir.
* Örneğin bazı oyunlarda olduğu gibi oluşturduğu karakterin bir arabaya binmesini, konuşabilmesini kısaca gerçek hayattaki bir insan gibi hareket etmesini ister. Yani bir vazo gibi katı durmamasını, her uzvunun (ellerinin, kollarının, bacaklarının) değişik şekillerde hareket etmelerini arzu eder. Bunu için bu üç boyulu grafiği oluşturan vertexler yani bağlantı noktalar hareket esnasında koordinatlarını değiştirirler.
* Yani yüzlerce vertex içinden bir tanesini ele alırsak; vertex(140, 270, 660) ise ele aldığımız vertex, koordinatları üç boyutlu grafiğin hareket esnasında koordinatlarını değiştirecek ve belki de yeni vertex; vertex(220, 290, 550) olacak.
* Şimdi; üç boyutlu bir grafiği oluşturan binlerce vertex, nasıl koordinatlarını değiştirir? Veya hangi işlemlerden sonra koordinatlarını değiştir sorusu için; çeşitli nesne taşıma formülleri, vektörler, matrisler işin içine giriyor dersek bu konu için yeterli olur çünkü bu konuda direct3d üzerinde duruyoruz.
* 3D nesnelerin hareket etmesi için kullanılan hesaplamalar ve formüller konu dahilinde değil...
* Bunca anlatımdan sonra **Direct3D** için şunu da belirtmenin zamanı geldi... İşte *Direct3D;* Video oyunu geliştiricileri için bu türlü ilkel veri tipleri ile uğraşmak zorunda kalmamalarını sağlar.
* Aslında *Direct3D* konusu buraya kadar da değil, bunca süredir anlattığımız üç boyutlu nesnelerin hareketlerinin sağlanmasından tutun da, **Işık ve yansıma gibi olayların** da üretimini sağlamasıdır.
* ***Yani sadece 3D hesaplamaları için değil; ışık ve bu gibi fiziksel hesaplamalarını da kendisi yapar. Tabii tahmin edersiniz ki, gereken argümanların verilmesi ile...***