物体转向,在unity也比较常用。最近在使用时发现有点生疏了。在这里复习复习。
//求旋转的角度:
//方法一:这种方式简单,但返回值在[0,180]
Vector3 targetDir =target.postion- transform.posrion;
float angle=Vector3.Angle(targetDir ,transform.forward);
//方法二:这种不建议使用,但返回值在[0,180]
Vector3 targetDir =target.postion - transform.posrion;
Quaternion rotation=Quaternion.LookRotation(targetDir)
transform.Rotation=rotation;
//方法三:这种不建议使用,但返回值在[0,180]
Vector3 targetDir =target.postion - transform.posrion;
float angle= Mathf.Acos(Vector3.Dot(transform.forward, targetDir )) * Mathf.Rad2Deg;
transform.localEulerAngles = new Vector3(0, curentRationA + angle, 0);
//方法四:这种时在游览论坛时发现的,可以返回[-180,180]
/// <summary>
/// Determine the signed angle between two vectors, with normal 'n'
/// as the rotation axis.
/// </summary>
public static float AngleSigned(Vector3 v1, Vector3 v2, Vector3 n)
{
return Mathf.Atan2(
Vector3.Dot(n, Vector3.Cross(v1, v2)),
Vector3.Dot(v1, v2)) * Mathf.Rad2Deg;
}
//方法五:可以返回[-180,180]
private void GetAngleB()
{
Vector3 targetDir = target.position - transform.position;
//lhs rhs
// float angle = Vector3.Angle(targetDir, transform.forward);
Vector3 velocity = Quaternion.Inverse(transform.rotation) * targetDir; //对目标向量进行反向旋转,得到的新向量与z轴的夹角即为目标向量与当前物体方向的夹角
float angle = Mathf.Atan2(velocity.x, velocity.z) * Mathf.Rad2Deg; //返回tan值为x/z的角的弧度,再转化为度数。
print("角度B:" + angle);
}
网友评论