2008-10-15 30 views
9

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

Direction - (FieldOfView/2) से (मैं इस समय कर रहा हूं और यह भयानक है) से प्रत्येक डिग्री के लिए एक किरण कास्टिंग करने के अलावा, इस दृश्यता जांच को करने का सबसे अच्छा तरीका क्या है?

उत्तर

9

अपनी दृश्य दिशा (एक वेक्टर के रूप में समझा) के बीच कोण की गणना करें और वेक्टर जो आपके ऊपर शुरू होता है और ऑब्जेक्ट पर समाप्त होता है। यदि यह FieldOfView/2 के अंतर्गत आता है, तो आप ऑब्जेक्ट देख सकते हैं।

कि कोण है:

arccos(scalarProduct(viewDirection, (object - you))/(norm(viewDirection)*norm(object - you))). 
+0

धन्यवाद, बिल्कुल वही जो मैं खोज रहा था। मुझे लगता है कि यह संभवतः मेरे पास जो कुछ है उसके आधार पर इसे हासिल करने का सबसे आसान तरीका है। – AshtonKJ

2

आप 3 डी कर रहे हैं और एक frustrum के रूप में देखने के रेंज को परिभाषित कर सकते हैं, तो आप इस Frustrum Culling तकनीक के लिए कुछ इसी तरह का उपयोग कर सकते हैं।

3

दर्शक के शीर्षक वेक्टर और दर्शक से लक्षित करने के लिए वेक्टर के बीच कोण प्राप्त करें। यदि वह कोण (फ़ील्डऑफ व्यू/2) से कम है, तो लक्ष्य दर्शक के दृश्य क्षेत्र में है।

यदि आपके वैक्टर 2 डी या 3 डी हैं तो यह वही काम करेगा। (3 डी में, यदि आपके पास शंकु के बजाय एक दृश्य निराशा है, तो आपको कोणों को दो घटकों में अलग करने की आवश्यकता होगी।) आपको केवल दो वैक्टरों के बीच कोण खोजने की आवश्यकता है।

यदि आप एक बिंदु से बड़े लक्ष्य का परीक्षण करना चाहते हैं, तो आपको प्रत्येक लक्ष्य के लिए कई बिंदुओं की आवश्यकता होगी, जैसे बाध्यकारी बॉक्स के कोनों। यदि दर्शक से वेक्टर किसी भी बिंदु पर किसी भी बिंदु को देखने के क्षेत्र में कोण देता है, तो बॉक्स का वह कोने दिखाई देता है।

10

मैंने वीडियो गेम उद्योग में काम किया है, और मैं कह सकता हूं कि प्रत्येक फ्रेम arcos जैसे त्रिभुज कार्य आदर्श से कम है। इसके बजाय, आप शंकु के लिए कोण की कोज्या precompute:

float cos_angle = cos(PI/4); // 45 degrees, for example 

फिर, प्रत्येक फ्रेम आप जल्दी से देख सकते हैं कि एक बिंदु शंकु के डॉट उत्पाद और साथ कि तुलना करके कि शंकु के अंदर गिर जाता है।

vector test_point_vector = normalize(test_point_loc - cone_origin); 
float dot_product = dot(normalized_cone_vector, text_point_vector); 
bool inside_code = dot_product > cos_angle; 

कोई ट्रिगर फ़ंक्शंस नहीं है, केवल कुछ गुणा, विभाजन और अतिरिक्त। अधिकांश गेम इंजनों में वेक्टर के लिए अनुकूलित सामान्यीकृत() फ़ंक्शन होता है।

यह इस समीकरण की वजह से काम करता है:

A · B = |A| * |B| * cos(Θ) 

आप वैक्टर (ए -> एक) को सामान्य हैं, तो समीकरण सरल है:

An · Bn = cos(Θ) 
+0

इसके लिए धन्यवाद। मुझे प्रति फ्रेम ट्रिगर कार्यों की मात्रा सीमित करने का विचार पसंद है। मैं निश्चित रूप से इस कोशिश की कोशिश करूँगा (दुख की बात है, केवल एक बार परीक्षा समाप्त हो जाती है)। – AshtonKJ

+0

मुझे यह जवाब पसंद है। एक नोट के रूप में, यह समाधान केवल "फ्रस्टम चेक" करेगा और दीवारों और अन्य वस्तुओं द्वारा प्रक्षेपण से निपटने वाला नहीं है। –

1

अच्छा जवाब पहले से ही है, लेकिन मैं तो बस करना चाहता था आपको वुल्फियर ब्लॉग के लिए एक लिंक दें, उन्होंने हाल ही में एक बीजगणित श्रृंखला शुरू की जो एक उदाहरण के रूप में "दृश्य का क्षेत्र" समीकरण लेता है। Go read it, इसकी अच्छी तरह से लिखित और आसान है।

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

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