Skip to content

सतह को सुलझाएँ, कंकाल को नहीं ​

लेखक: Oleg Sidorkin, Cinevva के CTO और सह-संस्थापक

भाग 1 में बारह CC0 जानवरों पर चार ऑटो-रिगर की तुलना कलाकारों के बनाए रिग से की गई और एक साझा खामी मिली: वे सभी लगभग सीधे पैरों वाला चौपाया बनाते हैं। उसका अंत रिग की मरम्मत करने की योजना के साथ हुआ, क्योंकि बिना मोड़ वाला पैर कलाकार के घुटने के कोण को दोहरा नहीं सकता, चाहे रीटार्गेटिंग कितनी भी अच्छी हो।

फिर परिणामों पर बहस करते समय एक सरल सवाल सामने आया। हम एनिमेशन को कंकालों के बीच ले ही क्यों जा रहे हैं?

कंकाल किसी सतह को विकृत करने वाली मशीन है। खिलाड़ी सतह को देखता है, और कलाकार की क्लिप पहले ही हमें ठीक-ठीक बता देती है कि हर फ़्रेम पर उस सतह का प्रत्येक वर्टेक्स कहाँ होना चाहिए। इसलिए कंकाल-से-कंकाल मैपिंग को पूरी तरह छोड़ दें। कलाकार की क्लिप एक बार चलाएँ, विकृत मेश रिकॉर्ड करें, फिर ऑटो-रिग किए गए कंकाल के ट्रांसफ़ॉर्म इस तरह सॉल्व करें कि उसकी अपनी स्किनिंग उस सतह को यथासंभव करीब से दोहरा सके। परिणाम ऐसी क्लिप है जो नए रिग के अपने स्पेस में स्वाभाविक रूप से मौजूद रहती है। जहाँ तक हमारा सवाल है, उसकी हड्डियों के नाम bone_0 भी हो सकते हैं।

पाइपलाइन आरेख: कलाकार की क्लिप से विकृत सतह, फिर प्रति-फ़्रेम सॉल्व और अंत में रिग के अपने स्पेस में क्लिप
पूरी पाइपलाइन। इसमें कहीं भी एक हड्डी को दूसरी हड्डी से मैप नहीं किया जाता, जिससे वह करेस्पॉन्डेंस समस्या समाप्त हो जाती है जिसने भाग 1 का अधिकांश समय लिया था।

साहित्य में यह कोई नया विचार नहीं है। यह स्किनिंग डीकंपोज़िशन का ट्रांसफ़ॉर्म वाला आधा हिस्सा है, 2012 में Le और Deng का SSDR, और मोशन-कैप्चर सॉल्वर भी इसी तरह मनचाहे रिग को घने मार्करों पर फ़िट करते हैं। हमारी स्थिति आसान है: रिगर पहले ही कंकाल और वेट दे चुका है, इसलिए केवल प्रति-फ़्रेम बोन ट्रांसफ़ॉर्म अज्ञात हैं।

विधि और उसे ईमानदार बनाए रखने वाला कंट्रोल ​

हर फ़्रेम पर हम प्रत्येक हड्डी के लिए ऐसा ट्रांसफ़ॉर्म खोजते हैं जो रिग की स्किन की गई सतह और लक्ष्य सतह के बीच की दूरी को न्यूनतम करे। वेट तय होने पर हर हड्डी के सर्वोत्तम ट्रांसफ़ॉर्म का क्लोज़्ड-फ़ॉर्म उत्तर होता है—Horn की क्वाटरनियन विधि से किया गया वेटेड रिजिड फ़िट। लीनियर ब्लेंड स्किनिंग साझा वर्टेक्स के माध्यम से हड्डियों को आपस में जोड़ती है, इसलिए हम एक-एक करके हड्डियों पर स्वीप करते हैं। हर सॉल्व इस बात को ध्यान में रखता है कि उस समय बाकी सभी हड्डियाँ क्या योगदान दे रही हैं, और यह तब तक चलता है जब तक रेज़िडुअल बदलना बंद न कर दे। हर फ़्रेम को पिछले फ़्रेम से वॉर्म-स्टार्ट किया जाता है।

सब कुछ बाइंड स्पेस में चलता है, जहाँ स्किनिंग आइडेंटिटी ठीक बनी रहती है, चाहे फ़ाइल किसी भी कन्वेंशन के साथ एक्सपोर्ट की गई हो। कलाकार के मेश और रिगर के दोबारा वेल्ड या सबडिवाइड किए गए मेश के बीच करेस्पॉन्डेंस, अलाइन किए गए रेस्ट पोज़ पर नियरेस्ट-नेबर से तय होता है। यहाँ यह सटीक है, क्योंकि दोनों एक ही जानवर हैं।

सबसे महत्वपूर्ण डिज़ाइन नियम था: एक ऐसा कंट्रोल रन जिसका परिणाम शून्य होना अनिवार्य हो। हम कलाकार के रिग को उसकी अपनी क्लिप के विरुद्ध सॉल्व करते हैं, जहाँ परिभाषा के अनुसार एक पूर्ण उत्तर मौजूद है। यदि सॉल्वर उसे नहीं खोज सकता, तो उसके किसी भी अन्य परिणाम का कोई अर्थ नहीं है। कंट्रोल मॉडल के डायगोनल के 0.008% पर पहुँचता है और सबसे खराब एकल वर्टेक्स 0.08% पर रहता है। बाकी हर चीज़ इसी न्यूनतम सीमा के सापेक्ष मापी जाती है।

भरोसेमंद शून्य तक पहुँचने में तीन प्रयास लगे ​

पहला कंट्रोल रन 3% पर अटक गया और तीस गुना अधिक इटरेशन के बाद भी आगे नहीं बढ़ा। इसके कारण दर्ज करना उपयोगी है, क्योंकि हर कारण बाहर से अदृश्य था।

सबसे बड़ा कारण एक API जाल था। three.js के नए संस्करणों ने boneTransform का नाम बदलकर applyBoneTransform कर दिया और बिना स्पष्ट सूचना के उसका व्यवहार भी बदल दिया: नया फ़ंक्शन इनपुट पोज़िशन आपके दिए हुए वेक्टर से लेता है; वह जियोमेट्री को कभी नहीं पढ़ता। दोबारा इस्तेमाल किए गए स्क्रैच वेक्टर को देने पर वह हर वर्टेक्स की गणना पिछले वर्टेक्स के आउटपुट से करता है। नतीजे में मिले लक्ष्य सहज और विश्वसनीय दिखने वाला कचरा थे, और एक शर्मनाक घंटे तक उन्होंने आर्मेचर स्केल के बारे में ऐसी विस्तृत थ्योरी का समर्थन किया जो आँकड़ों पर खूबसूरती से फ़िट बैठती थी और पूरी तरह काल्पनिक थी। सही एंट्री पॉइंट getVertexPosition है। कंट्रोल ने इसे पकड़ा—और कंट्रोल रखने का पूरा तर्क यही है।

बाकी दो कारण छोटे थे। Horn के मैट्रिक्स पर पावर इटरेशन लगभग डिग्री के हज़ारवें हिस्से पर अटक जाता है, क्योंकि उसे कन्वर्ज करने वाला स्पेक्ट्रल शिफ़्ट उसी गैप को भी दबा देता है जिसके सहारे वह कन्वर्ज करता है। इसलिए हमने Jacobi रोटेशन अपनाए, जो 4x4 के लिए सटीक हैं। इसके अलावा, सापेक्ष प्रगति पर आधारित शुरुआती-निकास परीक्षण स्वीप को तब रोक देता था जब वे अभी भी धीरे-धीरे नीचे जा रहे होते थे, इसलिए अब निकास मॉडल के स्केल के सापेक्ष निरपेक्ष प्रगति मापता है।

हर रिगर वास्तव में कितना एनिमेशन संभाल सकता है ​

सॉल्वर को सत्यापित करने के बाद हमने दो कलाकार क्लिप—Walk और Gallop—को उन छह जानवरों के लिए हर रिग में सॉल्व किया जिन्हें सभी रिगर सपोर्ट करते हैं। स्कोर बताता है कि रिग मोशन के सतही विस्थापन का कितना हिस्सा दोहरा पाता है। अब हमारे मन में इसका एक नाम है: ट्रांसफ़र क्वालिटी।

Walk और Gallop के लिए रिगर के अनुसार ट्रांसफ़र क्वालिटी का डॉट प्लॉट; कलाकार कंट्रोल लगभग 100 प्रतिशत और RigNet लगभग 50 प्रतिशत
क्वालिटी = 1 − सॉल्व किया गया रेज़िडुअल / मोशन का परिमाण, छह जानवरों का औसत। कंट्रोल पंक्ति में कलाकार के रिग को उसकी अपनी क्लिप के विरुद्ध सॉल्व किया गया है।
रिगचालसरपट दौड़
कलाकार (कंट्रोल)99.8%99.9%
Anything World94.4%91.9%
Tripo92.3%89.1%
SkinTokens, कलाकार का कंकाल दिए जाने पर82.5%89.4%
SkinTokens80.9%88.0%
RigNet48.5%58.3%

अब इसकी तुलना भाग 1 से करें, क्योंकि रैंकिंग उलट जाती है।

चारों में RigNet के पैरों का मोड़ सबसे अच्छा था और वही एकमात्र रिगर था जिसके कंकाल सभी बारह जानवरों पर हमारे ड्राइवेबिलिटी गेट में पास हुए। यहाँ वह चाल का आधा हिस्सा खो देता है। उसके सबसे खराब वर्टेक्स उस स्थान से मॉडल के 20 से 31% जितनी दूरी पर रहते हैं जहाँ सतह को होना चाहिए, और यह विफलता सभी छह जानवरों में एकसमान है—हर जानवर पर क्वालिटी 38 से 59%। इस बीच, हमारे मापे गए सबसे सीधे पैरों वाले दो रिग, Tripo और Anything World, एनिमेशन को सबसे अच्छी तरह संभालते हैं।

इसे स्पष्ट रूप से कहने पर विरोधाभास आसानी से सुलझ जाता है। सॉल्व की गई क्लिप जॉइंट को केवल घुमा ही नहीं, स्थानांतरित भी कर सकती है, और प्रति-जॉइंट ट्रांसलेशन ट्रैक सामान्य, वैध एनिमेशन डेटा हैं। ट्रांसलेशन उपलब्ध होने पर एक सीधी चेन भी मुड़ती हुई सतह को ट्रैक कर सकती है, इसलिए मोड़ निर्णायक बाधा नहीं रहता। इसके बजाय निर्णायक बात यह है कि स्किनिंग वेट मेश को कितनी सफ़ाई से हड्डियों का अनुसरण करने वाले हिस्सों में बाँटते हैं। व्यावसायिक रिगर के वेट अच्छे हैं। RigNet के वेट उसकी अनियमित चेन पर फैले हुए हैं, इसलिए सॉल्वर हड्डियों को कहीं भी ले जाए, वे सतह को ट्रैक नहीं कर सकते।

इसलिए दोनों माप दो अलग-अलग सवालों के जवाब देते हैं। फ़ोल्ड रेशियो यह निर्धारित करता है कि रोटेशन से चलने वाला रनटाइम रिग कौन-से पोज़ बना सकता है—यह भाग 1 की दुनिया है। ट्रांसफ़र क्वालिटी यह निर्धारित करती है कि बेक की गई, सॉल्व की गई क्लिप कितना व्यक्त कर सकती है—यह इस लेख की दुनिया है। सॉल्व्ड-क्लिप पाइपलाइन में जिस रिगर को हम पहले से उपयोगकर्ताओं तक पहुँचा रहे हैं, वह अंतिम स्थान वाला नहीं बल्कि 92% क्वालिटी वाला रिग है।

उस तालिका में एक और परिणाम छिपा है: SkinTokens को कलाकार का अपना कंकाल देने पर भी उसका स्कोर मुश्किल से बदलता है। उसकी सीमा उसके वेट तय करते हैं, जॉइंट की जगह नहीं।

केवल भरोसा करने के बजाय इसे देखना ​

पहले आँकड़े, फिर आँखें। यही सॉल्वर एक लाइव व्यूअर चलाता है, जहाँ हर रिग का पूरा मेश उसके सॉल्व किए गए ट्रांसफ़ॉर्म से स्किन किया जाता है, कलाकार की ग्राउंड-ट्रुथ सतह के ऊपर गहरे सिल्हूट के रूप में बनाया जाता है और हर वर्टेक्स को उसकी तात्कालिक त्रुटि के अनुसार रंग दिया जाता है। नीले का अर्थ शून्य है। लाल का अर्थ मॉडल के डायगोनल का 3% या उससे खराब है।

चाल, हर रिग में सॉल्व की गई। बाएँ से दाएँ: कलाकार की ग्राउंड ट्रुथ, Tripo, Anything World, SkinTokens, RigNet। RigNet के पैर लाल हो जाते हैं और हर कदम पर सिल्हूट से अलग होकर खिसकते हैं। 48% ऐसा दिखता है।
सरपट दौड़ हर रिग पर अधिक दबाव डालती है। पूरी तरह फैलने पर पिछले पैरों को देखें: Tripo और Anything World टिके रहते हैं, RigNet बिखर जाता है।

चित्र और तालिका एक-दूसरे से भटक नहीं सकते, क्योंकि व्यूअर ठीक उसी फ़ंक्शन से रेंडर करता है जिसे मेट्रिक ने मापा है। एक पैनल के लिए स्पष्टीकरण आवश्यक है: SkinTokens वाले हिरण में हीटमैप नहीं दिखता। उसके मेश में 181,000 वर्टेक्स हैं और 60,000 से ऊपर हम पूर्ण-मेश करेस्पॉन्डेंस को छोड़ देते हैं, इसलिए वह पैनल केवल सिल्हूट के आधार पर अपनी बात रखता है।

इससे हमारे लिए क्या बदलता है ​

ब्राउज़र JavaScript में, बिना GPU के, एक सॉल्व में प्रति क्लिप प्रति रिग आधे सेकंड से कुछ सेकंड लगते हैं। यह इतना सस्ता है कि रिग बनते ही किसी चौपाए की पूरी क्लिप शृंखला बेक की जा सकती है। बेक की गई क्लिप रनटाइम को भी सरल बनाती हैं: जानवरों के लिए कंकाल रीटार्गेटिंग बिल्कुल नहीं, केवल रिग के अपने स्पेस में क्लिप प्लेबैक, और ज़मीन से संपर्क बनाए रखने के लिए उसके ऊपर हमारी मौजूदा फ़ुट लॉकिंग।

यह हमें दूसरा स्वीकृति गेट भी देता है। भाग 1 की ज्यामितीय जाँच बताती है कि रिग को चलाया जा सकता है या नहीं। ट्रांसफ़र क्वालिटी बताती है कि वह किसी वास्तविक एनिमेशन का कितना हिस्सा बनाए रखेगा। कोई रिगर पहले गेट में पास और दूसरे में विफल हो सकता है, और RigNet ठीक यही करता है।

सीमाएँ, साफ़ शब्दों में ​

यह स्कोर हर रिग की अधिकतम क्षमता है, कोई वादा नहीं। सॉल्वर जॉइंट को स्थानांतरित कर सकता है, इसलिए मोशन के दौरान हड्डियों की लंबाई सुरक्षित नहीं रहती, और ट्रांसलेशन पर बहुत अधिक निर्भर रिग चरम पोज़ में रबड़ जैसा लग सकता है। सरपट दौड़ में सबसे खराब वर्टेक्स—अच्छे रिग पर भी कुछ क्षणों के लिए 9 से 20%—ठीक इन्हीं क्षणों में दिखाई देते हैं। सॉल्व का केवल-रोटेशन संस्करण इसकी ईमानदार कीमत बताएगा, और यह वह आँकड़ा है जिसे निकालना अभी बाकी है: इससे पता चलेगा कि ट्रांसलेशन अनुपलब्ध होने पर भाग 1 के सीधे-पैर वाले दंड का कितना हिस्सा बना रहता है।

प्रोडक्शन की असली कमी करेस्पॉन्डेंस है। इस बेंचमार्क में रिगर ने उसी मेश को रिग किया जिसे कलाकार ने एनिमेट किया था, इसलिए वर्टेक्स मिलान मामूली है। उपयोगकर्ता द्वारा अपलोड किया गया जानवर एक अलग मेश होगा, और पहले उस पर कलाकार की सतही गति लाना अपने आप में एक अलग समस्या है। इसके ज्ञात रास्ते मौजूद हैं, लेकिन हमने उन्हें अभी मापा नहीं है।

और नमूना: छह जानवर, दो क्लिप, प्रति क्लिप 24 फ़्रेम, और सबसे घने मेश पर पाँच हज़ार वर्टेक्स तक सबसैंपल किए गए कंस्ट्रेंट। रिगर को भरोसे के साथ रैंक करने के लिए पर्याप्त, लेकिन दशमलव के बाद दूसरा अंक बताने के लिए नहीं।

ये जानवर Quaternius के CC0 मॉडल हैं, विधि चालीस वर्ष पुरानी क्लोज़्ड-फ़ॉर्म फ़िटिंग और धैर्य का मेल है, और इसे दोहराने वाले किसी भी व्यक्ति से हम सबसे पहले कंट्रोल रन बनाने का आग्रह करेंगे। यदि आपने पहले एनिमेशन को रिग में सॉल्व किया है और उन्हीं जालों में फँसे हैं जिनमें हम फँसे थे—या किसी और में—तो हम अपने Discord पर अनुभवों की तुलना करना चाहेंगे।