マリオのジャンプ実装法とVerlet積分

(追記)JavaScriptで実装してみました
昔、何かの雑誌*1でマリオのジャンプの実装法を見た覚えがあって、あの放物線運動は、
マリオの速度ベクトルを保存しておいて座標を計算するんじゃなくて、
マリオの前回の座標を保存しておいて座標を計算しているんだそうです。

y_temp = Mario.y;
Mario.y += (Mario.y - Mario.y_prev) + F;
Mario.y_prev = y_temp;

Fはその瞬間の力で、ジャンプの瞬間はF=10にして、空中ではF=-1にします。
するとこんな放物線になります。
[0,10,19, 27, 34, 40, 45, 49, 52, 54, 55, 55, 54, 52, 49, 45, 40, 34, 27, 19, 10, 0]

加減算しか使わないので、非常に高速にできたと。

これがVerlet積分に似ているなと思ったのが今日の本題。

次に、オイラー法を作ったつもりが実はシンプレクティックになっているで有名な Verletを使ってみた。見た目オイラー法なので実装はすっごい楽である。
(中略)
Verletはプログラム楽だわ、エネルギー保存するわ、計算時間半分だわで RK(ルンゲ=クッタ)いいとこ無しという感じである。
引用元

Cowboy Programming » Blob Physicsにある話なんですが、
Verletだと座標だけで話が完結するので、壁にめりこんじゃいけないといった制約条件の記述がすごく楽。
普通だと、速度から未来の座標を計算するわけですが、そこで壁にめりこまないように"速度を調整する"のは、面倒なんです。

マリオもジャンプすれば壁に当たるので、このテクニックを使ってたんじゃないかな。

*1:bit誌1997年"アーケードゲームのテクノロジ"だったかな。情報求む

グラフの可視化に挑戦

Canvas要素を使っているので、Firefoxで見てください。

参考文献は、(PDF)Thomas M. J. Fruchterman, Edward M. Reingold: Graph Drawing by Force-directed Placement (1991)

  • ランダムな配置から、徐々にほどけて、きれいなレイアウトになる様子が面白いです。
  • とても実装が簡単なので、高校生か中学生でも書けると思います。
  • ここでもVerlet積分を使っています。おかげで壁の判定がすごく楽でした。 ただ、いつまで経ってもブルブル震えるのはよくないな。
  • mixiGraphは何を使っているんだろう。

こんなに簡単なグラフの可視化

  • dは、2つの頂点間の描画上の距離。
  • kは、適当に実験して決める。(描画エリアの大きさや頂点の数やグラフの複雑度に左右されるので、これといった計算方法がない。)

http://eva-lu-ator.net/~gemma/geocities/jsgraph/fa.gif(グラフの辺をバネであると考えます)
http://eva-lu-ator.net/~gemma/geocities/jsgraph/fr.gif(電子同士の反発に似ています)

  • これだけです!