Uzun bir aradan sonra md3Loader ı tamamlamaya zaman ayırabildim.
İki tane kütüphanemiz var. md3Model.h ve PlayerModel.h
md3Model.h .md3 dosyalarını projemizde kullanabilmemize yarıyor. load methodu ile bir texture ve md3 dosyası veriyoruz ve her şeyi kendisi hazırlıyor. Daha sonra draw methodu ile çizebiliyoruz.
Diğer kütüphanemizde PlayerModel.h. Bu kütüphane bir txt dosyasından gerekli adresleri alıyor ve modelimizi oluşturuyor. Yine aynı şekilde load ve draw methodu var. Fakat bunun draw methoduna bütün değişkenleri zor olacağı için değişkenleri hep public olarak tanımladım. Bunları düzenleyip draw methodunu çağırıyoruz. Umuyorum ki örnek programı inceleyince daha anlaşılır olacaktır.
Biraz md3 dosyası yapısı üzerine bahsedeyim. Öncelikle şu sayfayı incelemekte fayda var. Bir md3 dosyası bir yığın structure ın birleşiminden oluşuyor.
En başta (adres 0 dan başlayarak) ana struct ımız bulunuyor. Bu structure da kaç toplam animasyonun kaç frame den oluştuğu, modelimiz içinde kaç tane surface (model parçacığı diyelim, mesela bir kafa modeli için kafa ve gözlük farklı surface ler olabiliyor) ve taglarımız sayısını bulabiliyoruz. (Ayrıca shader sayısı var ama ben kullanmadım)
md3 modelleri animasyon için frame diye bir yapı kullanıyor. Bir frame de model deki tüm noktaların o an ki koordinatı bulunuyor. Mesela sadece bir noktadan oluşan bir model düşünelim. Bu model 3 frame e sahip olsun ve animasyonuda sadece ileri gitmek olsun. Bu durumuda ilk frame de koordinatı 0,0,0 ikincide koordinatı 1,0,0 ve son frame de de 2,0,0 olacak.
Bir animasyonu oynatmak için sırası ile bu frame leri çiziyoruz. Mesela koşma animasyonu için toplam 10 tane frame bulunabiliyor. Ama aslında bu animasyon 2 saniye sürmesi gerekiyor. Eğer biz bu 10 frame i 2 saniyeye bölersek saniyede 5 frame göstermiş olacağız bu da akıcı bir hareket sağlamayacak.
Bunu çözmek için interpolation diye bir method kullanılıyor. Interpolation methodu 2 ana frame arasında geçiş frameleri oluşturmamızı sağlıyor. Bu geçiş frame i model üzerinde ki her noktanın linear interpolation u ile oluşturuluyor. Önceden verdiğimiz nokta örneği için frame 2.4 ü hesaplamaya çalışırsak 2. ve 3. keyframe leri kullanacağız. 2. keyframe deki koordinat 0.6 ile çarpılacak 3. frame de koordinat 0.4 ile çarpılacak ve toplamı bizim yeni koordinatımız olacak.
Özetle animasyonu olayı bu şekilde oluyor. Şunu belirteyim ki sitede belirtilen frame yapısında bahsettiğim koordinatlar tutulmuyor. Bütün koordinatlar surface yapısında tutuluyor. Frame de o frame için bounding box ve sphere tutuluyor.
Surface yapısına gelirsek asıl önemli her şeyin olduğı yapımız bu. Surface sayısı dediğim gibi bir modelde kaç tane modelcik olacağını gösteriyor. Genelde bu sayı 1 olsa da karışık modeller için daha fazla olabiliyor.
Bir surface yapısı özetle her nokta için koordinatlar ve UV değeri ve her üçgen için indice lerden oluşuyor. Toplam koordinat sayısı (modelimizdeki nokta sayısı)*(frame sayısı). Ayrıca her nokta için 1 adet UV yapısı (texture dosyasının hangi koordinatına denk geldiği) bulunuyor. Ve son olarak toplam üçgen sayısı ve her üçgen için hangi noktaların kullanıldığını gösteren bir yapımız bulunuyor.
Surface yapısı karışık bir yapı, ama bahsettiğim site gayet güzel bir şekilde anlatmış nasıl bir şey olduğunu orayı inceleyerek daha iyi anlayabilirsiniz.
Ve son olarak ta tag yapımız var (ana strucutre a bağlı). Tag yapısı o anki md3 dosyamızın diğer md3 dosyaları ile nasıl birleştirileceğini tutuyor. Mesela bacaklar için kullanılan bir md3 dosyasında tag_torso isminde bir tak bulunuyor. Bu tag ı kullanarak vücudun üst kısmını hareket ettirip yerine oturtabiliyoruz. Yine bu yapı her frame için farklı oluyor.
Daha ayrıntılı olarak anlatamayacağım malesef, ama dosyayı kullanmak istiyorsunuz sadece animasyonun nasıl olduğunu bilmeniz yeterli onuda örnek programı inceleyerek çözebilirsiniz zate. Kolay gelsin =)