振り子を振る方法を教えてください。


9

おもりをつけて、振り子のように前後に揺れるロープをシミュレートしたい。実際の物理学は過剰です。同じ動きを延々と繰り返すだけです。

jQueryは、私が探しているものに似た「スイング」の容易さを備えています。それはどのように機能しますか?

である角度から別の角度に回転することを考えてMath.easeOutExpoいましたが、実際の振り子は別の方法で緩和されます...


2
振り子の角速度にサインカーブフィードを送り、ゼロ点がピークにあり、最高速度の値が下になるようにします。
Shotgun Ninja

回答:


10

まあ、あなたは少し物理学を使用する必要がありますが、物理学をシミュレートする必要はありません。振り子の回転を設定するために簡単に使用できる振り子の動きの式があります。小さなスイングの場合、モーションは単純な調和モーションで近似できます。

特定の時間における角変位は、次のように概算できます。

ここに画像の説明を入力してください

これは、小さな最大θの場合に最も正確ですが、目的に対して十分正確である可能性があります。現在の時間を取り、振り子を回転させる角度を出力する関数を作成し、その量だけスプライトを回転させます。


4

これは、直接的なGrade 11 Trig and Physicsから導出された非トリガー計算です。これは、原点が振り子ボブのサスペンションの最低点であり、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 2013

@MaikSemder:時間の単位は、何であれ、アニメーションサイクルとして定義されます。なぜ他の方法でそれを行うのですか?
Pieter Geerkens 2013

現在、加速度の統合では1ユニットの暗黙の時間が使用されています。ゲームの時間単位が秒の場合、1秒あたりのシミュレーションフレームは1つだけです。時間を明示的にプラグインするだけで、その問題を解消できます。時間はすでにそこにあります、それを明確にしてください。たとえば、フレーム時間は変動しますが、フレーム時間に関係なく、また異なるプラットフォーム間でも、アニメーションの安定した一定の速度が必要です。または、スローモ効果が必要な理由はたくさんあります。
Maik Semder 2013

1
それが私のポイントでした、gは外部または「ゲーム」から来ています。これで時間単位ができました。現在のデルタtは、その時間単位の1です。あなたのゲームには経過時間の独自の「アイデア」があるため、リアルタイムシミュレーションにはあまり便利ではありません。暗黙的な定数ではなく明示的なパラメーターにすることで、ゲームでの回答が役立ちます。
Maik Semder 2013

2
ニース:)速度から「変位」を得るには、速度にも「deltaT」を掛ける必要があるため、「x」に追加して賛成することができます
Maik Semder
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.