การคำนวณความเร็วต่ำสุดของกระสุนปืนที่จำเป็นในการเข้าถึงกลุ่มเป้าหมายเป็นรูปโค้งโค้ง


20

หากฉันมีจุดที่ฉันต้องการตีในตอนท้ายหรือในช่วงโค้งพาราโบลาฉันจะคำนวณความเร็ว x และ y ที่ต้องการได้อย่างไร


คำตอบ:


15

ฟังก์ชั่นถาดรูปพาราโบลาถูกกำหนดเป็น:

   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)      

คำตอบที่ดี เพิ่งรู้ว่า g ไม่ได้ลงนาม เมื่อเพิ่มมากขึ้น Voy ก็ควรเพิ่มขึ้นเช่นกัน
milkplus

t (เวลาจำเป็นต้องมีผลกระทบ) ทราบได้อย่างไร
Dewald Swanepoel

13

ฉันเพิ่งต้องแก้ปัญหาที่คล้ายกันฉันมาด้วยสองวิธีขึ้นอยู่กับสูตรที่ฉันพบในหน้าวิกิพีเดีย '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

ในกรณีของฉันโซลูชันนี้ทำงานได้ค่อนข้างดี


2

หากคุณไม่สนใจว่ามันถูกต้องทางคณิตศาสตร์เพียงแค่ว่ามันดูถูกต้องให้คำนวณเส้นทางตรงและทำให้กระสุนปืนของคุณเดินไปตามเส้นทางนั้น แต่ "ผลักมันขึ้น" ตามแนวปกติของเส้นนั้นในขณะที่ฟังก์ชันอยู่ไกล ส่วนของเส้นตรงดังนั้นมันจะเพิ่มขึ้นเมื่อเข้าใกล้จุดกึ่งกลางของส่วนและลดลงเมื่ออยู่ห่างจากจุดกึ่งกลางของเส้นตรง

คุณสามารถใช้คลื่นไซน์สำหรับสิ่งนี้โดยใช้ช่วงขององศาจาก -90 ถึง +90 (โดยที่ -90 คือจุดซ้ายบนส่วนของเส้นตรง 90 คือจุดที่ถูกต้องและคุณเลื่อนลงตรงกลาง) แล้วคูณผลลัพธ์ โดยค่าคงที่เพื่อเพิ่มขนาด

หากคุณต้องการคำตอบทางคณิตศาสตร์ / ทางกายภาพที่ถูกต้องสิ่งนี้จะไม่ช่วย ถ้าคุณทำไม่ได้สิ่งนี้อาจใช้ได้ดีสำหรับคุณ!

อย่าลืมว่าการเขียนโปรแกรมเกมเกี่ยวกับการใช้ภาพลวงตาที่ดูถูกต้อง (และมีราคาถูกกว่าในการคำนวณ) แทนที่จะเป็นความสมจริง


7
Re: "การใช้ภาพลวงตาที่ดูถูกต้อง (และถูกกว่าในการคำนวณ)" ฉันเห็นด้วยโดยทั่วไป แต่ในกรณีนี้ดูเหมือนว่าค่อนข้างโง่เนื่องจากวิธีที่ง่ายและราคาถูกก็คือการใช้ส่วนโค้งพาราโบลาที่ถูกต้องทางคณิตศาสตร์
นาธานรีด

1
จริงอยู่ที่นี่ดูเหมือนจะเป็นการทำให้เข้าใจง่ายโดยไม่จำเป็น แต่ฉันไม่คิดว่าคำตอบนี้ไม่ดีในแง่ที่ไม่ดีและมันก็ไม่สมควรได้รับ downvote (แม้ว่ามันจะไม่ได้ประโยชน์มากนัก
จะ

ที่จริงถ้าคุณกำลังจะใช้คลื่นไซน์มันควรจะเป็น 0 ถึง 180 (หรือ 0 ถึง pi เป็นเรเดียน)
Daniel Kaplan

2

หากคุณต้องการบางสิ่งที่ถูกต้องและมีความเร็วคงที่คุณสามารถใช้วิธีที่ง่ายมากนี้ได้

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 หารด้วยระยะทางสูงสุดที่กระสุนสามารถครอบคลุม


1
หัวขึ้น เมื่อฉันลองใช้รหัสของคุณคุณมีโคไซน์และบาปย้อนหลัง ฉันแก้ไขโค้ดของคุณแล้วจึงควรแก้ไข
MrValdez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.