【enchant.js】Hello Physical World vol.6【box2d】
もう7月終りだよ! ということで久々のブログ更新であります。
ここのところ、仕事とコミケの同時進行でニッチもサッチも行かなくなっていましたが、ようやっと落ち着いて来ました。……たぶん。
さてさて。6回めを数える「Hello Physical World」では、applyForce について取り上げたいと思います。
前回が applyImpulse だったので、流れ的にも「applyForce だな~」と思っていたのですが、ここ最近「applyForce」での検索結果でアクセスしてくる人も多いようだったので、box2d.enchant.js だけじゃなく、本家 box2dweb の方もいぢってみました。
さて。恒例のリファレンス確認です。
applyForce(force) 継続的な力を加える Parameters: {b2Vec2} force 加える力のベクトル
継続的な力を加える――つまり、force で与えられたベクトルをオブジェクトに加え続けるということですね。サンプルプログラムを組んでみましょう。
applyImpulse との違いはこんな感じです。
同じ力を加えているのに、何故 applyForce と applyImpulse は初動が違うのでしょうか。先日入手した「Box2Dで始める物理シミュレーション入門 ~JavaScript編~」*1にその答えが載っていました。
……物体が持っている移動速度や角速度は、「Step」関数でのシミュレーション内で、物体同士の衝突や重力などの影響を考慮した上での合力となり、物体の移動速度に影響を与えます。その一方で物体に対する衝撃は、物体同士の衝突や重力などの影響を考慮する前に、移動速度に作用します。
つまり、applyForce は重力や摩擦、対象となるオブジェクトの重量などを考慮した結果が反映されるのに対し、applyImpulse は純粋に与えられたベクトルだけが考慮されるということですね。
さて。
ここでひとつ舵を切って、box2dweb の方に視線を向けてみましょう。
box2d.enchant.js のラップ元である box2dweb にも、当然 applyForce と applyImpulse が存在します*2。しかしながら、applyForce の挙動が box2d.enchant.js のそれと違うのです! ちょっとサンプルを見てみましょう。
お分かりでしょうか。box2d.enchant.js の applyForce とは異なり、オブジェクトが加速してゆくようなことはありません。applyImpulse と同様、力が加えられるのは一瞬で、あとは重力など他の力に引きづられます。
なぜ挙動が違うのか。正直、まったくわかりません。box2d.enchant.js の中を読んでみると、単に applyForce を叩いているだけなんですけどねぇ……。