Skip to content

ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 25: एक स्केलेटन, हर पोशाक

Oleg Sidorkin द्वारा, Cinevva के CTO और सह-संस्थापक

यहाँ नए हैं? सीरीज़ गाइड का इस्तेमाल करें। यह बताती है कि स्पाइक क्या होता है और सभी भागों को लिंक करती है।

भाग 24 ने वर्ल्ड को persistent बनाया और उसकी वनस्पति को हवा दी। यह भाग फिर से उसमें मौजूद लोगों के बारे में है, लेकिन वॉर्डरोब की तरफ से: क्या एक creator एक बेस बॉडी चुन सकता है, कपड़े बदल सकता है, हेयरस्टाइल चुन सकता है, और कोई भी एनिमेशन चला सकता है, वह सब एक मुफ्त asset पैक पर, बिना किसी rigging और बिना किसी एनिमेशन authoring के? एक कस्टम rig बनाना de-risk करने लायक सही चीज़ नहीं है। जवाब देने लायक सवाल यह है कि क्या एक CC0 पैक पूरा भार उठा सकता है।

एक पैक जो आपस में फिट होने के लिए ही बनाया गया था

Spike 50 को नए टैब में खोलें ↗ · सोर्स देखें

Quaternius चार assets भेजता है जो लगभग संदेहास्पद रूप से अच्छी तरह मेल खाते हैं: Universal Base Characters जिसमें पुरुष और महिला बॉडी के साथ आठ हेयरस्टाइल और दो आइब्रो सेट हैं, Modular Character Outfits जो body, arms, legs और feet हिस्सों में बँटे हैं और साथ में pauldrons और एक hood जैसी accessories हैं, और Universal Animation Library पैक एक और दो, कुल मिलाकर 262 क्लिप जो locomotion, combat, climbing, farming, fishing, idles और social moves को कवर करते हैं। उनके glTF का निरीक्षण करने पर पता चला कि वे क्यों फिट होते हैं: चारों पैक का हर एक mesh एक ही 65-जॉइंट UE5-स्टाइल स्केलेटन पर rigged है, वही जॉइंट नाम, वही bind poses, root से pelvis और spine होते हुए head तक, हर तरफ पंद्रह उँगली जॉइंट वाली मिरर की हुई arms, मिरर की हुई legs। कोई retargeting नहीं चाहिए। यह स्पाइक 35 की तीन-स्केलेटन retargeting समस्या के बिल्कुल उलट है, जहाँ एक 213-बोन फेस rig को एक 65-बोन Mixamo rig से बात करनी पड़ती थी। यहाँ चारों पैक जानबूझकर एनिमेशन लाइब्रेरी के स्केलेटन पर authored थे, और यह जुड़ाव बिल्कुल सटीक है।

इसने इस स्पाइक को एनिमेशन-पाइपलाइन के अभ्यास के बजाय एक बाइंडिंग अभ्यास में बदल दिया। बेस लेयर एक body glTF लोड करती है, सीन को SkeletonUtils.clone से क्लोन करती है ताकि हर कैरेक्टर को एक ताज़ा स्केलेटन इंस्टेंस मिले बजाय इसके कि bone म्यूटेशन वापस loader के कैश्ड सीन में जाएँ, और उस 65-बोन स्केलेटन को canonical के रूप में कैश करती है साथ ही उस armature ऑब्जेक्ट को भी जो एनिमेशन का root है।

एक कोट को बॉडी पर री-बाइंड करना

जो ट्रिक पूरी चीज़ को काम करवाती है वह यह है कि आप किसी outfit के mesh को सीधे सीन में दोबारा parent नहीं कर सकते, क्योंकि वह अब भी अपने खुद के glTF की bones को रेफर करता है, जो एक अलग subtree में बैठी होती हैं। हर modular हिस्सा, एक peasant body या एक ranger की legs, अपने खुद के SkinnedMesh के रूप में आता है जिसके पास उसी armature का अपना क्लोन होता है। बाइंडिंग सोर्स स्केलेटन की bones को उनके मूल क्रम में चलती है, हर एक को नाम से canonical स्केलेटन में ढूँढती है, और उन री-बाउंड bones से एक नया Skeleton बनाती है जो सोर्स के bind-inverse मैट्रिसेज़ को फिर से इस्तेमाल करता है, फिर सोर्स के identity bind मैट्रिक्स के साथ SkinnedMesh.bind को कॉल करती है। बाइंडिंग के बाद, mesh अपने सोर्स सीन से अलग हो जाता है और सीधे कैरेक्टर root के नीचे parent हो जाता है। चूँकि bind मैट्रिक्स bind समय पर world transform को कैप्चर कर लेता है और root identity पर बैठा है, mesh का अपना world transform आउटपुट को कभी प्रभावित नहीं करता और skinning पूरी तरह अब-साझा bones के ज़रिए होती है।

Hair और eyebrows भी slots हैं, और उन्होंने एक गलत धारणा को सुधार दिया। फोल्डर स्ट्रक्चर कहता था "rigged to head bone," जिससे लगता था कि hair एक स्टैटिक mesh होगा जो head के साथ एक baked offset के साथ parent किया गया है। ऐसा नहीं है। हर hair फाइल एक SkinnedMesh है जो सभी 65 जॉइंट पर weighted है, जिसमें long hair का weight ऊपरी spine और neck में फैलता है ताकि कैरेक्टर के नीचे देखने पर वह झूल जाए। तो hair भी किसी भी outfit हिस्से जैसा ही नाम-आधारित री-बाइंडिंग रास्ता अपनाता है। एकमात्र खास मामला outfit body slot है: जब यह attach होता है, तो बेस body mesh को छिपा दिया जाता है ताकि outfit उसमें से clip न करे, जबकि arms, legs, feet और accessories बस एक के ऊपर एक स्टैक हो जाते हैं क्योंकि पैक ने उन्हें इस तरह authored किया है कि वे बेस body के साथ सह-अस्तित्व में रहें और जहाँ कपड़े त्वचा को खुला छोड़ते हैं वहाँ वह दिखती रहे।

मुफ्त में 262 एनिमेशन

एक बार स्केलेटन साझा हो जाने के बाद एनिमेशन लगभग anticlimactic है। दोनों लाइब्रेरी glbs लोड होती हैं, उनके क्लिप एक नामांकित सूची में सपाट हो जाते हैं, और उन क्लिप में track नाम सटीक जॉइंट नामों को bone.position, bone.quaternion और bone.scale के ज़रिए रेफर करते हैं। कैरेक्टर के armature पर rooted एक AnimationMixer उन bones को नाम से ढूँढता है और उन्हें सीधे चलाता है, स्विच पर crossfade करते हुए। viewer का दायाँ पैनल सभी 262 क्लिप की एक फ़िल्टर-योग्य सूची है जिसमें एक source pill है, तो "fish" खोजने पर दोनों लाइब्रेरी की हर fishing एनिमेशन सामने आ जाती है। सॉफ्ट shadows के साथ स्टैंडर्ड three-point lighting, पैरों के नीचे एक polar grid, और ACES tone mapping स्टाइलाइज़्ड बेस textures को पढ़ने लायक बनाए रखते हैं बिना गहरे bodysuit की shadows को कुचले।

यह प्रोडक्ट के लिए जो de-risk करता है वह बहुत बड़ा है। avatar कस्टमाइज़ेशन फीचर शून्य rigging काम और शून्य एनिमेशन authoring के साथ एक CC0 पैक पर शिप हो सकता है: चारों पैक डाल दें, एक वॉर्डरोब UI वायर कर दें, और आपके पास लगभग छह outfits गुणा आठ हेयरस्टाइल गुणा दो लिंग गुणा 262 एनिमेशन जितनी विविधता बॉक्स से बाहर निकलते ही मिल जाती है। 65-जॉइंट स्केलेटन इतना छोटा है कि GPU skinning की लागत नगण्य है, और स्पाइक 45 का batched-skinning काम इस आकार के rig पर पहले से ही 200-प्लस avatars संभाल लेता है। CC0 पर कोई इस्तेमाल पाबंदी नहीं होती, तो एक paid creator प्लेटफॉर्म पर commercial उपयोग ठीक है। बाकी बचा खुला सवाल कस्टम-अपलोड किए गए outfits का है, जो एक Phase 3 की समस्या है और इसे अपलोड समय पर इस canonical स्केलेटन पर retargeting करके हल किया जाता है, जो स्पाइक 35 की runtime retargeting का उलटा है। asset का फुटप्रिंट डिस्क पर लगभग 147 MB है जो raw 2K PNGs और uncompressed एनिमेशन glbs के रूप में है, जिसे production KTX2 texture compression और एक gltf-transform पास के साथ घटाकर लगभग 30 MB कर देगा।

इस अध्याय में संदर्भित तकनीक

एक पैक भर में एक canonical स्केलेटन। चार Quaternius पैक (बेस बॉडी, modular outfits, दो एनिमेशन लाइब्रेरी) सभी एक समान 65-जॉइंट UE5-स्टाइल स्केलेटन पर एक ही जॉइंट नामों और bind poses के साथ rigged हैं, तो उन्हें जोड़ने के लिए कोई retargeting नहीं चाहिए। बेस को SkeletonUtils.clone से क्लोन करने पर हर कैरेक्टर को loader के कैश्ड सीन को म्यूटेट करने के बजाय एक ताज़ा स्केलेटन इंस्टेंस मिलता है।

नाम-आधारित स्केलेटन री-बाइंडिंग। हर modular हिस्सा अपने खुद के armature को रेफर करते हुए अपना खुद का SkinnedMesh भेजता है। री-बाइंडिंग सोर्स bones को क्रम में चलती है, हर एक को नाम से canonical स्केलेटन में मैप करती है, सोर्स bind-inverses को फिर से इस्तेमाल करते हुए एक नया Skeleton बनाती है, और identity bind मैट्रिक्स के साथ SkinnedMesh.bind को कॉल करती है, फिर mesh को साझा कैरेक्टर root के नीचे parent करती है ताकि skinning पूरी तरह साझा bones के ज़रिए चले। outfit body slot clipping से बचने के लिए बेस body को छिपा देता है; बाकी slots स्टैक हो जाते हैं।

एक skinned slot के रूप में Hair। Hair एक स्टैटिक head-bone attachment नहीं बल्कि एक SkinnedMesh है जो सभी 65 जॉइंट पर weighted है, जिसमें long hair को ऊपरी spine और neck में weight किया गया है ताकि नीचे देखने पर वह झूल जाए। यह outfit हिस्सों जैसा ही री-बाइंडिंग रास्ता अपनाता है।

मुफ्त में नाम-कुंजी आधारित एनिमेशन retargeting। Animation Library क्लिप जॉइंट को सटीक नाम से रेफर करते हैं, तो साझा armature पर rooted एक AnimationMixer सभी 262 क्लिप को crossfade के साथ सीधे चलाता है, बिना किसी प्रति-क्लिप retargeting के। एक CC0 लाइसेंस commercial उपयोग को कवर करता है, और छोटा जॉइंट काउंट GPU skinning को इतना सस्ता रखता है कि स्पाइक 45 के batched-skinning रास्ते को फिर से इस्तेमाल किया जा सके। देखें GPU-driven LOD


29 में से भाग 25। पिछला: भाग 24 - एक वर्ल्ड को सेव करना, और वह हवा जो आप देख सकते हैं अगला: भाग 26 - वह पानी जो हर पैमाने पर टिकता है सीरीज़ गाइड: /blog/2026-02-25-open-world-browser-series-guide