Unity的角度计算是否有不准确的地方

Is there a inaccuracy in the angle calculation of Unity

我在 Unity 中使用函数

Quaternion.LookRotation(normal, (0,1,0));

您可以在此处找到文档 https://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html。 如果法线平行于 y 轴,这应该是个问题。 由于无法创建函数创建的坐标系,因此生成的四元数的 Orientation 围绕 y 轴旋转 所以我尝试使用

来涵盖这种边缘情况
if(Vector3.Angle(normal, new Vector3(0, 1, 0)==0) ||Vector3.Angle(normal, new Vector3(0, 1, 0)==180)  )

调试后我意识到问题出现在 170 到 180 之间的每个 Vector3.Angle(normal, new Vector3(0, 1, 0)。我需要得到一个非常精确的方向,所以我的问题您是否知道为什么会出现这种不准确以及如何正确处理。 谢谢!

float t = Mathf.Abs(Vector3.Dot(normal.normalized,Vector3.up));
Quaternion a = Quaternion.LookRotation( normal , Vector3.up );
Quaternion b = Quaternion.LookRotation( Vector3.up , -Vector3.forward );

Quaternion rot = t<0.99f ? a : b;

此处 0.99 将转换为 0.9 度的硬阈值 (1-0.99)*90deg

尝试在它们之间平滑插值:

Quaternion rot = Quaternion.Slerp( a , b , Mathf.Pow(t,10) );