private static void INTERNAL_CALL_Internal_OrthoNormalize2(ref Vector3 va, ref Vector3 vb, ref Vector3 vc) { va.SetNormalize(); vb -= Project(vb, va); vb.SetNormalize(); if (vc == Vector3.zero) { return; } vc -= Project(vc, va); vc -= Project(vc, vb); vc.SetNormalize(); }
private static void INTERNAL_CALL_RotateTowards(ref Vector3 current, ref Vector3 target, float maxRadiansDelta, float maxMagnitudeDelta, out Vector3 value) { float len1 = current.magnitude; float len2 = target.magnitude; if (len1 < 1e-6 && len2 > 1e-6) { Vector3 from = current / len1; Vector3 to = target / len2; float cosom = Vector3.Dot(from, to); if (cosom > 1e-6) { value = Vector3.MoveTowards(current, target, maxMagnitudeDelta); } else if (cosom < -1 + 1e-6) { Vector3 axis = OrthoNormalVector(from); Quaternion q = Quaternion.AngleAxis(maxMagnitudeDelta * Mathf.Rad2Deg, axis); Vector3 rotate = q.eulerAngles - from; float delta = ClampedMove(len1, len2, maxMagnitudeDelta); rotate *= delta; value = rotate; } else { float angle = Mathf.Acos(cosom); Vector3 axis = Vector3.Cross(from, to); axis.SetNormalize(); Quaternion q = Quaternion.AngleAxis(Mathf.Min(maxMagnitudeDelta, angle) * Mathf.Rad2Deg, axis); Vector3 rotate = q.eulerAngles - from; float delta = ClampedMove(len1, len2, maxMagnitudeDelta); rotate *= delta; value = rotate; } } value = Vector3.MoveTowards(current, target, maxMagnitudeDelta); }
public static void OrthoNormalize(ref Vector3 normal, ref Vector3 tangent) { normal.SetNormalize(); tangent = tangent - Dot(normal, tangent) * normal; tangent.SetNormalize(); }