सारांश
दोहराई जाने वाली ज्यामिति वाले किसी भी दृश्य में, इंस्टेंसिंग का उपयोग कम मेमोरी फ़ुटप्रिंट और बेहतर दृश्य ग्राफ़ कुक प्रदर्शन के लाभ के लिए किया जा सकता है। आमतौर पर, इंस्टेंसिंग तब अच्छी तरह काम करती है जब ज्यामिति कई प्रतियों में समान हो और केवल रूपांतरणों की आवश्यकता हो। यह लेख इंस्टेंसिंग की एक विधि का वर्णन करता है जिसे "पदानुक्रमित इंस्टेंसिंग" कहा जाता है, और एक बिंदु क्लाउड के बिंदुओं पर ज्यामिति इंस्टेंस करने के लिए इसका उपयोग करने का एक उदाहरण देता है।
अन्य उपलब्ध इंस्टेंसिंग दृष्टिकोणों पर अवलोकन के लिए, कृपया Katana डेवलपर गाइड में निम्नलिखित अनुभाग पढ़ें: इंस्टेंसिंग ।
कृपया पॉइंट क्लाउड इंस्टेंसिंग पर नीचे दिए गए अनुभागों को दर्शाने वाले उदाहरण प्रोजेक्ट के लिए Katana प्रोजेक्ट फ़ाइल PointcloudInstancingAndMaterialAssign_Arnold.katana देखें।
अधिक जानकारी
पदानुक्रमित इंस्टेंसिंग अवलोकन
निम्नलिखित अनुभाग पदानुक्रमित इंस्टेंसिंग का एक संक्षिप्त अवलोकन है। इंस्टेंसिंग पर अधिक गहन चर्चा के लिए, रेंडरमैन दस्तावेज़ देखें: रेंडरमैन 26 दस्तावेज़ - Katana में इंस्टेंसिंग, इंस्टेंसिंग के परिचय के रूप में तीनों इंस्टेंसिंग विधियों को सेट अप करने का तरीका दर्शाता है।
पदानुक्रमित इंस्टेंसिंग में, दृश्य ग्राफ़ स्थानों के संपूर्ण पदानुक्रम को इंस्टेंस किया जा सकता है। इंस्टेंस स्थान वे दृश्य ग्राफ़ स्थान होते हैं जिनमें इंस्टेंस समाहित होगा, और इंस्टेंस को दृश्य ग्राफ़ में स्रोत स्थान के अंतर्गत ज्यामिति द्वारा परिभाषित किया जाता है। किसी इंस्टेंस स्रोत को दृश्य ग्राफ़ स्थान के प्रकार विशेषता को "इंस्टेंस स्रोत" पर सेट करके घोषित किया जाता है। इंस्टेंस स्थानों को स्वयं उनके प्रकार विशेषता को "इंस्टेंस" पर सेट करके घोषित किया जाता है।
इंस्टेंस स्रोत को "इंस्टेंस स्रोत" के लिए पदानुक्रम के शीर्ष स्तर के स्थान का प्रतिनिधित्व करने वाले समूह स्थान की प्रकार विशेषता को सेट करके घोषित किया जाता है।
इंस्टेंस स्थान "इंस्टेंस" प्रकार के होने चाहिए। इन स्थानों पर एक geometry.instanceSource स्ट्रिंग विशेषता सेट की जानी चाहिए, जो इंस्टेंस स्रोत दृश्य ग्राफ़ स्थान की ओर इंगित करती हो।
एक बिंदु बादल के लिए पदानुक्रमित इंस्टेंसिंग
पॉइंट क्लाउड पर इंस्टेंसिंग, पिछले अनुभाग में बताए गए एकल इंस्टेंस लोकेशन पर इंस्टेंसिंग के समान है। अंतर यह है कि "इंस्टेंस" प्रकार के कई लोकेशन का उपयोग करने के बजाय, इंस्टेंस लोकेशन, "पॉइंटक्लाउड" प्रकार का केवल एक लोकेशन होता है, जिसमें geometry.instanceSource स्ट्रिंग विशेषता इंस्टेंस सोर्स की ओर इंगित करती है। निम्नलिखित चरण इस सेटअप की व्याख्या करते हैं:
1. Alembic_In का उपयोग करके इंस्टेंस स्रोत को आयात करें, फिर दृश्य ग्राफ में ज्यामिति के मूल स्थान के प्रकार को instance source के रूप में सेट करें।
2. Alembic_In का उपयोग करके एक एलेम्बिक पॉइंट क्लाउड आयात करें, फिर इंस्टेंस स्रोत को इंगित करने के लिए geometry.instanceSource विशेषता सेट करें।
कृपया ध्यान दें कि इस विधि का उपयोग करने से दृश्य में अलग-अलग इंस्टेंस पर कम सूक्ष्म नियंत्रण प्राप्त होता है। उदाहरण के लिए, अलग-अलग इंस्टेंस को अलग-अलग सामग्री निर्दिष्ट करना आसान नहीं है क्योंकि पॉइंट क्लाउड में प्रत्येक बिंदु के लिए सीन ग्राफ़ स्थान उत्पन्न नहीं होते हैं। हालाँकि, इस विधि का उपयोग करके, एक ही सामग्री के शेडर गुणों को मनमाने गुणों वाले अलग-अलग इंस्टेंस के लिए बदला जा सकता है। इसके अलावा, पॉइंट क्लाउड को स्केल करने से सभी इंस्टेंस भी स्केल हो जाते हैं, और अलग-अलग इंस्टेंस के रूपांतरण को आसानी से संशोधित नहीं किया जा सकता है। यदि सामग्री में बदलाव या रूपांतरणों पर अधिक नियंत्रण की आवश्यकता है, तो कृपया अधिक अनुकूलन योग्य OpScript दृष्टिकोण के लिए नीचे दिया गया अनुभाग पढ़ें।
OpScript Lua के साथ पॉइंट क्लाउड पर पदानुक्रमित इंस्टेंसिंग
पॉइंट क्लाउड के लिए पदानुक्रमित इंस्टेंसिंग, पॉइंट क्लाउड में प्रत्येक बिंदु के लिए स्थानों के संपूर्ण पदानुक्रम को इंस्टेंस करने की अनुमति देता है। पॉइंट क्लाउड में प्रत्येक बिंदु के लिए दृश्य ग्राफ़ में इंस्टेंस स्थान उत्पन्न करने के लिए OpScript का उपयोग करने से प्रत्येक इंस्टेंस को अलग-अलग सामग्री निर्दिष्ट करने और इंस्टेंस स्थानों के परिवर्तन पर अधिक नियंत्रण प्रदान करने के लाभ होते हैं। एक संभावित कमी थोड़ा अधिक जटिल दृश्य ग्राफ़ है, खासकर यदि हज़ारों इंस्टेंस हों। पॉइंट क्लाउड के लिए पदानुक्रमित इंस्टेंसिंग प्राप्त करने के लिए निम्नलिखित चरण हैं:
1. Alembic_In नोड्स का उपयोग करके एक पॉइंट क्लाउड और इंस्टेंस स्रोत आयात करें। फिर इंस्टेंस स्रोत की प्रकार विशेषता को "इंस्टेंस स्रोत" पर सेट करें।
2. एक OpScript नोड बनाएं और इसके स्थान पैरामीटर को एक दृश्य ग्राफ स्थान पर सेट करें जहां इंस्टेंस उत्पन्न किए जाने चाहिए, उदाहरण के लिए: “/root/world/geo/derivedassets”।
3. OpScript नोड में, user.instanceSourceLocation पैरामीटर बनाएँ, इसे इंस्टेंस स्रोत के दृश्य ग्राफ़ स्थान पर सेट करें और user.pointCloudLocation सेट करें पैरामीटर को पॉइंट क्लाउड के सीन ग्राफ़ लोकेशन पर जोड़ें। उपयोगकर्ता पैरामीटर बनाने के चरणों के लिए, Katana उपयोगकर्ता मार्गदर्शिका देखें: उपयोगकर्ता पैरामीटर जोड़ना ।
4. फिर प्रत्येक बिंदु के लिए इंस्टेंस स्थान उत्पन्न करने के लिए निम्नलिखित कोड को OpScript नोड के script पैरामीटर में कॉपी करें।
-- Read op arguments
local instanceSourceLocation = Interface.GetOpArg("user.instanceSourceLocation"):getValue()local pointCloudLocation = Interface.GetOpArg("user.pointCloudLocation"):getValue()
if Interface.AtRoot() then
-- Read the point cloud
local points = Interface.GetAttr("geometry.point.P", pointCloudLocation):getNearestSample(Interface.GetCurrentTime())
-- Loop over points
local x, y, z
local gb = GroupBuilder()
for i=0, #points/3 - 1 do
x = points[3*i+1]
y = points[3*i+2]
z = points[3*i+3]
-- Build op arguments for the child location
gb:update(Interface.GetOpArg())
gb:set("childAttrs", Interface.GetAttr("", instanceSourceLocation))
gb:set("childAttrs.type", StringAttribute("instance"))
gb:set("childAttrs.geometry.instanceSource", StringAttribute(instanceSourceLocation))
gb:set("childAttrs.xform.interactive.translate", DoubleAttribute({x, y, z}))
-- Create the child
Interface.CreateChild(
string.format("child%04d", i),
Interface.GetOpType(),
gb:build())
end
else
local childAttrs = Interface.GetOpArg("childAttrs")
for i=0, childAttrs:getNumberOfChildren()-1 do
Interface.SetAttr(childAttrs:getChildName(i), childAttrs:getChildByIndex(i))
end
end
उपरोक्त OpScript, बिंदु क्लाउड में प्रत्येक बिंदु के लिए 'instance' प्रकार का एक स्थान बनाता है और प्रत्येक इंस्टेंस स्थान की geometry.instanceSource विशेषता को user.instanceSourceLocation पैरामीटर में निर्दिष्ट इंस्टेंस स्रोत पर सेट करता है।
5. अंत में, दृश्य ग्राफ़ से पॉइंट क्लाउड स्थान को हटाने के लिए Prune या VisibilityAssign नोड का उपयोग करें ताकि वह रेंडर से छूट जाए। VisibilityAssign नोड, व्यूअर में पॉइंट्स को अभी भी दृश्यमान रहने देता है, जबकि Prune नोड, व्यूअर को इंस्टेंस के संकेत से खाली छोड़ देता है।
सामग्री असाइनमेंट के साथ सामग्री भिन्नता
प्रति इंस्टेंस सामग्री को संशोधित करने से कुछ अतिरिक्त काम हो सकता है क्योंकि सभी इंस्टेंस, इंस्टेंस स्रोत के गुणों, जैसे कि निर्दिष्ट सामग्री, को ग्रहण करते हैं। यह खंड इंस्टेंसिंग के प्रदर्शन लाभों को बनाए रखते हुए, प्रति इंस्टेंस सामग्री और शेडर को बदलने की एक विधि की व्याख्या करेगा।
बिंदु बादलों पर प्रत्येक बिंदु के लिए इंस्टेंस स्थान बनाने के लिए ओपस्क्रिप्ट के साथ लीफ-स्तर और पदानुक्रमित इंस्टेंसिंग का उपयोग करने से यह लाभ होता है कि सामग्रियों को प्रति इंस्टेंस स्थान के अनुसार निर्दिष्ट किया जा सकता है।
इंस्टेंस लोकेशन जनरेट करने के बाद, प्रत्येक इंस्टेंस के लोकेशन के अनुसार मटीरियल को बदला जा सकता है। विशिष्ट इंस्टेंस की पहचान करना सीन ग्राफ़ में इंस्टेंस लोकेशन को बड़ा करने और व्यूअर में वांछित इंस्टेंस चुनने जितना ही आसान है। दिए गए उदाहरण प्रोजेक्ट में, इंस्टेंस लोकेशन /root/world/geo/derivedassets location के नीचे पाए जा सकते हैं।
इसके बाद, सामग्री को MaterialAssign नोड का उपयोग करके या सामग्री स्थान की ओर इशारा करते हुए, इंस्टेंस स्थान पर materialAssign विशेषता सेट करके, वांछित स्थानों पर असाइन किया जा सकता है।
अग्रिम पठन
इंस्टेंसिंग के अवलोकन के लिए, नीचे दिए गए पहले संसाधन लिंक को देखें। नीचे दिए गए अन्य संसाधन प्रत्येक इंस्टेंसिंग विधि पर अन्य उन्नत इंस्टेंसिंग विषयों पर गहराई से चर्चा करते हैं।
- Katana डेवलपर गाइड: इंस्टेंसिंग
- Q100517: लीफ-स्तर (इंस्टेंस आईडी) इंस्टेंसिंग के साथ दृश्य ग्राफ़ कुक प्रदर्शन बढ़ाना
- Q100514: इंस्टेंस ऐरे इंस्टेंसिंग के साथ दृश्य ग्राफ़ कुक प्रदर्शन बढ़ाना
- रेंडरमैन दस्तावेज़ीकरण: रेंडरमैन 26 दस्तावेज़: Katana में इंस्टेंसिंग
संलग्नक
हम चाहते हैं कि खेद व्यक्त करते हैं
कृपया हमें बताएँ कि