2010年3月25日 (木)処理を減らすための数学4
おはようございます。本日の当番、プログラマーのK.Yです。
今回は【処理を減らすための数学2】で紹介した話の中に出てきたアークタンジェントをもう少し掘り下げてみたいと思います。
まずはアークタンジェント関数とはどういったものか、次にその関数はゲーム内ではどのような場面で使われているのかの紹介をしたいと思います。
アークタンジェントとは逆正接とも呼ばれ、タンジェント(正接)の逆関数になります。
プログラムでも同じように tan 関数とその逆関数の atan atan2 関数があります。
atan と atan2 の違いは、引数に y/x のような割合を使うか、x y の2つの値を使うのかの違いになります。
今回は話がわかりやすいように引数に x y を使う atan2 関数を扱います。
タンジェント関数は角度を代入することで図Aでいうところの赤線の長さが分かります。
逆にアークタンジェント関数は、同じく図Aの青線と緑線の長さから角度を求めることができます。
数学的にはタンジェント・アークタンジェントはこのような働きをする関数です。
しかしこの説明だけではあまり面白くありませんので、ここからは実際にゲーム内で使いそうな場面を例に挙げながら atan2 関数の話を進めていきます。
以前(処理を減らすための数学2)あげた例では、プレイヤーがオブジェクトを探す際に視野角の範囲内にそのオブジェクトがいるかどうかの判定をするのにアークタンジェントを使っていました。
今回はオブジェクトがプレイヤーの方向を向くときの処理を考えてみます。
図Bのようにフィールド上にオブジェクトとプレイヤーが存在している時を考えてみましょう。
この時それぞれの座標の差から両者がどのくらい離れているかのベクトルが取得できます。
プレイヤーの座標 ( px py )
オブジェクトの座標 ( ox oy )
両者の差ベクトル
vx = px - ox
vy = py - oy
ここで atan2 関数に vx vy を渡すとそのオブジェクトからプレイヤーの角度を求めることができます。
そこで求めた角度分オブジェクトを回転させることで、そのオブジェクトがプレイヤーの方向へ向くようになります。
この処理でプレイヤーに攻撃を仕掛けるための敵オブジェクトや、プレイヤーに話しかけられた町の人をプレイヤーの方向に向かせたりすることができます。
このようにとても便利な atan2 関数ですが、この関数は処理負荷が結構大きいことが問題になってきます。
ここでの例ではひとつのオブジェクトに対しての処理を紹介しましたが、実際のゲームではプレイヤーを狙う敵オブジェクトが複数だったり、話しかける町の人以外にも近くの人はプレイヤーの方向を向いたりなど、この処理を行なうオブジェクトは複数存在しています。
オブジェクトひとつに対してならば問題のない処理も複数のオブジェクトにこの処理を行なうと処理落ちをしてしまうかも知れません。
というわけで、他の観点からどうしたら処理軽減が出来るのかを考えてみましょう。
ここからはゲームの仕様によってもやり方が変わってきますが例えば以下の方法などがあります。
○オブジェクトを順番に処理する
毎フレーム1オブジェクトだけこの処理を行なうのであればそこまで処理負荷は掛からないと思います。
しかし、同時に存在しているオブジェクトの数が膨大だった場合は1回処理した後の次の順番までかなり待つことになってしまいます。
ですので、オブジェクトの数によっては何体かずつ処理する必要も出てきそうです。
○オブジェクトの距離を見て処理する
プレイヤーに近いオブジェクトだけきっちりこの処理をする方法もあります。
プレイヤーの近くということはカメラの近くでもあるので画面に映っているオブジェクトの多くは違和感なく回転するようになります。
しかし、そんなプレイヤーに一斉にオブジェクトが集まってきたらやはり大変なことになってしまいます。
○atan2 関数を自作する
そもそも atan2 関数が重たいなら自作するのも一つの方法です。
ただ、これはゲームの仕様にもよりますが、その関数の精度が大きく関わってきます。
きっちり向かせたい場合は atan2 でもいいですし、ある程度の方向を向かせるのならこの自作関数を使うなど状況によって使い分ける必要も出てきそうです。
このような様々な方法を場面やオブジェクトの種類で組み合わせることによって処理軽減を行ないながら違和感なく表現できるようになるのではないでしょうか?
今回ここで紹介した以外でもまだまだ他にも処理軽減の方法はあると思います。
現状の処理で満足せずにさらなる軽減処理を探していってみましょう。
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント