【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);