2012-12-15 24 views
5

मैं एक स्कूल प्रोजेक्ट के लिए रेसिंग गेम पर काम कर रहा हूं। विजुअल स्टूडियो 10 प्रो, और इरलिच का उपयोग करना। खराब व्याकरण के लिए खेद है>।>, और यह मेरा पहला सवाल है, इसलिए यह सुनिश्चित न करें कि यह सही हो गया है या नहीं।मुझे कैसे पता चलेगा कि कोई ऑब्जेक्ट किसी बिंदु के पहले या बाद में है या नहीं?

मैं इसे कैसे काम करना चाहता हूं यह है कि मैं ट्रैक पर विभिन्न बिंदुओं पर 0pपर मार्ग बिंदु बना देता हूं और फिर मैं अपना रास्ता तय करता हूं कि यह देखने के लिए कि क्या कोई कार अपने अगले मार्ग से पिछली है (अगली इसे "जरूरत है"), यदि हां तो यह अगली रास्ता तय करता है, अन्यथा कुछ भी नहीं।

जिस तरह से मुझे उम्मीद है कि यह काम करेगा, मैं एन से 1 + तक वेक्टर बना देता हूं, फिर वेक्टर को ढूंढें जो पहले वेक्टर के लिए लंबवत है। तब मैं देखता हूं कि वस्तु उस वेक्टर के सामने या पीछे है या नहीं। एक नया बिंदु पर पीछे जा रहा बिना तो लोगों

  1. अपडेट nextwaypoint अधिक: मैंने पाया एक Gamedev.net forumpost कि मुझे इस समारोह बनाने में मदद की:

    void Engine::checkWaypoint(Vehicle* vehicle) 
    { 
        btVector3 vector = waypoints[vehicle->nextWaypoint]; 
        // n 
        btVector3 nextVector = waypoints[vehicle->nextWaypoint + 1]; 
        // n+1 
        vector = nextVector - vector; 
        // First vector 
        btVector3 pos = btVector3(vehicle->position.X,vehicle->position.Y,vehicle->position.Z); 
    
        float product = vector.dot(pos - waypoints[vehicle->nextWaypoint]); 
        // positiv = before, negative = behind 
    
        if(product < 0) 
        vehicle->nextWaypoint += 1; 
    } 
    

    इस के साथ वर्तमान कीड़े है।

  2. जब यह अंत तक हो जाता है और रीसेट हो जाता है, तो यह पहले मार्ग बिंदुओं पर ट्रिगरिंग बंद कर देता है।

तो मेरे सवालों का:

इस यह करने के लिए एक अच्छा तरीका है?

क्या मैंने यह सही किया?

+0

आपको बेहतर जवाब प्राप्त करने के लिए, [कोई जवाब स्वीकार करना चाहिए] (http://stackoverflow.com/faq#howtoask), या अगर कोई आपको विश्वास दिलाता है तो दिए गए उत्तरों पर टिप्पणी करें। – Synxis

उत्तर

0

बाहर मिला है कि अपने मूल कोड काम कर रहा था, समस्या वेपोइंट के साथ था: आप कि गणना के सापेक्ष कुल करने की ज़रूरत है।

मार्गों को देखने में आसान बना दिया गया और वे सभी एक-दूसरे के बहुत करीब थे, इसलिए कोड उसी स्थान पर कई बार खुद को दोहरा रहा था।

तो रास्ते के बीच की दूरी को लंबा बना दिया, और उन्हें एक ट्रैक में बनाया, और सब कुछ काम करना शुरू कर दिया जैसे मैं इसे भी चाहता था।

1

आमतौर पर, रेस गेम में आपको चेकपॉइंट पर सत्यापित किया जाना चाहिए: आप बस जांचें कि कार चेकपॉइंट से काफी करीब है। तो, मुझे लगता है कि निम्नलिखित छद्म कोड मान्य होगा:

if(car is_near current_checkpoint) 
    current_checkpoint = current_checkpoint->next_checkpoint; 

is_near: return distance(car, current_checkpoint) < some value 

दूरी परीक्षण के लिए, आप एक सरल चक्र आकार (के रूप में छद्म कोड में दिखाया गया है) का उपयोग कर सकते हैं, या आप कि कार का परीक्षण कर सकते चेकपॉइंट के बाउंडिंग बॉक्स को हिट करता है (या एक बॉक्स जो चेकपॉइंट के अंदर होता है), यह इस बात पर निर्भर करता है कि आपके चेकपॉइंट कैसे बनाए जाते हैं।

अन्यथा, आप चेकपॉइंट्स से अपने अनुयायियों तक की सभी पंक्तियों द्वारा एक वक्र बना सकते हैं, और फिर उस पर सबसे नज़दीकी रेखा पाएं जहां से यह है, जिससे आप अगला चेकपॉइंट पा सकते हैं। उदाहरण:

     o--o 
        / \ 
    o-----------------o  \ 
/      \ <-- your track: S = start 
/       o     E = end 
/  o---o  X /    o = checkpoint 
S  / \  . /     X = car 
     /  o------.----o 
    /    ^
    E--o     | 
       closest road from the car 

असुविधाजनक: परिणाम सड़कों के वक्रता के आधार पर भिन्न हो सकते हैं। मैं आपको बताई गई पहली विधि का उपयोग करने की सलाह देता हूं।

+0

आपका कोड वर्तमान समस्या से मदद नहीं करता है, लेकिन इससे मुझे दूसरी समस्या के साथ मदद मिली, मेरे पास कुछ और मेरे कोड सराय थे। उस –

1

आपका कोड वर्तमान तरीके से वेक्टर के साथ कितने दूर तक चलता है-खिलाड़ी अगले बिंदु तक है। हालांकि अगर लगातार दो खंडों के लिए वैक्टर (उदाहरण के लिए) दाएं कोण पर हैं, तो एल्गोरिदम एक समय में कई तरीकों से निकल सकता है। (यानी यदि आप अगली तरफ-बिंदु पर रेखा खींचते हैं, तो यह सड़क के बीच में दाएं हो सकता है, जिसका मतलब है कि खिलाड़ी उस रास्ते की ओर बढ़ते समय, पीछे जाकर आगे बढ़ सकता है)।

कुछ प्रकार की बाध्यकारी मात्रा काम कर सकती है, या तो मार्ग की दूरी (यह जांचें कि यह सड़क की 2x चौड़ाई से कम है), या वेक्टर के बीच की गणना जो आपने गणना की है।

क्यों यह काम नहीं करता है जब आप चक्कर लगाते हैं करने के लिए के रूप में (या आप बस अधिक वेपोइंट को जोड़ने के साथ दूर हो सकती है), तो यह आपको बस अगले एक को खोजने के लिए वेपोइंट में भी जोड़ रहा है।

next_waypoint = (vehicle->nextWaypoint + 1) % num_waypoints; 
+0

के लिए धन्यवाद आह आह चेक करें, मुझे पता था कि मैं कुछ भूल गया था। उसके लिए धन्यवाद। –