2009年8月 5日 (水)処理を減らすための数学3
おはようございます。本日の当番、プログラマーのK.Yです。
今回も前回・前々回に引き続き処理軽減の参考になりそうなお話です。
前々回は【一番近いオブジェクトを探す】
前回は【特定の範囲内にいるオブジェクトを探す】でした。
オブジェクトを探してばかりというのも面白くありませんので
そろそろ別の処理のお話しに行きたいと思います。
というわけで、今回のテーマは【自由落下処理】です。
自由落下処理というと、以下のような式や図を思い出す方も
多いのではないでしょうか。
速度 v で角度 θ の方向に飛び出した物体が、
時間 t 経過した時の座標 x y
(重力加速度を g とし、空気抵抗を考慮に入れない)
どのような場面で使用するかというと、
例えばオブジェクトが爆発した時にばらばらになったパーツを飛ばしたり
雨粒のようなものを地面に落としたり、打ったボールを飛ばしたりなどなど、
自由落下処理はゲーム中のいろいろな場面で登場します。
上の式をプログラムで記述するとこのような感じになります。
x = v * t * cosf( θ );
y = v * t * sinf( θ ) - ( 0.5f * g * t * t );
もちろん、このように式をそのままプログラムにしても
動き自体は問題ないと思います。
しかし、処理軽減という観点から見るとまだまだ修正が可能です。
まず、値が変化しないものは最初に変数に入れてしまいましょう。
ここで注目すべき値は、
速度 v
角度 θ
の2つです。
というわけで、この2つが関係している部分を処理の開始時に計算してしまいます。
static float move_x; // X方向移動分
static float move_y; // Y方向移動分
// 開始時に値を設定
move_x = v * cosf( θ );
move_y = v * sinf( θ );
後は以下のように、時間 t を代入して計算すれば一応座標を求める事ができます。
x = move_x * t
y = move_y * t - ( 0.5f * g * t * t );
これでもそれなりの処理軽減はできました。
しかし、せっかくなので別の観点からさらなる処理軽減を行なってみます。
上で紹介していた処理は常にスタート位置からの座標を計算しています。
ですので、次の処理はスタート座標からではなく
1個前の座標からの変化量を加える方法でやってみましょう。
それぞれの座標を代入する変数を用意します。
static float pos_x; // X座標
static float pos_y; // Y座標
例えばX座標は、常に move_x 分移動しているだけですので、
以下のように前の座標に移動分を加えれば新しい座標を取得できます。
pos_x = pos_x + move_x; --- (1)
Y座標は移動分 move_y とその時の加速度分 g * t で計算できます。
pos_y = pos_y + move_y - g * t; --- (2)
ここで重力代入用の変数を用いて、さらに計算を減らします。
static float gravity = 0.0f; // そのときの加速度
pos_y = pos_y + move_y - gravity; --- (3)
gravity = gravity + g; --- (4)
ここの(1)(3)(4)の3つの式を使う事で、
加算・減算だけで自由落下処理を表現できるようになりました。
ここですでにお気付きの方もいるかも知れませんが、厳密な値を所得しようとすると(2)の式辺りにもうひと手間加える必要があります。
しかし、ここの話を掘り下げていくと微分・積分のほうに話が向かっていってしまいますので今回はこのような紹介で留めておきます。
その検証・原因・対策・結果は、次回【処理を減らすための数学3・番外編】で紹介できればと思います。
要は自由落下のような等加速運動は、式(2)(3)(4)の要領で行なえば軽い処理で同じ様に表現ができるという事です。
もちろんゲームの仕様によってはスタート座標からの計算が必要であったり
重力加速度の値を調整したり、風が吹いているステージだったり
空気抵抗なども考慮に入れなければならなかったりと、
今回あげた例で全てが処理できるわけではありません。
しかし、このような軽減処理を積極的に入れる事で爆発時に飛んでいくパーツを1つ増やせたりエフェクトを少し細かくしたりできるようになり、結果ゲーム全体が少しずつ豪華になっていきます。
現状の処理で満足せずに、さらなる軽減処理を探していってみましょう。
・・・とうわけで、まだまだプログラムとにらめっこ中。
| 固定リンク | コメント (0) | トラックバック (0)
« ニクニクしいあいつ | トップページ | 熟睡 »
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント