えーとですね、別の方法も考えてみましょう。
まず、X軸正方向を0度として現在のミサイルのベクトルの角度Aと、自機へ向かうベクトルの角度Bを求めます。
角度C = 角度A - 角度B を計算します。
角度Cが正か負か、また角度Cの絶対値が180より小さいかどうかを基準にミサイルの方向修正する角度が正負どちらの方向か得ます。
画面座標上だと正が時計回り、負が反時計回りと鳴ります。
修正角度を角度D(ただし絶対値C<DならD=Cとする)とすると、
正方向なら、A = A + D
不法項なら、A = A - D
と、ミサイルの方向を修正します。
Dの値の大小で追尾性能が変ります。
この方法だと前の記事の方法のようにミサイルと自機の位置関係や向きによって追尾角度が変る事がありません。
ミサイルの後ろ側に自機がいたとしても同じペースで方向修正してきます。
数値上では一番理想的なアルゴリズムだと思います。
じゃあ、こっちでやりゃあ良いじゃんとなりそうでなりません。
問題は処理の重さです。
実装してみなければ実際に影響があるかどうかわかりませんが、この方法は一発のミサイルにつき1フレームに複数回ずつasin、acosの処理を必要とします。
複数のミサイルが飛びかう様を想像すると、いかにもやばそうです。
要はそれっぽく見えた上で誘導弾としての機能をちゃんと実現していれば、それが三角関数を駆使した理想的で高度な処理だろうと、単純なベクトルの合成による処理であろうと、遊ぶ人からしたらゲームが面白ければどうでも良いわけで。
無駄に高度で重い処理を多用するのは、ゲームプログラミングの方法論としては必ずしも正解ではないと思うんです。
速度無視で物理シミュレーションをするとかなら話は別ですが。
で、そんなことを考えた上で実装の方向を決めました。
弾道補正のは現在ベクトルと自機方向ベクトルの合成を使います。
で、グラフィック表示に必要なミサイルの向き(角度)のみasin、acosを使用して取得します。
いや、待てよ、三角関数使わないで出来ないか?
まず合成ベクトルを正規化(大きさ1にする)すれば、X成分の値がcosθってことになるでしょ。
で、あらかじめグラフィックの向きごとの角度の範囲を決めて移行点となる角度のcosの値をゲーム初期化部分で変数に入れておく。
変数の値とX成分の値を比較して向きを判断するんだけど、この情報だけだと0~180度と180~360度の範囲に2つ該当する角度が出てしまう。
そこで、Y成分の正負を判定しよう。
よし!これで現在の角度が厳密ではないけども8方向のどこかは確定できる!
うまくいけば、一発のミサイルにつき1フレーム当たり1回平方根の計算をするだけで実装できるかもしれない。
というわけで、実装方法決定案。
①ミサイルの方向補正は自機方向ベクトルとの合成で行う
②合成ベクトルを正規化(ここで平方根を1回使う)し向きを判定、グラフィックに反映する
③正規化したベクトルにミサイルの速度をかけて、それを新しいミサイルのベクトルとする
これで、うまく動かないようならもうちょっと高度なアルゴリズムを考えてみます(笑)。
じゃあ、ミサイルのドット絵でも描くか!
まず、X軸正方向を0度として現在のミサイルのベクトルの角度Aと、自機へ向かうベクトルの角度Bを求めます。
角度C = 角度A - 角度B を計算します。
角度Cが正か負か、また角度Cの絶対値が180より小さいかどうかを基準にミサイルの方向修正する角度が正負どちらの方向か得ます。
画面座標上だと正が時計回り、負が反時計回りと鳴ります。
修正角度を角度D(ただし絶対値C<DならD=Cとする)とすると、
正方向なら、A = A + D
不法項なら、A = A - D
と、ミサイルの方向を修正します。
Dの値の大小で追尾性能が変ります。
この方法だと前の記事の方法のようにミサイルと自機の位置関係や向きによって追尾角度が変る事がありません。
ミサイルの後ろ側に自機がいたとしても同じペースで方向修正してきます。
数値上では一番理想的なアルゴリズムだと思います。
じゃあ、こっちでやりゃあ良いじゃんとなりそうでなりません。
問題は処理の重さです。
実装してみなければ実際に影響があるかどうかわかりませんが、この方法は一発のミサイルにつき1フレームに複数回ずつasin、acosの処理を必要とします。
複数のミサイルが飛びかう様を想像すると、いかにもやばそうです。
要はそれっぽく見えた上で誘導弾としての機能をちゃんと実現していれば、それが三角関数を駆使した理想的で高度な処理だろうと、単純なベクトルの合成による処理であろうと、遊ぶ人からしたらゲームが面白ければどうでも良いわけで。
無駄に高度で重い処理を多用するのは、ゲームプログラミングの方法論としては必ずしも正解ではないと思うんです。
速度無視で物理シミュレーションをするとかなら話は別ですが。
で、そんなことを考えた上で実装の方向を決めました。
弾道補正のは現在ベクトルと自機方向ベクトルの合成を使います。
で、グラフィック表示に必要なミサイルの向き(角度)のみasin、acosを使用して取得します。
いや、待てよ、三角関数使わないで出来ないか?
まず合成ベクトルを正規化(大きさ1にする)すれば、X成分の値がcosθってことになるでしょ。
で、あらかじめグラフィックの向きごとの角度の範囲を決めて移行点となる角度のcosの値をゲーム初期化部分で変数に入れておく。
変数の値とX成分の値を比較して向きを判断するんだけど、この情報だけだと0~180度と180~360度の範囲に2つ該当する角度が出てしまう。
そこで、Y成分の正負を判定しよう。
よし!これで現在の角度が厳密ではないけども8方向のどこかは確定できる!
うまくいけば、一発のミサイルにつき1フレーム当たり1回平方根の計算をするだけで実装できるかもしれない。
というわけで、実装方法決定案。
①ミサイルの方向補正は自機方向ベクトルとの合成で行う
②合成ベクトルを正規化(ここで平方根を1回使う)し向きを判定、グラフィックに反映する
③正規化したベクトルにミサイルの速度をかけて、それを新しいミサイルのベクトルとする
これで、うまく動かないようならもうちょっと高度なアルゴリズムを考えてみます(笑)。
じゃあ、ミサイルのドット絵でも描くか!
PR
この記事にコメントする
- ABOUT
やってやれないことはないっ!たぶん・・・
- カレンダー
06 | 2025/07 | 08 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 最新コメント
[11/09 CALL MY NAME]
[11/09 erin]
[08/18 うずランド]
[07/11 うずランド]
[06/23 うずランド]
- プロフィール
HN:
Call my name
年齢:
51
性別:
男性
誕生日:
1974/05/22
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析