新作「あそぶつり」の経緯 その3
2008年4月あたりに物理エンジンを触り始めたものの、 そこから仕事が忙しくなって、 次にちゃんと研究が始められたのが夏休み。2008年8月。
最初、物理エンジンにあらかじめ用意されている処理で 「物体に力を与える処理」と 「物体に速度を設定する処理」の違いがわからなかった。 どちらを使っても物体が移動するからだ。
ここで質量の概念を理解しなければいけなかった。 ここまで物理を意識にするのは高校以来。
質量は重さと混同しやすいが、 重さというものは重力があってこその話。 重いボウリングの玉と軽いサッカーボールでは 同じような大きさでも重さが異なる。 しかし、無重力に持っていけば両方とも0kgである。
では無重力の中ではボウリングの玉もサッカーボールも 同じ動きをするかというと、 やはりボウリングの玉を動かす方が力が必要になるわけだ。 質量が大きいものは動かしにくく、 また、動いている物体は質量が大きい方が 強い力を持っていることになる。
さて、物理エンジンの「物体に速度を設定する処理」を使って 物体の移動速度を時速100km/hに設定すれば どれだけ質量の大きい物体でも小さい物体でも 次の瞬間に100km/hになっている。
しかし「物体に力を与える処理」を使って 物体に100の力を加えた場合、 質量が大きくて動かしにくい物体はそれほど速度が上がらず、 質量の小さい物体は一気に加速する。ここに違いがある。
ゲーム中で重い砲弾も軽い砲弾も同じ軌道で飛ばしたければ 力を加える処理ではなく 速度を設定する処理を使わなければいけない。 力を加える処理を使ってしまうと重い砲弾がほとんど飛ばなくなるし、 重い砲弾を軽い砲弾と同じように飛ばすために 与える力をどれぐらい増やせばいいのか調整しにくいからだ。
しかし、ゲーム中に風が吹いて物体が吹き飛ばされるような処理では 速度を設定する処理ではなく力を与える処理を使う。 速度を設定する処理を使うと軽い物も重い物も まったく同じ速さで吹き飛ばされて不自然だからだ。
この違いがわかったとき、 なぜ2つの処理が用意されているかがスパッと理解できた。 (物体の回転に関しても 「角速度」と「トルク」と呼ばれる同様の違いがある)
このあたりを踏まえつつ、いろいろな実験を踏まえて 作った物理エンジンのプログラムが以下の動画(初公開)。
ある一点から一定の距離内にいる物体に対して ある瞬間に中心から外向きの力を与えると 爆発させたように見せられる。
同じ理屈を使って一定方向に継続的に弱い力を与え続けると 風が吹いたように見せられる。
銃口の位置から発射した直線に最も近くで当たった物体に 当たった位置を基点として力を与えると 銃弾に当たって弾いたように見せられる。
同じ理屈で画面中央の照準にどの物体が合わさっているか算出し、 その物体に対して自機の方向へ力を与えると 物体を吸い寄せているように見せられる。 (Xbox360の「バイオショック」に影響を受けた)
そういった様々な表現を実験した。
物理エンジンの物理世界の状態を一時保存し、 物体が崩れ落ちる直前にリセットする処理も作った。 これで物理世界の状態をファイルにセーブ・ロードできるようになった。
エディット機能も作った。 物理エンジンの世界を一時的に停止して、 マウスで狙ったところに自由に物体を置けるようになった。
夏休み中の1ヶ月ほどでかなりの研究が進み、 いろいろなものが作れそうな予感がした。
が、ずっと気になっていた問題点があった。つづく。
|