स्वर संरचना का प्रतिनिधित्व करने के लिए किस डेटा संरचना का उपयोग किया जाना चाहिए?


18

स्वरों के बारे में विकिपीडिया पृष्ठ के अनुसार , "[...] एक स्वर की स्थिति अन्य स्वरों के सापेक्ष अपनी स्थिति के आधार पर अनुमानित की जाती है (अर्थात, डेटा संरचना में इसकी स्थिति जो एकल स्वैच्छिक छवि बनाती है)।"

ऐसे डेटा संरचना को कैसे लागू किया जाना चाहिए? मैं एक ऑक्ट्री के बारे में सोच रहा था लेकिन मैं सोच रहा था कि क्या कुछ और है जिसके बारे में मैंने कभी नहीं सुना।


1
यह पूछने के लिए एक कठिन सवाल है क्योंकि इसकी बहुत निर्भर करता है कि आपके वॉक्सेल डेटा को किस डेटा की आवश्यकता है। वोक्स कितना भरा हुआ है, क्या दिखता है, आदि चीजें आप जो कर रहे हैं उस पर काफी हद तक निर्भर रहने वाले हैं। दूसरी बात यह है कि डेटा संरचना को डेटा के वास्तविक समय में हेरफेर और इसके बाद के अद्यतन के लिए उच्च गति तक पहुंच के लिए उधार देना पड़ता है .. कैसे स्मृति संरचना को प्रति स्वर कम रखें और डेटा फास्ट एक्सेस / हेरफेर तेजी से महत्वपूर्ण तकनीकी चुनौतियां हैं। जब वोकेल इंजन के साथ काम करना काफी विशिष्ट होता है। जवाब नहीं, इसलिए टिप्पणी नहीं।
जेम्स

जवाबों:


14

प्रथम। आइए लिखते हैं कि हम प्रत्येक स्वर के बारे में क्या जानते हैं:

voxel = (x, y, z, color) // or some other information

सामान्य भंडारण

सामान्य तरीका यह है:

set of voxels = set of (x,y,z, color)

ध्यान दें, कि triplet (x, y, z) प्रत्येक स्वर की विशिष्ट रूप से पहचान करता है, क्योंकि voxel अंतरिक्ष में बिंदु है और एक स्थान पर दो बिंदुओं पर कब्जा करने का कोई तरीका नहीं है (मेरा मानना ​​है कि हम स्थैतिक स्वर डेटा के बारे में बात कर रहे हैं)।

यह सरल डेटा के लिए ठीक होना चाहिए। लेकिन यह किसी भी तरह से एक तेज डेटा संरचना नहीं है।

प्रतिपादन AFAIK स्कैनलाइन एल्गोरिथ्म द्वारा किया जाता है। स्वर पर टॉम के हार्डवेयर लेख में स्कैनलाइन एल्गोरिथ्म की छवि है

तेजी से देखने की

यदि तेज़ लुकअप की आवश्यकता है, तो लुकअप के लिए सबसे तेज़ डेटा संरचना हैश (उर्फ़ सरणी, मैप ...) है। इसलिए आपको हैश से बाहर करना होगा। इसलिए, भोलेपन से हम मनमाना तत्व प्राप्त करने का सबसे तेज़ तरीका चाहते हैं:

array [x][y][z] of (color)
  • यह x, y, z निर्देशांक द्वारा स्वर को देखने के लिए O (1) है।

  • समस्या यह है, कि यह अंतरिक्ष की आवश्यकताएं हैं O (D ^ 3), जहां D प्रत्येक x, y और z संख्याओं की श्रेणी है (वास्तविक संख्या को भूल जाएं, क्योंकि यदि वे Chars थे, जिसमें 256 मानों की सीमा होती है, तो 256 ^ होगा 3 = 2 ^ 24 == 16 777 216 सरणी में तत्व)।

लेकिन यह इस बात पर निर्भर करता है कि आप स्वरों के साथ क्या करना चाहते हैं। यदि आप जो चाहते हैं उसका प्रतिपादन है, तो संभवतः यह वही है जो आप चाहते हैं। लेकिन भंडारण की समस्या अभी भी बनी हुई है ...

अगर भंडारण समस्या है

एक विधि सरणी में RLE संपीड़न का उपयोग करना है। वैक्सल्स के एक स्लाइस की कल्पना करें (वोक्सल्स का सेट, जहां वॉक्सल्स का एक समन्वित स्थिर मूल्य होता है .... जैसे विमान जहां उदाहरण के लिए z = 13)। वॉक्सल्स का ऐसा टुकड़ा MSPaint में कुछ साधारण ड्राइंग की तरह लग रहा होगा । Voxel मॉडल, मैं कहता हूँ, आमतौर पर सभी संभावित स्थानों के अंश (D ^ 3 स्थान सभी संभावित स्वरों) पर कब्जा कर लेते हैं। मेरा मानना ​​है, कि "निर्देशांक के ट्रिपल से एक जोड़ी लेते हैं और शेष अक्ष को संपीड़ित करते हैं" चाल करेंगे (उदाहरण के लिए [x] [y] और प्रत्येक तत्व के लिए दिए गए x, y पर z अक्ष पर सभी स्वरों को संपीड़ित करें।) । कुछ तत्वों के लिए 0 होना चाहिए, RLE यहाँ ठीक करेगा):

array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color 

भंडारण की समस्या को हल करने की अन्य विधि वृक्ष डेटा संरचना का उपयोग करते हुए सरणी के बजाय होगी:

tree data structure  = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
  • ऑक्ट्री, जैसा कि निक द्वारा उल्लेख किया गया है। इसे स्वरों को संपीड़ित करना चाहिए। ऑक्ट्री में देखने के लिए एक अच्छी गति है, मुझे लगता है कि यह कुछ ओ (लॉग एन) है, जहां एन वोकल्स की संख्या है।
  • ऑक्ट्री को शालीनता से मनमाने ढंग से वॉक्सेल डेटा स्टोर करने में सक्षम होना चाहिए।

यदि voxels कुछ सरलीकृत ऊँचाई वाले हैं तो आप बस इसे स्टोर कर सकते हैं। या आप मापदंडों को स्टोर कर सकते हैं जो कार्यक्षेत्र को उत्पन्न करता है, उर्फ ​​प्रक्रियात्मक रूप से इसे उत्पन्न करता है ...

और निश्चित रूप से आप सभी संभावित दृष्टिकोणों को जोड़ सकते हैं। लेकिन इसे ज़्यादा मत करो, जब तक कि आप परीक्षण न करें कि आपका कोड काम करता है और मापता है कि यह वास्तव में तेज़ है (इसलिए यह अनुकूलन के लायक है)।

टी एल; डॉ

ऑक्ट्रेसेस के अलावा Rox कंप्रेशर्स विक्स, google "voxlap", "केन सिल्वरमैन" ...

साधन

फास्ट वोकल रेंडरर बनाने के लिए संसाधनों और चर्चा की सूची है , इसमें कागजात और स्रोत कोड शामिल हैं


1
"अगर स्टोरेज की समस्या है": आप VTC ( oss.sgi.com/projects/ogl-sample/registry/NV/… ) या DXT कम्प्रेशन
KindDragon

@KindDragon इस जानकारी के लिए धन्यवाद। :) यह बहुत अच्छा विचार है।
user712092

संसाधन लिंक नीचे है।
इजेक्वियल

4

दो अलग-अलग डेटा संरचना पहलू हैं जिनके बारे में वे बात कर सकते हैं।

सरणी संरचनाएँ

जब आप किसी भी संख्या के आयामों के एक सरणी के एक तत्व का संदर्भ देते हैं, तो विचार करें कि जब आप myArray[4][6][15]उस स्थान पर होते हैं, तो सूचक (जैसे! ) पास होने पर सरणी को स्वयं ही देख लें । यदि उस स्थान पर क्या है, तो एक voxel है, उस voxel को इसके x, y और z निर्देशांक के अतिरिक्त रिकॉर्ड करने की आवश्यकता नहीं है - voxel को रखने वाला सरणी निर्दिष्ट करता है कि यह विश्व स्थान है, जो इसके स्थान-अनुक्रमित स्थान पर आधारित है।

यह अच्छा है कि इस तरह की सरणी पहुंच के लिए उपयोग किए जाने वाले सूचक अंकगणितीय रूप से तेज और आम तौर पर बोल रहे हैं, जो भाषाओं में पाए जाने वाले अधिकांश त्वरित (अक्सर "मूल") सरणियों के लिए नींव प्रदान करता है। इन सरणियों के लिए नकारात्मक पक्ष यह है कि उनके पास बाइट्स में समान आकार के तत्व होने चाहिए, ताकि सूचक सूचक अंक के लिए लागू हो सके।

Octrees

(मैं इस दूसरे को नोट करता हूं, क्योंकि विकिपीडिया के संदर्भ में यह होने की संभावना कम है, और स्वर कार्यान्वयन को ऑक्ट्रेसेस के उपयोग की आवश्यकता नहीं है, हालांकि लगभग सभी आधुनिक ऑक्ट्रेसेस का उपयोग करते हैं।)

एक ओक्ट्री की जड़ नोड एक एकल, अविभाजित घन है। चलो एक उदाहरण स्थापित करते हैं। अपने ओक्ट्री की जड़, घन का केंद्र, {0, 0, 0}3 डी अंतरिक्ष में है। एक बार जब आप उस जगह के भीतर वस्तुओं को रखना शुरू करते हैं (पढ़ें: एक से अधिक ऑब्जेक्ट), तो यह आगे ऑक्ट्री को वश में करने का समय है। यह वह जगह है जहाँ आप 8 ( ओक्ट- ) में विभाजित करते हैं , इसे 3 विमानों का उपयोग करके टुकड़ा करते हुए, ये प्लेन xy, xz और yz प्लेन हैं। आपके मूल घन में अब ठीक 8 छोटे घन होते हैं। इनमें से प्रत्येक उप-नोड्स को केंद्रीय, मूल घन से ऑफसेट के रूप में तैनात किया गया है । अर्थात्, उदाहरण के लिए, धनात्मक xyz अष्टक में स्थित घन माता-पिता से एक ऑफसेट होगा / जिसमें घन का केंद्र बिल्कुल होगा{root.width / 4, root.height / 4, root.depth / 4}। प्रत्येक सबनोड के लिए एक पूर्ण स्थिति को निर्दिष्ट करने के बजाय, यह माता-पिता के नोड को अपने बच्चों की जगह के मूल के रूप में विचार करने के लिए अधिक तार्किक अर्थ देता है। यह उसी तरह से दृश्य रेखांकन का काम है।

यह एक 2 डी ड्राइंग में देखने के लिए काफी सरल है, जहां आप एक वर्ग बनाते हैं, और इसे 4 समान क्षेत्रों में उपविभाजित करते हैं। यदि, हमारी ऑक्ट्री रूट नोड की तरह, माता-पिता वर्ग के केंद्र को माना जाता है {0, 0}, तो बच्चे के 4 केंद्र होंगे

{root.width / 4, root.height / 4}, {-root.width / 4, root.height / 4}, {root.width / 4, -root.height / 4}, {-root.width / 4, -root.height / 4}

... अपने माता-पिता के सापेक्ष - 3 डी में समान सिद्धांत।


आपके उत्तर के लिए धन्यवाद। मेरे मामले में, इलाके के कुछ बड़े हिस्से एक ही प्रकार के स्वर से बने होंगे, यही वजह है कि मैं ऑक्ट्रेसेस के बारे में सोच रहा था (एक बड़ा हिस्सा उप-विभाजित नहीं करना होगा)। हालाँकि, मैं 3D सरणी को एक शॉट दूँगा क्योंकि यह लागू करने के लिए सरल लगता है। मुझे यकीन है कि मैं अपने इलाके वर्ग के कार्यान्वयन विवरण को पर्याप्त रूप से प्रबंधित कर सकता हूं ताकि कार्यान्वयन को स्विच करने के लिए इतना मुश्किल न हो।
pwny

आपका स्वागत है। मैं निश्चित रूप से अष्टक में देखने का सुझाव दूंगा, वास्तव में उन्हें समझ पाना मुश्किल नहीं है। लेकिन हां, आपका दृष्टिकोण अभी के लिए समझ में आता है, निश्चित रूप से यह 3 डी सरणी का उपयोग करके प्रारंभिक प्रोटोटाइप करने के लायक है।
इंजीनियर

आगे पढ़ने के रूप में, कई उपयोगी संदर्भों सहित ऑक्ट्रेसेस के कार्यान्वयन की एक अच्छी चर्चा इंटेल के एक्स्टेंडिंग एसटीएल में गेम्स लेख के लिए मिल सकती है।
मार्टिन फुट

1

आप RLE का उपयोग कर सकते हैं। लेकिन आप SVO (Sparse Voxel Octree), id Tech 6 में SVO का उपयोग कर सकते हैं। एसवीओ एक 3 डी कंप्यूटर ग्राफिक्स रेंडरिंग तकनीक है, जो ऑक्सिटरी डेटा प्रतिनिधित्व में एक रेकास्टिंग या कभी-कभी एक रे ट्रेसिंग दृष्टिकोण का उपयोग करती है।

तकनीक कुछ हद तक बदलती है, लेकिन आम तौर पर अंक (विरल स्वर) के पतवार को उत्पन्न करने और संसाधित करने पर निर्भर करती है जो दिखाई देते हैं या दिखाई दे सकते हैं, स्क्रीन के रिज़ॉल्यूशन और आकार को देखते हुए।

रेकास्टिंग का उपयोग करें, क्योंकि यह अधिक तेज़ है।


0

आम तौर पर आप इलाके के लिए एक 3 डी डेटा-संरचना से बच सकते हैं। आप इसके बजाय एक ऊंचाई का उपयोग कर सकते हैं । यह बहुत सस्ते में और कुशलता से रनटाइम पर स्वरबद्ध हो सकता है। यह आमतौर पर (मेरे अनुभव में) प्रत्येक कॉलम में रेंडर करने के लिए आवश्यक न्यूनतम ऊंचाई को ट्रैक करने के लिए और कभी-कभी स्टार्ट-स्टॉप-टॉप एंगल्स को भी भुगतान करता है ताकि आप बैकफुट कॉलम को भी कम कर सकें।

यहाँ मैंने एक लंबा समय दिया है: http://sites.google.com/site/williamedwardscoder/spinning-voxels-in-flash

यदि आपके पास इलाके में थोड़ी सी भी अधिकता या गुफाएँ या अन्य सुविधाएँ हैं, जिन्हें ऊँचाई द्वारा नहीं दिखाया जा सकता है, तो आप अपने ऊँचाई में छेद कर सकते हैं और एक वैकल्पिक प्रतिनिधित्व कर सकते हैं जैसे कि सच्ची 3D voxel ऑब्जेक्ट जो उन स्थानीय स्थानों को भरती हैं जहाँ रनटाइम खर्च होता है अनुबद्ध है।

जब आप बड़े सच्चे स्वर संसार होते हैं, तो स्पार्क्स वॉक्सल अभ्यावेदन इसके लायक होते हैं। जॉन कार्मैक पिछले कुछ सालों से उनसे बात कर रहे हैं ...


मैंने ऊंचाई के बारे में भी सोचा था लेकिन कुछ चीजों ने मुझे उनसे दूर कर दिया। बात यह है कि मेरे मामले में, इलाके वास्तव में किसी भी तरह से बहुत बड़े या बहुत जटिल नहीं हैं (एक भूलभुलैया प्रकार का इलाका, बहुत कार्टेसियन लगता है)। मैं इलाके का हिस्सा भी विनाशकारी होना चाहूंगा या उपयोगकर्ता को निर्माण के माध्यम से इलाके को प्रभावित करने की अनुमति दूंगा। इसका परिणाम यह हो सकता है कि खिलाड़ी उस इलाके में "सुरंगों" का निर्माण करें जो ऊंचाई के साथ प्रतिनिधित्व करने के लिए अधिक जटिल लगते हैं।
pwny
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.