2011-01-20 11 views
8

मैं पहले से ही समस्या के लिए गुग हो गया हूं, लेकिन केवल 2 डी समाधान या सूत्र पाए गए हैं जो मेरे लिए काम नहीं करते हैं (यह सूत्र जो अच्छा दिखता है: http://www.ogre3d.org/forums/viewtopic.php?f=10&t=55796 लेकिन ऐसा नहीं लगता है सही बात)।3 आयामों में चलती लक्ष्य पर शूट प्रोजेक्टाइल (सीधी प्रक्षेपवक्र)

मैं दे दिया है:

Vec3 cannonPos; 
Vec3 targetPos; 
Vec3 targetVelocityVec; 
float bulletSpeed; 

मैं के लिए क्या देख रहा हूँ समय t ऐसी है कि

targetPos+t*targetVelocityVec 

intersectionpoint जहां के लिए तोप उद्देश्य और शूट करने के लिए है।

मैं टी के लिए एक सरल, सस्ता सूत्र की तलाश में हूँ

धन्यवाद (सरल से मैं सिर्फ कई अनावश्यक vectorspace परिवर्तनों और की तरह नहीं बना मतलब)!

+0

फेंकने पर विचार इस प्रकार एक सीधे प्रक्षेपवक्र तकनीकी तौर पर नहीं समस्या बहुत नीरस :-( – salva

उत्तर

15

असली समस्या यह पता लग रही है कि बुलेट लक्ष्य पथ को कैसे छेड़छाड़ कर सकता है। बुलेट की गति निरंतर है, इसलिए एक निश्चित मात्रा में यह उसी दिशा में यात्रा करेगा जिस पर हम इसे आग लगाते हैं। इसका मतलब है कि समय टी हमेशा एक क्षेत्र पर झूठ बोलने के बाद यह स्थिति है। यहाँ 2 डी में एक बदसूरत उदाहरण दिया गया है:

इस क्षेत्र के रूप में गणितीय व्यक्त किया जा सकता:

(x-x_b0)^2 + (y-y_b0)^2 + (z-z_b0)^2 = (bulletSpeed * t)^2  (eq 1) 

x_b0, y_b0 और तोप की स्थिति को निरूपित z_b0।

targetPos+t*targetVelocityVec         (eq 2) 

(eq 2) एक वेक्टर समीकरण है और तीन अलग-अलग समीकरणों में विघटित किया जा सकता है::

x = x_t0 + t * v_x 
y = y_t0 + t * v_y 
z = z_t0 + t * v_z 

इन तीन आप टी के लिए इस समीकरण को हल समीकरण अपने प्रश्न में प्रदान की जाती का उपयोग करके समय टी पा सकते हैं समीकरणों (eq 1) में डाला जा सकता:

(x_t0 + t * v_x - x_b0)^2 + (y_t0 + t * v_y - y_b0)^2 + (z_t0 + t * v_z - z_b0)^2 = (bulletSpeed * t)^2 

इस समीकरण केवल ज्ञात चर होते हैं और टी के लिए हल किया जा सकता। स्थिरांक को द्विघात subexpressions की लगातार हिस्सा आवंटित करके हम गणना को आसान बनाने में कर सकते हैं:

c_1 = x_t0 - x_b0 
c_2 = y_t0 - y_b0 
c_3 = z_t0 - z_b0 
(v_b = bulletSpeed) 

(t * v_x + c_1)^2 + (t * v_y + c_2)^2 + (t * v_z + c_3)^2 = (v_b * t)^2 

एक मानक द्विघात समीकरण के रूप में यह पुनर्व्यवस्थित करें:

(v_x^2+v_y^2+v_z^2-v_b^2)t^2 + 2*(v_x*c_1+v_y*c_2+v_z*c_3)t + (c_1^2+c_2^2+c_3^2) = 0 

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

जब आप समीकरण हल कर लेते हैं तो आप उसे (eq 2) में डालकर टी की स्थिति पा सकते हैं।छद्म कोड में:

# setup all needed variables 
c_1 = x_t0 - x_b0 
c_2 = y_t0 - y_b0 
c_3 = z_t0 - z_b0 
v_b = bulletSpeed 
# ... and so on 

a = v_x^2+v_y^2+v_z^2-v_b^2 
b = 2*(v_x*c_1+v_y*c_2+v_z*c_3) 
c = c_1^2+c_2^2+c_3^2 

if b^2 < 4*a*c: 
    # no real solutions 
    raise error 

p = -b/(2*a) 
q = sqrt(b^2 - 4*a*c)/(2*a) 

t1 = p-q 
t2 = p+q 

if t1 < 0 and t2 < 0: 
    # no positive solutions, all possible trajectories are in the past 
    raise error 

# we want to hit it at the earliest possible time 
if t1 > t2: t = t2 
else: t = t1 

# calculate point of collision 
x = x_t0 + t * v_x 
y = y_t0 + t * v_y 
z = z_t0 + t * v_z 
+2

बनाता नकारात्मक के लिए "* अतीत में आग तोप *" लेकिन तोप आग * में * पिछले ' टी' –

+0

@ बेन, अच्छा बिंदु। फिक्स्ड। –

+0

'अगर टी 1 * टी 2> 0': यह हो सकता है कि दोनों समाधान सकारात्मक हैं, इसलिए वास्तव में संकेत की जांच किए बिना एक त्रुटि नहीं उठाई जानी चाहिए (या क्यों टी 1 और टी 2 दोनों सकारात्मक नहीं हो सकते हैं अगर वे नहीं कर सकते हैं)। मैं केवल 'अगर टी 1 <0 और टी 2 <0' का उपयोग करता हूं, व्यक्तिगत रूप से – mokus