AIに対する考察その2
AIに対する考察その2
考察するソース
認識
■距離の感知に関してはふたつのアプローチがある
1.トリガーコリダーを利用する
2.Vector3.magnitudeを利用する
距離は (target.posision - _transform.position).magnitude によりベクトルから得られる
平方根の計算を避けたい場合 sqrMagnitude を使い比較する側の値も2乗にしておく
■方向の感知に関しては数種類のアプローチがある
1.Vector3.Dotで内積を使う
2.Vector3.Angleでオイラー角で調べる
内積では
black = Vector3.Dot( _transform.forward,(target1.position - _transform.position).normalized); if(black > 0.7f){print("!");}
により単位円の値を得られる。前方180°なら0以上、前方45°なら0.7以上の値で検出できる。1で真正面、-1で真後ろになる
ここで重要なのはこの角度の範囲を視覚化した際、無限に高さのある円錐形状をイメージしなければならない点である
この事は強く意識しておいた方がよい
本サイトの「ベクトルを考える」でも考えを確認できるので忘れたら参照する事
オイラー角から、この単位円の値を得るには以下のようにSin関数を利用すると良い(例:45度の場合)
public float degree = 45.0f; float fovRange = Mathf.Sin (Mathf.Deg2Rad * degree);
0.7071になる
<転載画像>
Vector3.Angleを利用する場合は、もっと単純だ
print (Vector3.Angle (Vector3.forward, new Vector3 (1, 0, 1)));
45と表示される。つまり返される値は「角度」のfloatの絶対値。
絶対値という点が重要で第一引数から左右どちらの角度にあるかは返された値では判断できない。つまり相対的な角度の状態を調べる際に利用する
Quaternion.Angleもあるのでtransform.rotation(Quaternion型)同士を引数として渡して角度を得る手もある
移動と回転
- 最終更新:2013-11-17 15:35:17