« 私にとって銃は鈍器 | トップページ | 選択 »

2010年1月14日 (木)処理を減らすための数学(を使わない)

おはようございます。本日の当番、プログラマーのK.Yです。

前々回から引き続き処理軽減に関するお話になります。
しかし今までのようなプログラムの数学的な処理軽減ではなく、今回はデータの持ち方を変更することで同じような表現ができる例を紹介したいと思います。

お題は円運動です。
まずはプログラムを使った処理の紹介から。

図のような感じでオブジェクト(赤い丸)を円運動させる場合は以下のような三角関数を使う事で表現できます。

ある点0から半径rの距離にあるオブジェクトの、点0からの角度がθの時の座標 x , y

2010_0113_1

x = r * cos(θ)
y = r * sin(θ)


この式のθの値を変更していくことで赤い丸は円運動をします。

例えば太陽の周りを回る地球の様な天体を表現する時などは、このようにして座標を更新することで公転を表現できます。
さらにそのオブジェクト自体を回転させることで自転の表現もできます。

※正確には惑星や衛星の公転は楕円を描いていますが、
  ひとつの例としてここでは円で回転しているものとします。
  さらに分かりやすく2D座標系で話を進めます

次にその地球の周りを回っている月に目を向けてみましょう。
月は地球の周りを回っていますので、上の式と同じように回転させた座標を求めた後に地球の座標を足します。

月の座標         moon_x moon_y
地球から月までの距離 moon_r
月の回転角度      moon_θ

地球の座標        earth_x earth_y


moon_x = moon_r * cos( moon_θ) + earth_x
moon_y = moon_r * sin( moon_θ) + earth_y


これで月の座標も求めることができました。
この後、月自体を回転させて自転の表現も行ないます。
もちろんこのような処理で月の座標を移動させても問題はないと思います。
しかしせっかくですので、今回も処理軽減で何かできないかを考えてみましょう。

ここで、月は常に地球に対して同じ面を向けた状態で回っていることに注目します。
イメージとしてはひもにつながれた月が地球の周りを回っている感じです。
すなわち月を以下のようなオブジェクトにして、その中心点を地球の座標に合わせます。

2010_0113_2

そして、その中心点を回転させるだけでも上の座標計算と同じ様な表現が実現できるようになります。

今回の例では地球と月という天体での話で、しかも月が1つしかない状態での処理ですので、そこまで処理軽減の効果は出ないと思います。
しかし、例えば木星や土星のように数十個もの衛星を持つ天体の軌道を表現する際には処理軽減の効果はありそうです。
「ガリレオ衛星は大きいので自転の表現も必要だ」という事であれば、それ以外の衛星にだけこの処理をするなどの対応もありでしょう。

今回は天体を例にあげましたが、それだけではなくゲームの中でも仕様によってはオブジェクトの周りをたくさんの別オブジェクトやエフェクトなどがクルクル回る表現をする際などにも有効になるのではないでしょうか。

このようにプログラムの処理だけではなくデータの構造を少し変えるだけでも処理軽減ができる様な個所は色々とあると思います。
まだまだ軽くできるところはないか、現状の処理で満足せずにさらなる軽減処理を探していってみましょう。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2010/01/post-3a30.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 私にとって銃は鈍器 | トップページ | 選択 »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 処理を減らすための数学(を使わない):

« 私にとって銃は鈍器 | トップページ | 選択 »