内積はクランプしたほうがいい
結論
内積を関数の入力にする場合はクランプした方がいい。
理由
正規化済みの内積であっても、計算誤差によっては絶対値が1を超える場合があるのでクランプしたほうが良いです。
// a, bは正規化済みのベクトルとする Vector3 a, b; float dot = Vector3.Dot(a, b); float rad = Mathf.Acos(dot);
Mathf.Acos()は1より大きく、-1より小さい値が入力された場合はNaNを返すので、結果がNaNになる場合があります。
なので、Clampで-1から1の範囲にしたほうが良い。
// a, bは正規化済みのベクトルとする Vector3 a, b; float dot = Mathf.Clamp(Vector3.Dot(a, b), -1f, 1f); float rad = Mathf.Acos(dot);
なんかNaNになるなと思ったら、こんなところで引っかかってましたとさ。