2011-01-02 9 views
6

के लिए सर्वश्रेष्ठ बॉक्स चयन विधि मैं अपनी पहली ओपनजीएल परियोजना के रूप में एक Minecraft क्लोन बना रहा हूं और बॉक्स चयन भाग पर फंस गया हूं। विश्वसनीय बॉक्स चयन करने का सबसे अच्छा तरीका क्या होगा?Minecraft क्लोन

मैं कुछ एएबीबी एल्गोरिदम के माध्यम से जा रहा हूं, लेकिन उनमें से कोई भी पर्याप्त रूप से पर्याप्त रूप से समझाता है कि वे वास्तव में क्या करते हैं (विशेष रूप से सुपर ट्वीड वाले) और मैं उन चीज़ों का उपयोग नहीं करना चाहता जिन्हें मैं समझ नहीं पा रहा हूं।

float cube_intersect(Vector ray, Vector origin, Vector min, Vector max) 
{ 
    //??? 
} 

रे और मूल आसानी से

साथ प्राप्त कर रहे हैं:

के बाद से दुनिया क्यूब्स से बना है मैं octrees इस्तेमाल किया रे डाली गणना पर कुछ तनाव दूर करने के लिए, मूल रूप से केवल एक चीज मैं जरूरत इस समारोह है

Vector ray, origin, point_far; 
double mx, my, mz; 

gluUnProject(viewport[2]/2, viewport[3]/2, 1.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz); 
point_far = Vector(mx, my, mz); 
gluUnProject(viewport[2]/2, viewport[3]/2, 0.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz); 
origin = Vector(mx, my, mz); 
ray = point_far-origin; 

न्यूनतम और अधिकतम घन के विपरीत कोनों हैं।

मुझे यह भी सुनिश्चित नहीं है कि ऐसा करने का सही तरीका यह है कि मुझे क्यूब्स की संख्या पर विचार करना होगा, यहां तक ​​कि ऑक्टेट्स के साथ भी।

मैंने gluProject भी कोशिश की है, यह काम करता है, लेकिन बहुत अविश्वसनीय है और मुझे घन का चयनित चेहरा नहीं देता है।


संपादित

तो इस मैं क्या किया है है:

float t = 0; 
for(int i=0; i<10; i++) 
{ 
    Vector p = ray*t+origin; 
    while(visible octree) 
    { 
     if(p inside octree) 
     { 
      // then call recursive function until a cube is found 
      break; 
     } 
     octree = octree->next; 
    } 
    if(found a cube) 
    { 
     break; 
    } 
    t += .5; 
} 

वास्तव में आश्चर्यजनक रूप से तेज है और बाद पहली घन पाया बंद कर देता है: रे के साथ अंतरिक्ष में एक स्थिति की गणना । वहाँ स्क्रीन के बीच में एक क्रॉसहेयर है -

alt text

आप रे देख सकते हैं इससे पहले कि यह एक घन (वास्तव में अंतरिक्ष में एक पद) पाता गर्त कई octrees जाना पड़ता है। वृद्धि वृद्धि जितनी कम होगी उतनी सटीक चयन, लेकिन धीमी गति से।

उत्तर

5

प्राथमिकता के रूप में बक्से के साथ काम करना स्मृति आवश्यकताओं और प्रसंस्करण शक्ति में अधिक है। क्यूब्स प्रतिपादन के लिए ठीक हैं और यहां तक ​​कि आप अधिक उन्नत एल्गोरिदम पा सकते हैं जो आपको एक बेहतर अंतिम छवि (मार्चिंग क्यूब्स) देते हैं। Minecraft के ग्राफिक्स इस अर्थ में बहुत प्राचीन हैं क्योंकि वोक्सेल प्रतिपादन लंबे समय से आसपास रहा है और महत्वपूर्ण प्रगति हुई है।

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

+0

कॉपी जो आपने Google से कहा था उसे चिपकाया और पाया कि: http://www.metanetsoftware.com/technique/tutorialB.html धन्यवाद, मेरे समाधान से बेहतर तरीका। – Solenoid

+0

सहमत .. मैंने एक्सबॉक्स के लिए क्लोन पर काम किया और मुझे गहनों के प्रसंस्करण मिल गया .. मेरे अगले गेम के लिए क्यूब्स मार्च करने के लिए स्विच किया गया और यह तेजी से चलता है (जावास्क्रिप्ट में क्रोम एपीपी के रूप में!) [मेरा मर्स] (http: // youtu.be/_oML6USPs20) –

0

आपको स्मृति में किसी भी स्पष्ट ऑक्टेट्री संरचना की आवश्यकता नहीं है। जरूरी है कि बाइट [,,] है। खोज के दौरान बस एक बॉक्स के 8 बच्चे उत्पन्न करें (जैसे शतरंज इंजन बच्चों के खेल राज्यों को उत्पन्न करता है)।

0

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

मैं विस्तार यहाँ https://stackoverflow.com/a/18028366/94167

में इस सिद्धांत को कवर

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

मैं कैमरे के केंद्र बिंदु को ट्रैक करके यह क्षैतिज फोकल प्वाइंट निर्धारित करने के लिए आगे प्रयोग कर रहा हूं और इससे आप कोण को निर्धारित कर सकते हैं जो बदले में गहराई को निर्धारित करता है जिस तरह से आप सामना करते हैं उस दिशा में आपको देखने की संभावना है।

संबंधित मुद्दे