神様は有休消化中です。

Unity関連の技術ネタを書いてます。

【Unity5】Vector3.DotとMathf.Acosの組み合わせでNan発生

Vector3.Dotで取得したラジアン値をMathf.Acosに突っ込んだところNanが発生することがあったので共有。
以下のようなソースで出ました。

Vector3 a = (end - start).normalize;
Vector3 b = hoge.transform.rotation * Vector3.forward;

float rad = Vector3.Dot(a, b); // a, bともにmagnitude=1のはず。
float result = Mathf.Acos(rad); // Nan発生

Mathf.Acosは-1〜1までの値しか与えられず、引数が範囲外になるとNanを返します。
しかし、上記例ではa, bともに正規化されているのでDotの戻り値は-1〜1のはず・・・
条件としては、a, b間のなす角が非常に小さい場合に出てました。
bの回転処理で若干の計算誤差が出て、長さが微妙に大きくなっちゃってる?うーん、わからん。

仕方ないので以下で解決しました。

Vector3 a = (end - start).normalize;
Vector3 b = hoge.transform,rotation * Vector3.forward;

float rad = Vector3.Dot(a, b);
float d = Mathf.Clamp(rad, -1.0f, 1.0f); // 追加
float result = Mathf.Acos(d);