หากฉันมีจุดที่ฉันต้องการตีในตอนท้ายหรือในช่วงโค้งพาราโบลาฉันจะคำนวณความเร็ว x และ y ที่ต้องการได้อย่างไร
หากฉันมีจุดที่ฉันต้องการตีในตอนท้ายหรือในช่วงโค้งพาราโบลาฉันจะคำนวณความเร็ว x และ y ที่ต้องการได้อย่างไร
คำตอบ:
ฟังก์ชั่นถาดรูปพาราโบลาถูกกำหนดเป็น:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
ค่าที่ทราบ:
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
ค่าที่ไม่รู้จัก:
Vo: Initial Velocity
ในการคำนวณ 'Vo' เราสามารถให้ค่าแก่ฟังก์ชัน F:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
ตอนนี้คุณสามารถรับค่าทั้งหมดเพื่อเข้าถึงเป้าหมายจากจุดกำเนิดโดยให้ค่าเป็น t ในสมการ F:
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
ฉันเพิ่งต้องแก้ปัญหาที่คล้ายกันฉันมาด้วยสองวิธีขึ้นอยู่กับสูตรที่ฉันพบในหน้าวิกิพีเดีย 'Dan the Man' กล่าวถึงแล้ว: วิถีกระสุนปืน
ในการแก้ปัญหานี้คุณจำเป็นต้องมีมุมการยิงคงที่หรือความเร็ว x ไม่จำเป็นต้องใช้ความเร็ว Y เนื่องจากเราเปิดตัวกระสุนในมุมที่กำหนด
โซลูชันที่ 1 เริ่มต้นมุมคงที่คำนวณความเร็ว:
g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity
โซลูชัน 2 ความเร็วคงที่คำนวณมุมการเปิด:
g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle
ในกรณีของฉันโซลูชันนี้ทำงานได้ค่อนข้างดี
หากคุณไม่สนใจว่ามันถูกต้องทางคณิตศาสตร์เพียงแค่ว่ามันดูถูกต้องให้คำนวณเส้นทางตรงและทำให้กระสุนปืนของคุณเดินไปตามเส้นทางนั้น แต่ "ผลักมันขึ้น" ตามแนวปกติของเส้นนั้นในขณะที่ฟังก์ชันอยู่ไกล ส่วนของเส้นตรงดังนั้นมันจะเพิ่มขึ้นเมื่อเข้าใกล้จุดกึ่งกลางของส่วนและลดลงเมื่ออยู่ห่างจากจุดกึ่งกลางของเส้นตรง
คุณสามารถใช้คลื่นไซน์สำหรับสิ่งนี้โดยใช้ช่วงขององศาจาก -90 ถึง +90 (โดยที่ -90 คือจุดซ้ายบนส่วนของเส้นตรง 90 คือจุดที่ถูกต้องและคุณเลื่อนลงตรงกลาง) แล้วคูณผลลัพธ์ โดยค่าคงที่เพื่อเพิ่มขนาด
หากคุณต้องการคำตอบทางคณิตศาสตร์ / ทางกายภาพที่ถูกต้องสิ่งนี้จะไม่ช่วย ถ้าคุณทำไม่ได้สิ่งนี้อาจใช้ได้ดีสำหรับคุณ!
อย่าลืมว่าการเขียนโปรแกรมเกมเกี่ยวกับการใช้ภาพลวงตาที่ดูถูกต้อง (และมีราคาถูกกว่าในการคำนวณ) แทนที่จะเป็นความสมจริง
หากคุณต้องการบางสิ่งที่ถูกต้องและมีความเร็วคงที่คุณสามารถใช้วิธีที่ง่ายมากนี้ได้
distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;
ระยะทางอาจเป็นลบ แต่จะยังคงทำงานได้เพราะมุมขึ้นอยู่กับระยะทางด้วย หากระยะห่างเป็นลบมุมที่ต้องเพิ่มเป็นลบเช่นกัน
คุณจะต้องเล่นกับ distanceFactor เพื่อหาค่าที่เหมาะสม ขึ้นอยู่กับแรงโน้มถ่วงและพลังของกระสุนปืน มันควรจะอยู่ใกล้ 1 หารด้วยระยะทางสูงสุดที่กระสุนสามารถครอบคลุม