public static float FaceAngle(Transform T1, Vector3 where, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { float dot = FaceDot(T1, where, withoutAxis); float angle = DotToAngle(dot); return(angle); }
public static float FaceDot(Transform T1, Vector3 where, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { Vector3 pos = where - T1.position; SetVector3WithoutAxis(ref pos, withoutAxis); Vector3 forward = T1.forward.normalized; SetVector3WithoutAxis(ref forward, withoutAxis); float dot = Vector3.Dot(forward, pos.normalized); return(dot); }
/// <summary> /// 设置vector3的一个轴的值为defaultValue(默认为0) /// </summary> /// <param name="v"></param> /// <param name="axis"></param> /// <param name="defaultValue"></param> public static void SetVector3WithoutAxis(ref Vector3 v, PBEnums.Axis axis, float defaultValue = 0) { switch (axis) { case PBEnums.Axis.X: v.Set(defaultValue, v.y, v.z); break; case PBEnums.Axis.Y: v.Set(v.x, defaultValue, v.z); break; case PBEnums.Axis.Z: v.Set(v.x, v.y, defaultValue); break; } }
/// <summary> /// obj2处于obj面向的点积 /// </summary> /// <param name="T1"></param> /// <param name="T2"></param> /// <returns></returns> public static float FaceDot(Transform T1, Transform T2, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { return(FaceDot(T1, T2.position, withoutAxis)); }
/// <summary> /// 面对面 /// </summary> /// <param name="T1"></param> /// <param name="T1DegreesDelta"></param> /// <param name="T2"></param> /// <param name="T2DegreesDelta"></param> /// <param name="withoutAxis"></param> /// <returns></returns> public static bool FaceToFaceWithSpeed(Transform T1, float T1DegreesDelta, Transform T2, float T2DegreesDelta, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { bool a = FaceToTargetWithSpeed(T1, T2.position, T1DegreesDelta, withoutAxis); bool b = FaceToTargetWithSpeed(T2, T1.position, T2DegreesDelta, withoutAxis); return(a && b); }
/// <summary> /// 面对面 /// </summary> /// <param name="T1"></param> /// <param name="T1FormRotation"></param> /// <param name="T2"></param> /// <param name="T2FormRotation"></param> /// <param name="interpolate"></param> /// <param name="lerpType"></param> /// <param name="withoutAxis"></param> /// <returns></returns> public static bool FaceToFace(Transform T1, Quaternion T1FormRotation, Transform T2, Quaternion T2FormRotation, float interpolate = 1, PBEnums.LerpType lerpType = PBEnums.LerpType.Lerp, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { bool a = FaceToTarget(T1, T1FormRotation, T2.position, interpolate, lerpType, withoutAxis); bool b = FaceToTarget(T2, T2FormRotation, T1.position, interpolate, lerpType, withoutAxis); return(a && b); }
/// <summary> /// 以一定距离面向target /// </summary> /// <param name="transform"></param> /// <param name="toTarget"></param> /// <param name="degreesDelta"></param> /// <param name="withoutAxis"></param> /// <returns></returns> public static bool FaceToTargetWithSpeed(Transform transform, Vector3 toTarget, float degreesDelta, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { Vector3 face = toTarget - transform.position; SetVector3WithoutAxis(ref face, withoutAxis, 0); Quaternion toRotation = Quaternion.LookRotation(face); transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, degreesDelta); if (Quaternion.Angle(transform.rotation, toRotation) <= 0.1) { transform.rotation = toRotation; return(true); } else { return(false); } }
/// <summary> /// 使transform面向target /// </summary> /// <param name="transform">旋转对象</param> /// <param name="formRotation">初始rotation</param> /// <param name="toTarget">面向的位置</param> /// <param name="interpolate">插值[0-1]</param> /// <param name="lerpType">插值类型</param> /// <param name="withoutAxis"></param> /// <returns></returns> public static bool FaceToTarget(Transform transform, Quaternion formRotation, Vector3 toTarget, float interpolate = 1, PBEnums.LerpType lerpType = PBEnums.LerpType.Lerp, PBEnums.Axis withoutAxis = PBEnums.Axis.None) { Vector3 face = toTarget - transform.position; SetVector3WithoutAxis(ref face, withoutAxis, 0); Quaternion toRotation = Quaternion.LookRotation(face); if (interpolate > 1) { interpolate = 1; } switch (lerpType) { case PBEnums.LerpType.Lerp: transform.rotation = Quaternion.Lerp(formRotation, toRotation, interpolate); break; case PBEnums.LerpType.Slerp: transform.rotation = Quaternion.Slerp(formRotation, toRotation, interpolate); break; } if (interpolate == 1) { return(true); } else { return(false); } }