Encounter Knot 800

タイトルとかけ離れたモチベーションで華麗(※注 決して早い訳ではない)な更新頻度を発揮するかもしれない趣味的ブログ?

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 |

ミサイルの誘導(3D)

DirectXを用いて3Dシューティングゲームを作っている。期間対進度が微妙な上サンプルソース丸写しな面が一杯というw

3Dでのミサイルの誘導がググったりしても見つからなかったので一応ここで記述しておく。
(アペルジオの検索能力が低いせいかもしれないが)

最初のうちは回転行列から(無理やり)ミサイルの今向いているワールド座標系での角度を算出し、敵とミサイルとのベクトルの差を使ってasin、acos、atan2あたりでミサイルの向くべきワールド座標系の角度を求め、大小比較でYawとPitchを(たまにRollも)変化させていたが、あまりに難解かつバグだらけだったので他の方法を模索、結果、
敵とミサイルとの差のベクトルをミサイルのローカル座標に適用してx,y,zの値の大小で、左右、上下、前後を判定した。

こんな感じ↓
D3DXMATRIX ac;//代入用
D3DXVECTOR3 Enemy;//敵のローカル座標での位置
D3DXQUATERNION qtr;//代入用
//ミサイルの回転行列からクォータニオンを抽出
D3DXQuaternionRotationMatrix(&qtr,ミサイルの回転行列のポインタ);
//クォータニオンから回転行列を生成
D3DXMatrixRotationQuaternion(&ac,&qtr);
//逆行列を計算(ローカル座標→ワールド座標な回転行列をワールド→ローカルな回転行列に)
D3DXMatrixInverse(&ac,NULL,&ac);

//敵とミサイルとの座標差をミサイルのローカル座標に変換
D3DXVec3TransformCoord(&Enemy,&vectr,&ac);

Enemyにミサイルのローカル座標での敵の位置が入るので、
Enemy.xの値でミサイルを右(x > 0)左(x < 0)(Y軸中心回転)に振り、
Enemy.yの値でミサイルを上(y > 0)下(y < 0)(X軸中心回転)させ、
Enemy.zの値でミサイルの前(z > 0)か後ろ(z < 0)にいるかが判定できます(たぶん)

もしかしたらつづりとか間違ってるかもしれないし、どこかから引用したかもしれない。
何せ一部はだいぶ前に編集して放っておいたソース……。
画像なくてわかりにくいですね……すみません

プログラム的なもの | コメント:2 |
<<東北旅行~その1 | HOME | お初>>

この記事のコメント

あっても分かんねぇよ!!…と突っ込んでみる。

まさか2回目から全力全開!でくるとは思わなかった。

威嚇射撃かと思ったらスターライトブレイカーが(・д・)


まぁ、面白いから良いが(・∀・)
2008-10-27 Mon 08:00 | URL | 詠人不知 [ 編集]
ホントはコメントも受け付けないように使用かと思ってた。
訂正情報がある可能性があったので一応つけてるんだけどね。
2008-10-27 Mon 23:01 | URL | アペルジオ [ 編集]

コメントの投稿















コメント非公開の場合はチェック

| HOME |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。