示例#1
0
 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();
 }
示例#2
0
        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);
        }
示例#3
0
 public static void OrthoNormalize(ref Vector3 normal, ref Vector3 tangent)
 {
     normal.SetNormalize();
     tangent = tangent - Dot(normal, tangent) * normal;
     tangent.SetNormalize();
 }