मैं झूलते पेंडुलम का अनुकरण कैसे करूं?


9

मैं एक रस्सी को वजन के साथ जोड़ना चाहता हूं, एक पेंडुलम की तरह आगे और पीछे झूलता हूं। कोई वास्तविक भौतिकी ओवरकिल है; यह केवल एक ही गति को दोहरा रहा है।

JQuery के पास है "स्विंग" सहजता है जो मैं देख रहा हूं। यह कैसे काम करता है?

मैं एक एंगल से दूसरे एंगल को घुमाने की सोच रहा था Math.easeOutExpo, लेकिन असली पेंडुलम आसानी से अलग हो जाता है ...


2
पेंडुलम के कोणीय वेग में साइन वक्र फ़ीड है, जैसे कि शून्य-बिंदु चोटियों पर है, और उच्चतम वेग मूल्य तल पर है।
शॉटगन निंजा

जवाबों:


10

ठीक है, आपको भौतिकी का थोड़ा उपयोग करना होगा, लेकिन आपको किसी भी भौतिकी का अनुकरण करने की आवश्यकता नहीं है । पेंडुलम गति के लिए सूत्र हैं आप आसानी से अपने पेंडुलम के रोटेशन को सेट करने के लिए उपयोग कर सकते हैं। छोटे झूलों के लिए, गति को सरल हार्मोनिक गति के साथ अनुमानित किया जा सकता है

एक विशिष्ट समय पर कोणीय विस्थापन के साथ सन्निकटन किया जा सकता है:

यहाँ छवि विवरण दर्ज करें

यह एक छोटे से अधिकतम θ के लिए सबसे सटीक है, लेकिन संभवतः आपके उद्देश्यों के लिए पर्याप्त सटीक होगा। एक फ़ंक्शन बनाएं जो वर्तमान समय लेता है, और उस कोण को आउटपुट करता है जिसके लिए आपका पेंडुलम घुमाया जाना चाहिए, और उस राशि पर अपने स्प्राइट को घुमाएं।


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
समय समीकरण में गायब है।
माईक सेमर

@MaikSemder: समय की इकाई को एनीमेशन चक्र के रूप में परिभाषित किया गया है, जो भी है। कोई इसे किसी अन्य तरीके से क्यों करेगा?
पीटर जार्जेंस

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

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

2
अच्छा :) वेग को "डेल्टा" के साथ गुणा किया जाना चाहिए, ताकि वेग से "विस्थापन" प्राप्त हो सके, इसलिए इसे "x" में जोड़ा जा सकता है,
अपवित्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.