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) );
我在 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) );