{"id":495,"date":"2009-10-08T18:17:04","date_gmt":"2009-10-08T18:17:04","guid":{"rendered":"http:\/\/shultays.wordpress.com\/?p=222"},"modified":"2009-10-08T18:17:04","modified_gmt":"2009-10-08T18:17:04","slug":"directx-md3loader","status":"publish","type":"post","link":"https:\/\/enginmercan.com\/?p=495","title":{"rendered":"Directx md3Loader"},"content":{"rendered":"<p>Uzun bir aradan sonra md3Loader \u0131 tamamlamaya zaman ay\u0131rabildim.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.shultays.com\/blog\/wp-content\/uploads\/2009\/10\/md3.jpg\" alt=\"md3\" title=\"md3\" width=\"667\" height=\"505\" class=\"aligncenter size-full wp-image-185\" \/><\/p>\n<p>\u0130ki tane k\u00fct\u00fcphanemiz var. md3Model.h ve PlayerModel.h<\/p>\n<p>md3Model.h .md3 dosyalar\u0131n\u0131 projemizde kullanabilmemize yar\u0131yor. load methodu ile bir texture ve md3 dosyas\u0131 veriyoruz ve her \u015feyi kendisi haz\u0131rl\u0131yor. Daha sonra draw methodu ile \u00e7izebiliyoruz. <\/p>\n<p>Di\u011fer k\u00fct\u00fcphanemizde PlayerModel.h. Bu k\u00fct\u00fcphane bir txt dosyas\u0131ndan gerekli adresleri al\u0131yor ve modelimizi olu\u015fturuyor. Yine ayn\u0131 \u015fekilde load ve draw methodu var. Fakat bunun draw methoduna b\u00fct\u00fcn de\u011fi\u015fkenleri zor olaca\u011f\u0131 i\u00e7in de\u011fi\u015fkenleri hep public olarak tan\u0131mlad\u0131m. Bunlar\u0131 d\u00fczenleyip draw methodunu \u00e7a\u011f\u0131r\u0131yoruz. Umuyorum ki \u00f6rnek program\u0131 inceleyince daha anla\u015f\u0131l\u0131r olacakt\u0131r.<\/p>\n<p><a href=\"http:\/\/www.shultays.com\/depo\/md3Loader\/md3Loader.rar\">\u00d6rnek dosya ve kaynak kodu<\/a><\/p>\n<p>Biraz md3 dosyas\u0131 yap\u0131s\u0131 \u00fczerine bahsedeyim. \u00d6ncelikle \u015fu <a href=\"http:\/\/icculus.org\/~phaethon\/q3a\/formats\/md3format.html\">sayfay\u0131<\/a> incelemekte fayda var. Bir md3 dosyas\u0131 bir y\u0131\u011f\u0131n structure \u0131n birle\u015fiminden olu\u015fuyor. <\/p>\n<p>En ba\u015fta (adres 0 dan ba\u015flayarak) ana struct \u0131m\u0131z bulunuyor. Bu structure da ka\u00e7 toplam animasyonun ka\u00e7 frame den olu\u015ftu\u011fu, modelimiz i\u00e7inde ka\u00e7 tane surface (model par\u00e7ac\u0131\u011f\u0131 diyelim, mesela bir kafa modeli i\u00e7in kafa ve g\u00f6zl\u00fck farkl\u0131 surface ler olabiliyor) ve taglar\u0131m\u0131z say\u0131s\u0131n\u0131 bulabiliyoruz. (Ayr\u0131ca shader say\u0131s\u0131 var ama ben kullanmad\u0131m)<\/p>\n<p>md3 modelleri animasyon i\u00e7in frame diye bir yap\u0131 kullan\u0131yor. Bir frame de model deki t\u00fcm noktalar\u0131n o an ki koordinat\u0131 bulunuyor. Mesela sadece bir noktadan olu\u015fan bir model d\u00fc\u015f\u00fcnelim. Bu model 3 frame e sahip olsun ve animasyonuda sadece ileri gitmek olsun. Bu durumuda ilk frame de koordinat\u0131 0,0,0 ikincide koordinat\u0131 1,0,0 ve son frame de de 2,0,0 olacak.<\/p>\n<p>Bir animasyonu oynatmak i\u00e7in s\u0131ras\u0131 ile bu frame leri \u00e7iziyoruz. Mesela ko\u015fma animasyonu i\u00e7in toplam 10 tane frame bulunabiliyor. Ama asl\u0131nda bu animasyon 2 saniye s\u00fcrmesi gerekiyor. E\u011fer biz bu 10 frame i 2 saniyeye b\u00f6lersek saniyede 5 frame g\u00f6stermi\u015f olaca\u011f\u0131z bu da ak\u0131c\u0131 bir hareket sa\u011flamayacak.<\/p>\n<p>Bunu \u00e7\u00f6zmek i\u00e7in interpolation diye bir method kullan\u0131l\u0131yor. Interpolation methodu 2 ana frame aras\u0131nda ge\u00e7i\u015f frameleri olu\u015fturmam\u0131z\u0131 sa\u011fl\u0131yor. Bu ge\u00e7i\u015f frame i model \u00fczerinde ki her noktan\u0131n linear interpolation u ile olu\u015fturuluyor. \u00d6nceden verdi\u011fimiz nokta \u00f6rne\u011fi i\u00e7in frame 2.4 \u00fc hesaplamaya \u00e7al\u0131\u015f\u0131rsak 2. ve 3. keyframe leri kullanaca\u011f\u0131z. 2. keyframe deki koordinat 0.6 ile \u00e7arp\u0131lacak 3. frame de koordinat 0.4 ile \u00e7arp\u0131lacak ve toplam\u0131 bizim yeni koordinat\u0131m\u0131z olacak.<\/p>\n<p>\u00d6zetle animasyonu olay\u0131 bu \u015fekilde oluyor. \u015eunu belirteyim ki sitede belirtilen frame yap\u0131s\u0131nda bahsetti\u011fim koordinatlar tutulmuyor. B\u00fct\u00fcn koordinatlar surface yap\u0131s\u0131nda tutuluyor. Frame de o frame i\u00e7in bounding box ve sphere tutuluyor.<\/p>\n<p>Surface yap\u0131s\u0131na gelirsek as\u0131l \u00f6nemli her \u015feyin oldu\u011f\u0131 yap\u0131m\u0131z bu. Surface say\u0131s\u0131 dedi\u011fim gibi bir modelde ka\u00e7 tane modelcik olaca\u011f\u0131n\u0131 g\u00f6steriyor. Genelde bu say\u0131 1 olsa da kar\u0131\u015f\u0131k modeller i\u00e7in daha fazla olabiliyor.<\/p>\n<p>Bir surface yap\u0131s\u0131 \u00f6zetle her nokta i\u00e7in koordinatlar ve UV de\u011feri ve her \u00fc\u00e7gen i\u00e7in indice lerden olu\u015fuyor. Toplam koordinat say\u0131s\u0131 (modelimizdeki nokta say\u0131s\u0131)*(frame say\u0131s\u0131). Ayr\u0131ca her nokta i\u00e7in 1 adet UV yap\u0131s\u0131 (texture dosyas\u0131n\u0131n hangi koordinat\u0131na denk geldi\u011fi) bulunuyor. Ve son olarak toplam \u00fc\u00e7gen say\u0131s\u0131 ve her \u00fc\u00e7gen i\u00e7in hangi noktalar\u0131n kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6steren bir yap\u0131m\u0131z bulunuyor.<\/p>\n<p>Surface yap\u0131s\u0131 kar\u0131\u015f\u0131k bir yap\u0131, ama bahsetti\u011fim site gayet g\u00fczel bir \u015fekilde anlatm\u0131\u015f nas\u0131l bir \u015fey oldu\u011funu oray\u0131 inceleyerek daha iyi anlayabilirsiniz.<\/p>\n<p>Ve son olarak ta tag yap\u0131m\u0131z var (ana strucutre a ba\u011fl\u0131). Tag yap\u0131s\u0131 o anki md3 dosyam\u0131z\u0131n di\u011fer md3 dosyalar\u0131 ile nas\u0131l birle\u015ftirilece\u011fini tutuyor. Mesela bacaklar i\u00e7in kullan\u0131lan bir md3 dosyas\u0131nda tag_torso isminde bir tak bulunuyor. Bu tag \u0131 kullanarak v\u00fccudun \u00fcst k\u0131sm\u0131n\u0131 hareket ettirip yerine oturtabiliyoruz. Yine bu yap\u0131 her frame i\u00e7in farkl\u0131 oluyor.<\/p>\n<p>Daha ayr\u0131nt\u0131l\u0131 olarak anlatamayaca\u011f\u0131m malesef, ama dosyay\u0131 kullanmak istiyorsunuz sadece animasyonun nas\u0131l oldu\u011funu bilmeniz yeterli onuda \u00f6rnek program\u0131 inceleyerek \u00e7\u00f6zebilirsiniz zate. Kolay gelsin =)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uzun bir aradan sonra md3Loader \u0131 tamamlamaya zaman ay\u0131rabildim. \u0130ki tane k\u00fct\u00fcphanemiz var. md3Model.h ve PlayerModel.h md3Model.h .md3 dosyalar\u0131n\u0131 projemizde kullanabilmemize yar\u0131yor. load methodu ile bir texture ve md3 dosyas\u0131 veriyoruz ve her \u015feyi kendisi haz\u0131rl\u0131yor. Daha sonra draw methodu ile \u00e7izebiliyoruz. Di\u011fer k\u00fct\u00fcphanemizde PlayerModel.h. Bu k\u00fct\u00fcphane bir txt dosyas\u0131ndan gerekli adresleri al\u0131yor ve modelimizi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,15,12],"tags":[],"class_list":["post-495","post","type-post","status-publish","format-standard","hentry","category-cc","category-directx","category-grafik"],"_links":{"self":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/posts\/495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=495"}],"version-history":[{"count":0,"href":"https:\/\/enginmercan.com\/index.php?rest_route=\/wp\/v2\/posts\/495\/revisions"}],"wp:attachment":[{"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enginmercan.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}