ทำอย่างไรจึงจะทำให้วัตถุสูญเสียความเร็วได้น้อยลงเมื่อความเร็วเพิ่มขึ้น


11

ฉันกำลังพัฒนาเกมใน Flash และฉันต้องการความช่วยเหลือเล็กน้อย ถือได้ว่าเป็นปัญหาทางคณิตศาสตร์

วัตถุของฉันบินด้วยความเร็วXและวัตถุของฉันสามารถชนกับก้อนหินได้ เมื่อมันชนกับหินฉันต้องการวัตถุของฉันที่จะทำลายหินและดำเนินการต่อ แต่มีความเร็วน้อยกว่า ง่ายต่อการเขียนโค้ดยากและเขียนสิ่งที่ชอบ: myVelocity -= 10;แต่ปัญหาหลักของฉันคือฉันต้องการให้ความเร็วลดลงน้อยกว่าความเร็วเริ่มต้นที่สูงขึ้น

ตัวอย่างเช่น: ถ้าความเร็วเป็น 300 ฉันอยากให้มันลด 10 และถ้าเป็น 200 ฉันอยากให้มันลด 20

สามารถใช้สูตรบางอย่างได้ไหม


1
เรื่องง่าย ๆ เป็นยังlog(myVelocity + 1) * Nไงบ้าง?
Jonathan Connell

คำตอบ:


6

ฉันจะกลับความเร็วและเพิ่มจำนวนตามสิ่งที่คุณต้องการ:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

ตัวอย่างนี้ให้เอฟเฟกต์เหล่านี้:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

"การชดใช้ความเสียหาย" คืออะไร?
jprete

การชดใช้ความเสียหาย ซึ่งเป็นจริง
Martijn Courteaux

30

ระบบเหล่านั้นที่คุณและคนอื่นอธิบายจะไม่สร้างฟิสิกส์ที่ดูสมจริง สูตรหลักคือการลด 0.5 * m * v ^ 2 (พลังงานจลน์) โดยค่าคงที่เมื่อใดก็ตามที่วัตถุโดนที่ใดที่หนึ่ง

ดังนั้นหากวัตถุที่มีน้ำหนัก 2 กก. โดนบล็อกบางส่วนซึ่งต้องการพลังงาน 16j ก่อนที่จะแตก: ความเร็วในการเคลื่อนที่ของวัตถุจะเปลี่ยนไปตามตารางนี้:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
สิ่งนี้ควรได้รับการยอมรับ - ถูกต้องสมจริงใช้งานง่ายและจัดการทุกกรณีของวัตถุและบล็อกมวลและความเร็ว
Tesserex

3
เว้นแต่ว่าคุณมีเอฟเฟกต์'ฟิสิกส์การ์ตูน' ที่เฉพาะเจาะจงที่คุณหวังว่าจะประสบความสำเร็จการใช้ระบบที่สมจริงยิ่งกว่านั้นเป็นความคิดที่ดีเสมอ มีวิธีที่ดีกว่าเล็กน้อยเพื่อให้แน่ใจว่าคุณจะไม่ได้รับคดีที่อาจทำให้เครื่องยนต์แตก
Steven Stadnicki

1
คำตอบนี้ดีฉันรู้ แต่เกมของฉันตั้งอยู่ในโลกการ์ตูนและไม่จำเป็นต้องเป็นจริง ฉันควรเจาะจงมากขึ้นเมื่อถามคำถาม
Afra

1
นี่เป็นโครงการชุมชนคนอยู่ที่นี่เพื่อตอบคำถามและสำหรับคำถามที่ถามนี่เป็นคำตอบที่ดีที่สุด เพียงเพราะคุณชอบโซลูชันแฮ็คสำหรับกรณีของคุณโดยเฉพาะไม่ได้หมายความว่าคำตอบนี้ไม่ใช่คำตอบที่ดีที่สุด โดยการเลือกคำตอบที่แฮ็กเป็นโซลูชันเมื่อมีคนอื่นค้นหาไซต์เพื่อหาคำตอบของคำถามประเภทนี้พวกเขาจะสมมติว่าคำตอบที่ไม่สมจริงนั้นดีกว่า
Richard Fabian

1
@Richard วิธีแก้ปัญหาอื่นไม่ได้เป็นเรื่องง่ายเพราะมันไม่ได้ใช้ฟิสิกส์ที่สมจริง Tetris Hacky เพราะบล็อกนั้นไม่ได้ลื่นไหล? หากผู้คนคิดว่าคำตอบที่ได้รับการยอมรับคือคำตอบที่ดีกว่าแทนที่จะคิดว่าเป็นคำตอบที่ตอบสนองผู้ถามได้ก็เป็นความผิดของพวกเขา คำตอบและการลงคะแนนทั้งหมดยังคงชัดเจน
CiscoIPPhone

2

คุณยังไม่ได้รับข้อมูลมากพอที่จะบอกช่วงที่คุณต้องการเช่นว่ามันจะต่อยอดไม่ว่าคุณต้องการความก้าวหน้าทางเรขาคณิตหรือไม่

สิ่งแรกที่คุณต้องการทำคือหาตัวเลขที่แปรผันตามปริมาณความเร็วที่คุณต้องการสูญเสีย (ไม่จำเป็นต้องเหมือนเดิม แต่ควรลดลงเมื่อความเร็วเพิ่มขึ้นเพื่อทำให้สัดส่วนกับการสูญเสียของคุณ) วิธีมาตรฐานในการทำเช่นนั้นคือรับส่วนกลับ :

temp = 1 / currentVelocity;

ทีนี้, สำหรับ 100 คุณจะได้ 0.01, สำหรับ 200 คุณจะได้ 0.005, สำหรับ 300 คุณจะได้ 0.0033 เป็นต้นไป

ตอนนี้คุณเพียงแค่ต้องปรับจำนวนนั้นเป็นสิ่งที่คุณต้องการโดยการคูณมัน ดังนั้น

k = 3000;
newVelocity = temp * k;

จะให้ 20 กับ 300 ของคุณ แต่จะให้ 15 ถึง 200 แทน 10 ซึ่งอาจใช้ได้สำหรับคุณในกรณีนี้คุณไม่จำเป็นต้องอ่านเพิ่มเติม คุณสามารถปรับ k ตามที่คุณต้องการ แต่คุณอาจไม่ได้ตัวเลขในแบบที่คุณชอบเว้นแต่คุณจะทำอะไรเพิ่มอีกเล็กน้อยเช่นใช้ความก้าวหน้าทางเรขาคณิตหรือเปลี่ยนฐานเพื่อเพิ่ม ฉันจะไม่เข้าสู่ความก้าวหน้าทางเรขาคณิตที่นี่ แต่ถ้าคุณต้องการเปลี่ยนฐานคุณทำได้ดังนี้:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

สิ่งนี้จะให้ช่วงที่คุณถามมาตั้งแต่แรกคำถาม 300 -> การสูญเสีย 10, 200 -> การสูญเสีย 20. FYI 100 -> การสูญเสีย 40 และ 50 -> การสูญเสีย 80 (!) ซึ่งหมายความว่าคุณ จำเป็นต้อง จำกัด การลบของคุณซึ่งเป็นสิ่งที่ฉันทำในบรรทัด (1) และ (2)

มีวิธีอื่นในการเข้าถึงปัญหาทั้งหมดนี้ซึ่งแน่นอนว่าผู้ที่เชี่ยวชาญทางคณิตศาสตร์มากกว่าที่ฉันจะโพสต์ที่นี่


0

ฉันคิดว่าคุณสามารถใช้การหารง่ายๆด้วยความเร็ว ตัวอย่างเช่น: lost = 3 000 / myVelocity เมื่อความเร็วเป็น 300 คุณจะเสีย 10 เมื่อเป็น 200 คุณจะเสีย 15 มันขึ้นอยู่กับคุณที่จะเลือกค่าคงที่ที่ถูกต้อง

หากคุณต้องการคุณสามารถใช้สูตรที่ซับซ้อนมากขึ้นเช่น: ค่าคงที่ / (ค่าคงที่ 2 * ความเร็ว ^ 2 + ความเร็วคงที่ 3 *) อีกครั้ง - เพียงแค่เลือกค่าคงที่ซึ่งจะเหมาะกับคุณ


มันตรงกันข้ามอย่างสมบูรณ์ในสิ่งที่เขาขอและสิ่งที่เกิดขึ้นในฟิสิกส์จริง
Ali1S232

ฉันไม่เข้าใจคุณ อะไรที่ตรงกันข้าม
zacharmarz

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