Bir model dosyası 3D Studio Max veya Blender gibi 3 boyutlu modelleme programları aracılığıyla oluşturulmuş ve dışa aktarılmış paketler olarak bir oyuna aktarılır. Biz oyunlarımızda “*.FBX” uzantılı model dosyalarını kullanacağız. Bu dosya temel olarak içinde örgü noktaları olan “vertice” adı verilen noktaların listesini tutar. Bir model çizilirken bu noktalar birbiri ile birleştirilip kenarları (edge) ve çeşitli yüzeyleri (mesh, polygon) oluşturur. Böylece düzgün bir yüzey (surface) görüntüsü elde edilir.
Oyunumuzda bir modeli kullanmak için öncelikle oyun projesine eklememiz gereklidir. XNA proje içindeki bu modelleri otomatik olarak inşa edip (build) oyunda kullanılacak hale getirmektedir. Oyuna bir model eklemek için “Solution Explorer” sekmesi altındaki “Content” (içerik) bölümüne sağ tıklayarak, “Add” (ekle) menüsü altındaki “Add Existing Item” (varolan bir nesneyi ekle) seçeneği ile projeye dahil edebiliriz.
Kaplama dosyasını (texture) ayrı bir dosya olarak içeren model dosyaları için kaplama dosyaları model ile aynı klasörde olmalıdır ancak kaplama dosyasının projeye dahil edilmesi gerekli değildir. XNA inşa işlemine başladığında projedeki bütün dosyaları ve bu dosyaların referansını içerdiği bütün dosyaları da inşa eder. Bu, bizim modelimiz içinde zaten referans olarak gösterilmiş olan kaplama dosyasının iki kere işlenmesi anlamına gelir. Bunu önlemek için kaplama dosyasına sağ tıklayarak “Exclude from Project” (projeden ayır) diyebiliriz. Böylece asıl dosya bulunması gereken klasörde bulunurken, iki kere işlenmemiş olur.
Model dosyası projeye eklendiğine göre artık oyunumuza çağırabiliriz. Bunun için içerik yüklenmesi sırasında çalışmakta olan hazır bir sınıfı, “ContentManager” sınıfını kullanacağız. XNA oyunu bu sınıfın bir örneğini zaten içerir. Dolayısıyla “LoadContent()” methodu içinde çağırıp kullanabiliriz.
Modelimizi oyunda göstermek için öncelikle Model sınıfından bir örnek almalıyız. Model sınıfı modelin çizilmesi veya üzerinde çalışılması için gerekli verileri içerir. Ayrıca modelin içinde barındırdığı örgü dönüşümlerini (mesh transformations) tutmak için bir matris dizisine ihtiyacımız vardır.
Model model; Matrix[] transforms;
Artık LoadContent() methodu içerisinde ContentManager sınıfının Load() methodu ile modelimizi yükleyebiliriz. Bu method parametre olarak uzantısı olmadan, sadece dosya ismini almaktadır. Burada önemli bir noktaya dikkat edilmelidir. Bu method ile aynı isme sahip fakat farklı uzantılara sahip dosyaları yüklemenin mümkün olmadığı anlamına gelir.
model = Content.Load<Model>("Skyline"); transforms = new Matrix(model.Bones.Count); model.CopyAbsoluteBoneTransformsTo(transforms);
XNA’da bir model mesh adı verilen parçalardan oluşur. Her modelin 3 boyutlu uzayda kendi dönüşümleri vardır ve her mesh bütün modele göre kendine özgü dönüşümlere sahiptir. Model sınıfı bütün bu dönüşümleri bir iskelet yapısıyla içinde barındırır. Burada her bir mesh bir kemiğe (bone) denk gelir. Kodun son iki satırında bulunan kod ile bu kemiklerin boyutunda boş bir matris oluşturulup, dönüşüm bilgileri transforms dizisine kopyalanmaktadır.