IsoSurface को रेंडर करने के लिए मैंने पहले मार्चिंग क्यूब्स / टेट्राहेड्रा लागू किया है। इसने ( YouTube ) काम किया , लेकिन प्रदर्शन भीषण था क्योंकि मुझे देखने की दूरी (या यहां तक कि पुराने, दूर के टुकड़े को हटाने) के आधार पर चर के स्तर को लागू करने के लिए कभी नहीं मिला।
मैंने इस बार एक और जाने और इसे ठीक से करने का फैसला किया। मैंने एक OctreeNode बनाकर शुरू किया है जो इस प्रकार काम करता है जब Build()
कहा जाता है।
- यदि चंक निर्माण करने के लिए बहुत छोटा है, तो तुरंत वापस लौटें।
- अगर सतह इस चंक की मात्रा से गुजरती है तो काम करें।
- यदि ऐसा है, तो तय करें कि क्या हम LOD उठाना चाहते हैं (क्योंकि कैमरा बंद है)
- यदि ऐसा है, तो 8 बच्चों को स्पॉन करें और उसी प्रक्रिया को उन पर कॉल करें
- यदि नहीं, तो वर्तमान नोड के आयामों का उपयोग करके मेष का निर्माण करें
कुछ छद्म कोड:
OctNode Build() {
if(this.ChunkSize < minChunkSize) {
return null;
}
densityRange = densitySource¹.GetDensityRange(this.bounds);
if(densityRange.min < surface < densityRange.max) {
if(loDProvider.DesiredLod(bounds)² > currentLoD) {
for(i 1 to 8) {
if(children[i] == null) {
children[i] = new OctNode(...)
}
children[i] = children[i].Build();
}
} else {
BuildMesh();
}
return this;
}
}
Returning एक बिंदु पर घनत्व लौटने के साथ-साथ, घनत्व स्रोत किसी दिए गए आयतन के लिए संभव घनत्व सीमा निर्धारित कर सकता है।
Returns LoD प्रदाता एक बाउंडिंग बॉक्स लेता है और अधिकतम वांछित LoD को कैमरा पोजीशन / फ्रूटम, उपयोगकर्ता सेटिंग्स, आदि के आधार पर देता है।
तो ... यह सब काफी अच्छी तरह से काम करता है। घनत्व स्रोत के रूप में एक साधारण क्षेत्र का उपयोग करना, और सभी नोड्स दिखाना:
और सिर्फ पत्ते:
हालाँकि, कुछ मुद्दे हैं:
- मुझे शुरुआती बाउंडिंग वॉल्यूम को परिभाषित करना होगा (और यह जितना बड़ा होगा, उतना अधिक प्रसंस्करण मुझे करना होगा)
- पेड़ की जड़ में, मुझे नहीं पता कि पत्ते कितने गहरे होंगे, इसलिए मेरी LoD की संख्या सबसे कम गुणवत्ता (मूल) से शुरू होती है और बढ़ जाती है क्योंकि चूजे छोटे हो जाते हैं। क्योंकि एलओडी अब प्रारंभिक मात्रा के सापेक्ष है, जब मैं विशिष्ट आकारों / गुणों पर चीजें करना चाहता हूं तो इसका ज्यादा उपयोग नहीं होता है।
मैंने कुछ विकल्पों के बारे में सोचा है लेकिन दोनों त्रुटिपूर्ण हैं:
- अक्टूबर के संग्रह को बनाए रखें और दूरी के आधार पर जोड़ें / निकालें। यह नहीं देख पा रहा हूं कि मैं पूरी तरह से कैसे घूमूंगा, साथ ही मुझे ज्ञात-रिक्त नोड्स की एक सूची की आवश्यकता होगी, खासकर अगर मुझे 3 डी सतहों की मनमानी चाहिए (बार-बार खाली वॉल्यूम की पुन: गणना करने से बचने के लिए)
- वर्तमान रूट में एक मूल नोड जोड़ें, फिर मूल नोड के लिए सात भाई-बहन जोड़ें। यह काम करेगा और ऑन-डिमांड होगा, लेकिन खिलाड़ी के परिदृश्य से हटते ही यह समझदारी से सिकुड़ जाना जटिल है। यह LoD नंबर को और भी कम सार्थक बना देगा।
¹ [क्यू के नीचे स्पष्टीकरण में] वर्तमान में, अगर पेड़ में 2 शारीरिक रूप से आसन्न नोड्स अलग-अलग एलओडी पर हैं, तो मेरे पास कुछ कोड हैं ताकि वे इस तरह के कगार को समतल कर सकें, जब मेश उत्पन्न नहीं होते हैं। मैं आसपास के कई नोड्स के घनत्व को जानकर ऐसा करने में सक्षम हूं। ऐसे परिदृश्य में, जहां मेरे पास 2 स्वतंत्र ऑक्ट्रीज़ हैं, मैं इस जानकारी को प्राप्त करने का कोई आसान तरीका नहीं है, जिसके परिणामस्वरूप सीम।
यह दृष्टिकोण करने का एक इष्टतम तरीका क्या है?