|
XNA de Mesh Yükleme Öncelikle microsoft.com adresinden XNA GSE 1.0 Refresh,C# express edition 2005 ve XNA redistributable uygulamalarını indirip kuruyoruz… XNA redist -> C# express edition -> xna gse 1.0 refresh şeklinde bir sırayla yüklemenizi öneririm... Yükleme işlemi tamamlandıktan sonra XNA ile çalışmalarımıza başlayabiliriz… İlk önce 3D Grafik Uygulamalarında bir nesne oluşturalım… Örnek olsun diye Cinema4D de bir nesne yaratacağız.Mantığı diğer 3d grafik programlarında da aynıdır 
Resim-1: Cinema4D 8 in Kullanıcı Arayüzü…
Örnek olarak Bir Sphere(Küre) Nesnesi ekledim… Şimdi yapacağımız işlem Xport adındaki Cinema4d için hazırlanmış .X oluşturucusu pluginini kullanaraktan X dosyası yaratmak…
Görüldüğü üzere File-Export menüsünün alt dalı olarak X-File Export die bir seçenek çıktı.Şimdi bu seçeneğe tıklayalım… Karşımıza hangi isimle kayıt edeceğimize dair bir Diyalog penceresi çıktı.Bir isim verelim.Örneğin deneme.Enter a yada Tamam a basınca.Bir diyalog penceresi gelecektir.Aynen aşağıdaki gördüğümüz gibi
Burada export etmek istediğimiz bilgileri ayarlayabilirsiniz.Nitekim Bones,Animation,Frame vesaire… Ok e tıklayarak Export işlemini tamamlayalım… Dosyamız oluşturulmuş oldu… Şimdi XNA tarafına geçelim… 
Xna bizim yerimize otomatikman kod oluşturuyor.Gerekli öğeleri projemize ekleyelim.biz deneme.x ismini vermiştik hatırlarsanız…  İlgili projemize sağ tuş Add Existing Item tıklayıp deneme.x i projeye ekliyoruz 
Deneme.X dosyamıza sağ tıklayarak Properties den Asset Name ini deneme olarak değiştirin…Asset name ler ilgili öğelere kodlamada erişmek için kullanılan anahtar sözcüklerdir.Kodlama yapınca daha iyi anlayacaksınız… Şimdi Mesh kodlamaya geçelim.Öğelerimizi eklediğimize göre şimdi gönül rahatlığıyla Meshlerle çalışabiliriz… İlk önce GraphicsDeviceManager ve Content Manager tanımladığımız yerlere birkaç değişken ekleyeceğiz… 1)Modelin pozisyonunu tutan Vector3 tipinde bir değişken; Vector3 modelpoz = Vector3.Zero; 2)Modeli döndürmek için kullanabileceğimiz bir kayan noktalı sayı tipi(float); float modelrot = 0.0f; 3)Kamera Pozisyonunu tutan Vector3 tipinde bir değişken; Vector3 kamerapoz = new Vector3(50.0f, 50.0f, 500f); 4)Açı Oranımızı ayarlamak için kullanabileceğimiz bir float tipi değişkenimiz; float aci_oran = 1.5f; 5)Modelimizi saklayacak Model tipi değişkenimiz; Model modelimiz; Değişkenlerimizi tanımladığımıza göre bu değişkenlerimizi kullanalım… LoadGraphicsContent fonksiyonunu bulun ve if (loadAllContent) kodlamasının içerisine aşağıdaki kodu ekleyiniz… modelimiz = content.Load<Model>("deneme"); Update fonksiyonumuza gelip aşağıdaki kodu ekleyiniz yada dilediğinize göre değiştiriniz… modelrot += 360.0f; Bu kodlama modelimizin ne tarz bir matematiksel ifade ile döndürüleceğini belirtir… Sonraki işlemimiz Draw Fonksiyonuna gelip aşağıdaki kod yapısını eklemek olacaktır… graphics.GraphicsDevice.Clear(Color.Black); Matrix[] transformasyon = new Matrix[modelimiz.Bones.Count]; modelimiz.CopyAbsoluteBoneTransformsTo(transformasyon); foreach (ModelMesh mesh in modelimiz.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.DiffuseColor = new Vector3(100.0f, 200.0f, 100.0f); effect.AmbientLightColor = new Vector3(100.0f, 100.0f, 100.0f); effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(modelrot) * Matrix.CreateTranslation(modelpoz); effect.View = Matrix.CreateLookAt(camerapoz,Vector3.Zero,Vector3.Up); effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aci_oran, 1.0f, 10000.0f); } mesh.Draw(); } Bu kodlamada ilk önce yaptığımız işlem Ekranı siyah bir renkle temizlemek oldu. Sonraki işlemimiz modelimizde bulunan Bonelerin sayısını bir Matrix dizisine aktarmak oldu. Eğer modelimiz Bone li olsaydı bu çok işimize yarardı.Modelimiz normal bir primitif nesne olan Sphere(Küre) olduğundan böyle bir gereksinime ihtiyaç yok. Foreach döngümüzün ilk ayağı olan ModelMesh nesnesi modelimizde bulunan meshler üzerinde işlem yapacaktır.İç foreach döngümüzde Effect uyguluyoruz. Yalnız bu efekt sistemi HLSL yada diğer sistemler gibi değil tamamen XNA içine entegre edilmiş bir Efekt sistemidir.bir HLSL,CGFX kadar yetenekli değildir… Effect.diffusecolor da ilgili modele renk verebiliyoruz.Nitekim ben Turkuazımsı bir renk tercih ettim Diğer kodlamalar sırasıyla world,view ve projection işlemleri ile alakalıdır.Bunlar kamera pozisyonu, model pozisyonlarını ayarlamamızda işimize yarıyorlar.Ayrıca bu nesneler shader dillerinde de kullanılabiliyor… 45 derecelik bir perspektif görünüm yakalayarak modelimizi ekranda sürekli olarak döndürüyoruz… Mesh.draw diyerek kendi fonksiyonumuzu yeniden çağırıyoruz ki Model gösterme işlemimiz sürekli olsun… Projemizi çalıştırıyoruz ve böylece aşağıdaki gibi bir görünüme kavuşuyoruz.
İşte bu kadar… XNA de Mesh yükleme olayı bu kadar basittir… Saygılarımla İbrahim Ersoy
|