先看代码。
/// <summary>
/// Handles smaller values better than Unity's version.
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <returns></returns>
public static Quaternion FromToRotation(Vector3 u, Vector3 v)
{
float lTheta = Vector3.Dot(u.normalized, v.normalized);
if (lTheta >= 1f)
{
return Quaternion.identity;
}
else if (lTheta <= -1f) // 180度反向,没办法和v确定一个平面求法线 sin180 = 0
{
Vector3 lSimpleAxis = Vector3.Cross(u, Vector3.right); // 不需要u.normalized 因为需要的只是一个旋转轴的方向而已
if (lSimpleAxis.sqrMagnitude == 0f) { lSimpleAxis = Vector3.Cross(u, Vector3.up); }
return Quaternion.AngleAxis(180f, lSimpleAxis);
}
float lRadians = Mathf.Acos(lTheta); // 返回值是弧度
Vector3 lAxis = Vector3.Cross(u, v); // 叉乘左手坐标系判断一下,可以保证正值的角度一定是让u旋转到v的
return Quaternion.AngleAxis(lRadians * Mathf.Rad2Deg, lAxis);
}
先判断平行的两种可能,平行没判断叉乘出垂直轴来。
之后叉乘出垂直轴利用Quaternion的AngleAxis方法求出一个旋转返回。
@ 关注。