ฉันจะจำลองลูกตุ้มแกว่งได้อย่างไร


9

ฉันต้องการจำลองเชือกที่มีน้ำหนักติดอยู่แกว่งไปมาเหมือนลูกตุ้ม ฟิสิกส์จริง ๆ ก็คือ overkill; มันเป็นการเคลื่อนไหวแบบเดียวกันซ้ำ ๆ ไม่รู้จบ

JQuery มี"การแกว่ง" ที่ง่ายเหมือนกับสิ่งที่ฉันกำลังมองหา มันทำงานยังไง?

ฉันคิดของการหมุนจากมุมหนึ่งไปยังอีกที่มีMath.easeOutExpoแต่ลูกตุ้มจริงความสะดวกแตกต่างกัน ...


2
มีเส้นโค้งไซน์ป้อนเข้าสู่ความเร็วเชิงมุมของลูกตุ้มเช่นจุดศูนย์อยู่ที่จุดสูงสุดและค่าความเร็วสูงสุดอยู่ที่ด้านล่าง
ปืนลูกซองนินจา

คำตอบ:


10

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

การกระจัดเชิงมุมในเวลาที่กำหนดสามารถประมาณด้วย:

ป้อนคำอธิบายรูปภาพที่นี่

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


4

นี่คือการคำนวณแบบไม่มีทริกซึ่งได้มาจากทริกเกรด 11 และฟิสิกส์แบบตรงๆ มันสันนิษฐานว่าต้นกำเนิดเป็นจุดต่ำสุดของลูกตุ้มของบ๊อบจังหวะ l นั่นคือความยาวของลูกตุ้มและปกติการประชุมของ y กราฟิกลงและ x เพิ่มขึ้นไปทางขวาเป็นลูกบุญธรรม:

อัปเดต:ฉันเริ่มต้น yAcceleration ง่ายกว่านี้
อัปเดต # 2 : เพิ่มการควบคุมเวลาอย่างชัดเจนและเพิ่มหน่วยของการวัด

const float gravity = 9.8;     // units of metres/sec/sec
const float deltaT  = 0.001;   // equals 0.001 sec or 1 millisecond

var xVelocity = 0.010;         // units metres/sec equals 10 cm/sec 
var x = 0.0;                   // units metres
var y = 0.0;                   // units metres

while (true) {
  var xAcceleration = -gravity * (x/L) * (L-y)/L;

  x += (xVelocity + (xAcceleration/2 * deltaT)) * deltaT;
  y  = Math.SQRT(L*L - x*x) - L; 

  xVelocity += xAcceleration * deltaT;
}

2
เวลาหายไปในสมการ
Maik Semder

@MaikSemder: หน่วยของเวลาถูกกำหนดให้เป็นวงจรภาพเคลื่อนไหวไม่ว่าจะเป็นอะไรก็ตาม ทำไมคนอื่นทำอย่างอื่น?
Pieter Geerkens

ขณะนี้การรวมความเร่งของคุณใช้เวลาโดยนัย 1 หน่วย หากหน่วยเวลาของเกมของคุณเป็นวินาทีคุณสามารถมี 1 เฟรมการจำลองต่อวินาทีเพียงแค่ปลั๊กอินเวลาอย่างละเอียดและคุณกำจัดปัญหานั้น เวลาอยู่ในนั้นแล้วเพียงทำให้ชัดเจน ตัวอย่างเช่นเวลาของเฟรมนั้นเปลี่ยนแปลงไป แต่คุณต้องการความเร็วคงที่ที่คงที่ของภาพเคลื่อนไหวโดยไม่ขึ้นกับเวลาของเฟรม, ระหว่างแพลตฟอร์มต่าง ๆ , หรือคุณต้องการเอฟเฟกต์ slomo, เหตุผลมากมาย
Maik Semder

1
นั่นคือประเด็นของฉัน g มาจากข้างนอกหรือ "เกม" ตอนนี้คุณมีหน่วยเวลา เดลต้าทีตอนนี้คือ 1 ของหน่วยเวลานั้น สำหรับการจำลองตามเวลาจริงที่ไม่สะดวกมากเนื่องจากเกมของคุณมี "ความคิด" ของตัวเองในเวลาที่ผ่านไป การทำให้เป็นพารามิเตอร์ที่ชัดเจนแทนที่จะเป็นค่าคงที่โดยนัยสามารถทำให้คำตอบของคุณมีประโยชน์สำหรับเกม
Maik Semder

2
ดี :) ความเร็วจะต้องคูณด้วย "deltaT" เช่นกันเพื่อให้ได้ "การเคลื่อนที่" ออกมาจากความเร็วดังนั้นจึงสามารถเพิ่ม "x" upvoted
Maik Semder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.