Skip to content

Tarayıcıda açık bir dünya inşa etmek, bölüm 25: Tek iskelet, her kıyafet

Cinevva CTO'su ve Kurucu Ortağı Oleg Sidorkin tarafından

Burada yeni misiniz? Seri rehberine göz atın. Rehber, spike'ın ne olduğunu açıklıyor ve tüm bölümlere bağlantı veriyor.

24. Bölüm, dünyayı kalıcı hâle getirdi ve bitki örtüsüne rüzgâr ekledi. Bu bölüm yine dünyadaki insanlarla, ancak bu kez gardırop açısından ilgili: Bir içerik üreticisi temel bir vücut seçip kıyafetleri değiştirebilir, bir saç modeli belirleyebilir ve tamamen ücretsiz bir varlık paketiyle, rigleme ya da animasyon hazırlama gerektirmeden herhangi bir animasyonu oynatabilir mi? Riski azaltmak için özel bir rig oluşturmak doğru hedef değil. Yanıtlanması gereken asıl soru, bir CC0 paketinin tüm yükü taşıyıp taşıyamayacağı.

Birlikte uyumlu çalışmak üzere hazırlanmış bir paket

Spike 50'yi yeni bir sekmede aç ↗ · Kaynak kodunu görüntüle

Quaternius, neredeyse kuşku uyandıracak kadar iyi örtüşen dört varlık sunuyor: erkek ve kadın vücutlarının yanı sıra sekiz saç modeli ve iki kaş seti içeren Universal Base Characters; omuz zırhları ve kapüşon gibi aksesuarlarla birlikte gövde, kol, bacak ve ayak parçalarına ayrılan Modular Character Outfits; ayrıca hareket, dövüş, tırmanma, çiftçilik, balıkçılık, bekleme ve sosyal hareketleri kapsayan toplam 262 kliplik Universal Animation Library birinci ve ikinci paketleri. glTF dosyalarını incelemek, bunların neden birbiriyle uyumlu olduğunu ortaya çıkardı: Dört paketteki her bir mesh, bilinçli olarak aynı 65 eklemli UE5 tarzı iskelete riglenmiş; eklem adları ve bind pozları aynı, yapı kökten pelvise ve omurga üzerinden başa uzanıyor, her iki tarafta on beşer parmak eklemi bulunan aynalanmış kollar ve aynalanmış bacaklar yer alıyor. Yeniden hedefleme gerekmiyor. Bu, 213 kemikli bir yüz riginin 65 kemikli bir Mixamo rigiyle iletişim kurmak zorunda olduğu Spike 35'teki üç iskeletli yeniden hedefleme probleminin tam tersi. Burada dört paketin tamamı bilinçli olarak animasyon kütüphanesinin iskeleti üzerinde hazırlanmış ve eşleşme kusursuz.

Bu durum spike'ı bir animasyon iş akışı çalışması olmaktan çıkarıp bağlama çalışmasına dönüştürdü. Temel katman bir vücut glTF'si yüklüyor, kemik değişikliklerinin yükleyicinin önbelleğe alınmış sahnesine geri aktarılmasını önlemek ve her karaktere yeni bir iskelet örneği vermek için sahneyi SkeletonUtils.clone ile klonluyor, ardından bu 65 kemikli iskeleti ve animasyonun kökünü oluşturan armature nesnesini standart olarak önbelleğe alıyor.

Bir ceketi vücuda yeniden bağlamak

Tüm sistemi çalıştıran püf noktası, bir kıyafetin mesh'ini doğrudan sahnede başka bir üst nesneye bağlayamamanızdır; çünkü mesh hâlâ farklı bir alt ağaçta bulunan kendi glTF'sindeki kemiklere referans verir. Köylü gövdesi ya da korucu bacakları gibi her modüler parça, aynı armature'ün kendi klonuna sahip ayrı bir SkinnedMesh olarak gelir. Bağlama işlemi, kaynak iskeletin kemiklerini özgün sıralarında dolaşır, her birini standart iskelette adına göre bulur ve kaynağın ters bind matrislerini yeniden kullanarak bu yeniden bağlanmış kemiklerden yeni bir Skeleton oluşturur; ardından kaynağın birim bind matrisiyle SkinnedMesh.bind çağrısı yapar. Mesh, bağlandıktan sonra kaynak sahnesinden ayrılır ve doğrudan karakter kökünün altına yerleştirilir. Bind matrisi, bağlama anındaki dünya dönüşümünü yakaladığı ve kök birim dönüşümde bulunduğu için mesh'in kendi dünya dönüşümü çıktıyı hiçbir zaman etkilemez; skinning işlemi artık tamamen paylaşılan kemikler üzerinden gerçekleşir.

Saç ve kaşlar da birer yuvadır ve yanlış bir varsayımı düzeltmemizi sağladılar. Klasör yapısında "baş kemiğine riglenmiş" ifadesi yer alıyordu; bu da saçın, önceden belirlenmiş bir ofsetle başa bağlanan statik bir mesh olacağını düşündürüyordu. Öyle değil. Her saç dosyası, 65 eklemin tamamına ağırlıklandırılmış bir SkinnedMesh'tir; uzun saçın ağırlıkları üst omurgaya ve boyna kadar yayıldığı için karakter aşağı baktığında saç doğal biçimde sarkar. Bu nedenle saç da herhangi bir kıyafet parçasıyla aynı ada göre yeniden bağlama yolunu izler. Tek özel durum, kıyafetin gövde yuvasıdır: Bu parça eklendiğinde kıyafetin temel vücudun içinden geçmesini önlemek için temel vücut mesh'i gizlenir. Kollar, bacaklar, ayaklar ve aksesuarlar ise doğrudan üst üste eklenir; çünkü paket, giysilerin cildi açıkta bıraktığı yerlerde temel vücut görünecek şekilde bu parçaların birlikte kullanılmasına uygun hazırlanmıştır.

Ücretsiz 262 animasyon

İskelet paylaşıldıktan sonra animasyon kısmı neredeyse heyecansız kalıyor. İki kütüphane glb'si yükleniyor, klipleri tek bir adlandırılmış listede birleştiriliyor ve bu kliplerdeki track adları tam eklem adlarına bone.position, bone.quaternion ve bone.scale aracılığıyla referans veriyor. Karakterin armature'ünü kök alan bir AnimationMixer, bu kemikleri adlarına göre bulup doğrudan hareket ettiriyor ve animasyonlar arasında geçiş yaparken crossfade uyguluyor. Görüntüleyicinin sağ panelinde 262 klibin tamamını içeren, filtrelenebilir ve kaynak etiketleri gösteren bir liste bulunuyor; böylece "fish" araması her iki kütüphanedeki tüm balıkçılık animasyonlarını ortaya çıkarıyor. Yumuşak gölgeli standart üç noktalı aydınlatma, ayakların altındaki kutupsal ızgara ve ACES ton eşleme, koyu renkli vücut giysisinin gölgelerini ezmeden stilize temel dokuların okunaklı kalmasını sağlıyor.

Bunun ürün açısından azalttığı risk oldukça büyük. Avatar özelleştirme özelliği, sıfır rigleme çalışması ve sıfır animasyon üretimiyle bir CC0 paketi üzerinden kullanıma sunulabilir: Dört paketi ekleyip bir gardırop arayüzü bağladığınızda, kullanıma hazır olarak yaklaşık altı kıyafet × sekiz saç modeli × iki cinsiyet × 262 animasyonluk çeşitlilik elde edersiniz. 65 eklemli iskelet, GPU skinning maliyetini ihmal edilebilir düzeyde tutacak kadar küçük ve Spike 45'teki toplu skinning çalışması bu boyuttaki bir rig üzerinde 200'den fazla avatarı zaten destekliyor. CC0 herhangi bir kullanım kısıtlaması getirmediği için ücretli bir içerik üretme platformunda ticari kullanımda sorun yok. Geriye kalan açık soru, kullanıcıların yüklediği özel kıyafetler. Bu, yükleme sırasında kıyafetleri bu standart iskelete yeniden hedefleyerek çözülecek bir 3. Aşama problemi; yani Spike 35'teki çalışma zamanı yeniden hedeflemesinin tersi. Varlıkların diskte kapladığı alan, ham 2K PNG'ler ve sıkıştırılmamış animasyon glb'leriyle yaklaşık 147 MB. Üretimde KTX2 doku sıkıştırması ve bir gltf-transform geçişiyle bu boyut yaklaşık 30 MB'a indirilebilir.

Bu bölümde kullanılan teknolojiler

Paket genelinde tek bir standart iskelet. Dört Quaternius paketinin tamamı (temel vücutlar, modüler kıyafetler ve iki animasyon kütüphanesi), aynı eklem adlarına ve bind pozlarına sahip, birbirinin aynısı 65 eklemli UE5 tarzı bir iskelete riglenmiştir; dolayısıyla bunları birleştirmek için yeniden hedefleme gerekmez. Temel modeli SkeletonUtils.clone ile klonlamak, yükleyicinin önbelleğe alınmış sahnesini değiştirmek yerine her karaktere yeni bir iskelet örneği verir.

Ada göre iskelet yeniden bağlama. Her modüler parça, kendi armature'üne referans veren ayrı bir SkinnedMesh ile gelir. Yeniden bağlama işlemi kaynak kemikleri sırasıyla dolaşır, her birini adına göre standart iskeletteki karşılığıyla eşler, kaynağın ters bind matrislerini yeniden kullanarak yeni bir Skeleton oluşturur ve birim bind matrisiyle SkinnedMesh.bind çağrısı yapar. Ardından mesh, paylaşılan karakter kökünün altına yerleştirilir; böylece skinning tamamen paylaşılan kemikler üzerinden çalışır. Kıyafet gövdesi yuvası, kesişmeyi önlemek için temel vücudu gizler; diğer yuvalar ise üst üste eklenir.

Skinning uygulanmış bir yuva olarak saç. Saç, baş kemiğine bağlanan statik bir nesne değil, 65 eklemin tamamına ağırlıklandırılmış bir SkinnedMesh'tir. Uzun saçın ağırlıkları üst omurga ve boyna kadar uzandığı için karakter aşağı baktığında saç sarkar. Kıyafet parçalarıyla aynı yeniden bağlama yolunu izler.

Ek işlem gerektirmeyen, ada dayalı animasyon yeniden hedefleme. Animation Library klipleri eklemlere tam adlarıyla referans verdiğinden, paylaşılan armature'ü kök alan bir AnimationMixer, 262 klibin tamamını klip başına yeniden hedefleme gerektirmeden ve crossfade ile doğrudan çalıştırır. CC0 lisansı ticari kullanımı kapsar; düşük eklem sayısı da GPU skinning maliyetini Spike 45'teki toplu skinning yolunu yeniden kullanmaya yetecek kadar düşük tutar. Bkz. GPU destekli LOD.


29 bölümden 25'incisi. Önceki: 24. Bölüm - Bir dünyayı kaydetmek ve görebildiğiniz rüzgâr Sonraki: 26. Bölüm - Her ölçekte etkileyici görünen su Seri rehberi: /blog/2026-02-25-open-world-browser-series-guide