सारांश
दोहराई जाने वाली ज्यामिति वाले किसी भी दृश्य में, कम मेमोरी फ़ुटप्रिंट और बढ़े हुए दृश्य ग्राफ़ कुक प्रदर्शन के लाभ के लिए इंस्टेंसिंग का उपयोग किया जा सकता है। आमतौर पर, इंस्टेंसिंग तब अच्छी तरह से काम करती है जब कई प्रतियों में ज्यामिति समान होती है और केवल परिवर्तनों की आवश्यकता होती है। यह आलेख "इंस्टेंस एरे" स्थानों का उपयोग करके इंस्टेंसिंग की एक विधि का वर्णन करता है, एक बिंदु क्लाउड के बिंदुओं पर ज्यामिति को इंस्टेंस करने के लिए इसका उपयोग कैसे करें इसका एक उदाहरण देता है।
अन्य उपलब्ध इंस्टेंसिंग दृष्टिकोणों के अवलोकन के लिए, कृपया Katana डेवलपर गाइड में निम्नलिखित अनुभाग पढ़ें: इंस्टेंसिंग ।
पॉइंट क्लाउड इंस्टेंसिंग पर नीचे दिए गए अनुभागों को दर्शाने वाले एक उदाहरण प्रोजेक्ट के लिए आप निम्नलिखित Katana प्रोजेक्ट फ़ाइल " instanceArray_arnold_material.katana " का संदर्भ ले सकते हैं।
उदाहरण सारणियाँ
निम्नलिखित अनुभाग ऐरे इंस्टेंसिंग का एक संक्षिप्त अवलोकन है। इंस्टेंसिंग पर अधिक गहन चर्चा के लिए, रेंडरमैन डॉक्यूमेंटेशन: रेंडरमैन 25 डॉक्स - Katana में इंस्टेंसिंग दर्शाता है कि इंस्टेंसिंग के परिचय के रूप में सभी तीन इंस्टेंसिंग विधियों को कैसे सेट किया जाए।
इंस्टेंस सरणियों में, इंस्टेंस स्थानों को "इंस्टेंस एरे" प्रकार के एकल स्थान पर विशेषताओं के माध्यम से एक या अधिक इंस्टेंस स्रोतों पर मैप किया जाता है। इंस्टेंस एरेज़, कई इंस्टेंस स्रोतों को स्थापित करने के आसान तरीके के अतिरिक्त लाभ के साथ, पदानुक्रमित इंस्टेंसिंग के समान हैं। एक दोष यह है कि सामग्रियों को प्रति उदाहरण भिन्न नहीं किया जा सकता है।
इंस्टेंस सरणी स्थान में ज्यामिति.इंस्टेंससोर्स और कम से कम एक परिवर्तन विशेषता शामिल होनी चाहिए। यदि इंस्टेंससोर्स में केवल एक ही पथ है, तो ज्योमेट्री.इंस्टेंसइंडेक्स वैकल्पिक है, ऐसी स्थिति में उस इंस्टेंस स्रोत का उपयोग इंस्टेंस सरणी में सभी इंस्टेंसेस के लिए किया जाता है।
ज्योमेट्री.इंस्टेंससोर्स | स्ट्रिंग या स्ट्रिंग सरणी विशेषता जिसमें एक या अधिक उदाहरण स्रोतों के दृश्य ग्राफ़ स्थान पथ शामिल हैं |
ज्योमेट्री.इंस्टेंस इंडेक्स | आवश्यक उदाहरणों के समान तत्वों की संख्या के साथ सरणी विशेषता। इस सरणी में संग्रहीत मान ज्यामिति.इंस्टेंससोर्स सरणी में वांछित इंस्टेंस स्रोत के सूचकांक को दर्शाते हैं। दूसरे शब्दों में, इंस्टेंसइंडेक्स इंस्टेंस इंडेक्स से इंस्टेंस सोर्स इंडेक्स तक मैपिंग का गठन करता है। |
ज्योमेट्री.इंस्टेंसमैट्रिक्स ज्योमेट्री.इंस्टेंसट्रांसलेट ज्योमेट्री.इंस्टेंसरोटेटएक्स ज्योमेट्री.इंस्टेंसरोटेटवाई | इनमें से प्रत्येक विशेषता प्रति-आवृत्ति परिवर्तनों की एक सपाट सरणी है। प्रत्येक विशेषता का अर्थ पारंपरिक परिवर्तन विशेषताओं के समान है, और एनीमेशन का समर्थन करने के लिए इन्हें बहु-नमूना किया जा सकता है। नोट: रेंडरमैन केवल ज्योमेट्री.इंस्टेंसमैट्रिक्स विशेषता के उपयोग का समर्थन करता है। |
इंस्टेंसिंग विशेषता सम्मेलनों के बारे में अधिक जानकारी के लिए, कृपया Katana डेवलपर गाइड: इंस्टेंसिंग पर जाएँ।
एक बिंदु बादल के लिए सरणी इंस्टेंसिंग
इंस्टेंस ऐरे में इंस्टेंस को रखने के लिए केवल एक स्थान का उपयोग करने का लाभ होता है, जो हजारों इंस्टेंस स्थानों वाले दृश्यों में भी दृश्य ग्राफ़ को छोटा रखता है। इंस्टेंस ऐरे, इंस्टेंस ऐरे उत्पन्न करने के लिए इंस्टेंस स्रोतों के स्थानों वाले ज्योमेट्री.इंस्टेंससोर्स विशेषता को पढ़ते हैं। एकाधिक इंस्टेंस स्रोतों को ज्यामिति.indexArray विशेषता का उपयोग करके संदर्भित किया जा सकता है, जिसमें इंस्टेंस स्रोतों के अनुक्रमणिका की एक सरणी होती है, प्रत्येक इंस्टेंस के लिए एक। एक बिंदु क्लाउड में बिंदुओं के लिए ज्यामिति को इंस्टेंस करने के लिए एक इंस्टेंस सरणी उत्पन्न करने के लिए निम्नलिखित चरण हैं।
1. एक पॉइंट क्लाउड ऑब्जेक्ट बनाएं या आयात करें और एक एट्रीब्यूटसेट नोड का उपयोग करके उसके स्थान के प्रकार विशेषता को पॉइंटक्लाउड पर सेट करें। पॉइंट क्लाउड कोई भी ज्योमेट्री हो सकता है जिसमें ज्योमेट्री.पॉइंट.पी विशेषता हो, जैसे कि प्रिमिटिवक्रिएट नोड से।
फिर आप देखेंगे कि दृश्य ग्राफ़ में बिंदु बादल का स्थान प्रकार बदल गया है:
2. फिर वह ज्यामिति बनाएं या आयात करें जिसे आप उदाहरण स्रोत के रूप में उपयोग करना चाहते हैं। फिर किसी अन्य एट्रिब्यूटसेट नोड का उपयोग करके इसके मूल स्थान की प्रकार विशेषता को इंस्टेंस स्रोत पर सेट करें।
उदाहरण के लिए, यदि ज्यामिति /root/world/geo/src/teapot पर है तो /root/world/geo/src इंस्टेंस स्रोत स्थान होना चाहिए। एकाधिक इंस्टेंस स्रोतों का उपयोग करने के लिए आप बाद में इस स्थान के अंतर्गत और ऑब्जेक्ट जोड़ सकते हैं।
फिर आपको दृश्य ग्राफ़ में आपके इंस्टेंस स्रोत का स्थान प्रकार बदला हुआ दिखाई देगा:
3. कुछ इस तरह पाने के लिए दोनों नेटवर्क को एक साथ मिलाएं:
4. मर्ज के डाउनस्ट्रीम, एक ऑपस्क्रिप्ट नोड बनाएं और इसके अप्लाईव्हेयर पैरामीटर को विशिष्ट स्थान पर बदलें। अब आपको OpScript नोड के पैरामीटर के शीर्ष पर एक नया lo cation पैरामीटर दिखाई देगा। स्थान पैरामीटर का मान यह निर्धारित करेगा कि दृश्य ग्राफ़ में इंस्टेंस सरणी कहाँ उत्पन्न होती है। इस उदाहरण के लिए हम /root/world/geo/instances का उपयोग कर रहे हैं
5. OpScript नोड में, एक user.pointCloudLocation स्ट्रिंग पैरामीटर बनाएं और इसे पॉइंट क्लाउड के दृश्य ग्राफ़ स्थान पथ पर सेट करें। फिर एक विजेट प्रकार के दृश्य ग्राफ़ स्थानों के साथ एक user.instanceSourceLocations स्ट्रिंग सरणी पैरामीटर बनाएं, और सरणी में मान के रूप में अपना इंस्टेंस स्रोत दृश्य ग्राफ़ स्थान पथ जोड़ें।
उपयोगकर्ता पैरामीटर बनाने और उनके विजेट प्रकार को बदलने के चरणों के लिए, कृपया Katana उपयोगकर्ता गाइड: उपयोगकर्ता पैरामीटर जोड़ना देखें ।
6. निम्नलिखित ओपस्क्रिप्ट लुआ कोड, रेंडरमैन डॉक्स में पाए गए पिक्सर उदाहरण से छोटा किया गया है: इंस्टेंसिंग , एक बिंदु क्लाउड और इंस्टेंस स्रोत स्थानों के आधार पर एक इंस्टेंस सरणी बनाता है।
पॉइंट क्लाउड के प्रत्येक बिंदु पर रखे गए इंस्टेंस के साथ इंस्टेंस सरणी उत्पन्न करने के लिए इस कोड को ओपस्क्रिप्ट नोड के स्क्रिप्ट पैरामीटर में कॉपी करें।
-- Read the op arguments
local instanceSourceLocations = Interface.GetOpArg( "user.instanceSourceLocations" )
local pointCloudLocation = Interface.GetOpArg( "user.pointCloudLocation" ):getValue()
-- Read the point cloud's points
local pointAttr = Interface.GetAttr( "geometry.point.P" , pointCloudLocation)
local points = pointAttr :getNearestSample(Interface.GetCurrentTime())
-- Create a single location which will generate an array of instances
-- Set type for this location to 'instance array'
Interface.SetAttr( 'type' , StringAttribute( 'instance array' ))
-- This instance array location must point to the instance source locations
-- through the attribute 'geometry.instanceSource'
Interface.SetAttr( 'geometry.instanceSource' , instanceSourceLocations)
-- The indexArray attribute determines which instance source each instance location represents
local indexArray = {}
-- for each instance create an instance index
for i= 0 ,#points/ 3-1 do
-- For this example, the instances are arbitrarily assigned to an
-- instance source
-- a more stable apporach would be to use an arbitrary attribute
-- on the point cloud to assign an instance source
indexArray[#indexArray +1 ] = i%instanceSourceLocations:getNumberOfTuples()
end
-- Set index for instance array element
Interface.SetAttr( 'geometry.instanceIndex' , IntAttribute(indexArray, 1 ))
-- geometry.instanceMatrix
-- Get the transforms from the points
local numTimeSamples = pointAttr:getNumberOfTimeSamples()
local matrixArrayMap = {}
-- to get motion blur on the instances, create an instanceMatrix at each
-- time sample available from the point cloud points attribute
for idx=0,numTimeSamples -1 do
local sampleTime = pointAttr:getSampleTime(idx)
local points = pointAttr:getNearestSample(sampleTime)
-- each instance in array has its own matrix
local matrixArray = {}
local workMatrix = Imath.M44d():toTable()
-- for each instance build a matrix with a mocked up transformation
for i=0,#points/ 3-1 do
-- grab the points that represent this instance
x = points[ 3 *i +1 ]
y = points[ 3 *i +2 ]
z = points[ 3 *i +3 ]
-- set the translate of the matrix to the points in the point cloud
workMatrix[ 13 ] = x
workMatrix[ 14 ] = y
workMatrix[ 15 ] = z
for j = 1 , 16 do
matrixArray[#matrixArray +1 ]=workMatrix[j]
end
end
matrixArrayMap[sampleTime] = matrixArray
end
Interface.SetAttr('geometry.instanceMatrix', DoubleAttribute (matrixArrayMap, #matrixArrayMap))
उपरोक्त ओपस्क्रिप्ट इंस्टेंस एरे ज्योमेट्री.इंस्टेंससोर्स विशेषता को यूजर.इंस्टेंससोर्सलोकेशन्स उपयोगकर्ता पैरामीटर पर सेट इंस्टेंस सोर्स स्थानों पर सेट करता है। इसके अतिरिक्त, इंस्टेंस ऐरे ज्योमेट्री.इंस्टेंसइंडेक्स विशेषता इंस्टेंस स्रोतों के बीच वैकल्पिक करने के लिए सेट है। अंत में, इंस्टेंस एरे ज्योमेट्री.इंस्टेंसमैट्रिक्स विशेषता पॉइंट क्लाउड में प्रत्येक बिंदु से अनुवाद जानकारी से भर जाती है।
7. अब उदाहरण बन गए हैं, पॉइंट क्लाउड की अब आवश्यकता नहीं है और हम इसे दृश्य से हटाने के लिए प्रून नोड का उपयोग कर सकते हैं।
अब आप अपना इंस्टेंस ऐरे देखने के लिए रेंडर कर सकते हैं:
आप पूरा दृश्य यहां डाउनलोड कर सकते हैं: इंस्टेंसएरे.कटाना
प्रति उदाहरण निर्दिष्ट सामग्री को अलग-अलग करने के लिए इंस्टेंस ऐरे वर्कअराउंड
अन्य इंस्टेंसिंग तकनीकों के विपरीत, इंस्टेंस सरणियों में सामग्री को प्रति इंस्टेंस सीधे अलग करने की व्यवस्था नहीं होती है। हालाँकि, अलग-अलग सामग्रियों के साथ इंस्टेंस स्रोत स्थानों का उपयोग करके उदाहरणों के लिए विभिन्न सामग्रियों का उपयोग किया जा सकता है। इंस्टेंस सरणियों का उपयोग करने का एक लाभ यह है कि सभी इंस्टेंस एक दृश्य ग्राफ़ स्थान में समाहित होते हैं। हालाँकि, इसका मतलब यह भी है कि किसी विशिष्ट उदाहरण का पता लगाना लगभग असंभव है, क्योंकि व्यक्तिगत उदाहरण व्यूअर या दृश्य ग्राफ़ में दिखाई नहीं देते हैं और केवल दृश्य के रेंडर में दिखाई देते हैं।
कृपया इंस्टेंस ऐरे उत्पन्न करने के लिए ऊपर इंस्टेंस ऐरे टू पॉइंटक्लाउड अनुभाग देखें। एक बार इंस्टेंस सरणी बन जाने के बाद, प्रत्येक इंस्टेंस स्रोत के लिए सामग्रियों को अलग-अलग करके प्रत्येक बैच के अनुसार सामग्री को अलग-अलग किया जा सकता है। किसी इंस्टेंस स्रोत के लिए सामग्री को बदलने के लिए मटेरियलअसाइन नोड का उपयोग करें, और मटेरियल असाइन प्रत्येक इंस्टेंस स्थान पर ले जाता है जो उस विशिष्ट इंस्टेंस स्रोत का उपयोग करता है। बस मटेरियलअसाइन नोड्स बनाएं और उदाहरण स्रोतों के रूप में चयनित दृश्य ग्राफ़ स्थानों पर सामग्री असाइन करें।
अग्रिम पठन
इंस्टेंसिंग अवलोकन के लिए, नीचे पहला संसाधन लिंक देखें। नीचे दिए गए अन्य संसाधन प्रत्येक इंस्टेंसिंग विधि पर अन्य उन्नत इंस्टेंसिंग विषयों पर गहराई से जानकारी देते हैं।
- Katana डेवलपर गाइड: इंस्टेंसिंग
- Q100508: पदानुक्रमित (उदाहरण स्रोत) इंस्टेंसिंग के साथ दृश्य ग्राफ कुक प्रदर्शन बढ़ाना
- Q100517: लीफ-लेवल (इंस्टेंस आईडी) इंस्टेंसिंग के साथ दृश्य ग्राफ़ कुक प्रदर्शन बढ़ाना
- रेंडरमैन दस्तावेज़ीकरण: रेंडरमैन 25 डॉक्स - Katana में इंस्टेंसिंग
संलग्नक
हम चाहते हैं कि खेद व्यक्त करते हैं
कृपया हमें बताएँ कि