public static void Solve(Transform bone1, Transform bone2, Transform bone3, Vector3 targetPosition, Vector3 bendNormal, float weight) { if (weight <= 0f) { return; } targetPosition = Vector3.Lerp(bone3.position, targetPosition, weight); Vector3 vector = targetPosition - bone1.position; float magnitude = vector.magnitude; if (magnitude == 0f) { return; } float sqrMagnitude = (bone2.position - bone1.position).sqrMagnitude; float sqrMagnitude2 = (bone3.position - bone2.position).sqrMagnitude; Vector3 bendDirection = Vector3.Cross(vector, bendNormal); Vector3 directionToBendPoint = IKSolverTrigonometric.GetDirectionToBendPoint(vector, magnitude, bendDirection, sqrMagnitude, sqrMagnitude2); Quaternion quaternion = Quaternion.FromToRotation(bone2.position - bone1.position, directionToBendPoint); if (weight < 1f) { quaternion = Quaternion.Lerp(Quaternion.identity, quaternion, weight); } bone1.rotation = quaternion * bone1.rotation; Quaternion quaternion2 = Quaternion.FromToRotation(bone3.position - bone2.position, targetPosition - bone2.position); if (weight < 1f) { quaternion2 = Quaternion.Lerp(Quaternion.identity, quaternion2, weight); } bone2.rotation = quaternion2 * bone2.rotation; }
/* * Draws the scene view helpers for IKSolverTrigonometric * */ public static void AddScene(IKSolverTrigonometric solver, Color color, bool modifiable) { if (!solver.IsValid(true)) { return; } if (Application.isPlaying && !solver.initiated) { return; } Handles.color = color; GUI.color = color; Vector3 bendPosition = solver.bone2.transform.position; Vector3 endPosition = solver.bone3.transform.position; // Chain lines Handles.DrawLine(solver.bone1.transform.position, bendPosition); Handles.DrawLine(bendPosition, endPosition); // Joints Handles.SphereCap(0, solver.bone1.transform.position, Quaternion.identity, jointSize); Handles.SphereCap(0, bendPosition, Quaternion.identity, jointSize); Handles.SphereCap(0, endPosition, Quaternion.identity, jointSize); if (Application.isPlaying && (solver.IKPositionWeight > 0 || solver.IKRotationWeight > 0)) { if (modifiable) { Handles.CubeCap(0, solver.IKPosition, solver.IKRotation, selectedSize); // Manipulating position and rotation switch (Tools.current) { case Tool.Move: solver.IKPosition = Handles.PositionHandle(solver.IKPosition, Quaternion.identity); break; case Tool.Rotate: solver.IKRotation = Handles.RotationHandle(solver.IKRotation, solver.IKPosition); break; } } // Target Handles.color = new Color(color.r, color.g, color.b, color.a * Mathf.Max(solver.IKPositionWeight, solver.IKRotationWeight)); Handles.DrawLine(endPosition, solver.IKPosition); } Handles.color = Color.white; GUI.color = Color.white; }
/* * Draws the scene view helpers for IKSolverTrigonometric * */ public static void AddScene(IKSolverTrigonometric solver, Color color, bool modifiable) { if (!solver.IsValid(false)) return; if (Application.isPlaying && !solver.initiated) return; //float length = Vector3.Distance(solver.bone1.transform.position, solver.bone2.transform.position) + Vector3.Distance(solver.bone2.transform.position, solver.bone3.transform.position); //float size = length * 0.05f; Handles.color = color; GUI.color = color; Vector3 bendPosition = solver.bone2.transform.position; Vector3 endPosition = solver.bone3.transform.position; // Chain lines Handles.DrawLine(solver.bone1.transform.position, bendPosition); Handles.DrawLine(bendPosition, endPosition); // Joints Handles.SphereCap(0, solver.bone1.transform.position, Quaternion.identity, GetHandleSize(solver.bone1.transform.position)); Handles.SphereCap(0, bendPosition, Quaternion.identity, GetHandleSize(bendPosition)); Handles.SphereCap(0, endPosition, Quaternion.identity, GetHandleSize(endPosition)); if (Application.isPlaying && (solver.IKPositionWeight > 0 || solver.IKRotationWeight > 0)) { if (modifiable) { Handles.CubeCap(0, solver.IKPosition, solver.IKRotation, GetHandleSize(solver.IKPosition)); // Manipulating position and rotation switch(Tools.current) { case Tool.Move: if (solver.target == null) solver.IKPosition = Handles.PositionHandle(solver.IKPosition, Quaternion.identity); break; case Tool.Rotate: if (solver.target == null) solver.IKRotation = Handles.RotationHandle(solver.IKRotation, solver.IKPosition); break; } } // Target Handles.color = new Color(color.r, color.g, color.b, color.a * Mathf.Max(solver.IKPositionWeight, solver.IKRotationWeight)); Handles.DrawLine(endPosition, solver.IKPosition); } Handles.color = Color.white; GUI.color = Color.white; }
public override void Execute() { var ik = EntityView.GetComponent<TrigonometricIK>(); Solver = ik.solver; }
/* * Draws the scene view helpers for IKSolverTrigonometric * */ public static void AddScene(IKSolverTrigonometric solver, Color color, bool modifiable) { if (Application.isPlaying && !solver.initiated) { return; } if (!Application.isPlaying && !solver.IsValid()) { return; } //float length = Vector3.Distance(solver.bone1.transform.position, solver.bone2.transform.position) + Vector3.Distance(solver.bone2.transform.position, solver.bone3.transform.position); //float size = length * 0.05f; Handles.color = color; GUI.color = color; Vector3 bendPosition = solver.bone2.transform.position; Vector3 endPosition = solver.bone3.transform.position; // Chain lines Handles.DrawLine(solver.bone1.transform.position, bendPosition); Handles.DrawLine(bendPosition, endPosition); // Joints Handles.SphereHandleCap(0, solver.bone1.transform.position, Quaternion.identity, GetHandleSize(solver.bone1.transform.position), EventType.Repaint); Handles.SphereHandleCap(0, bendPosition, Quaternion.identity, GetHandleSize(bendPosition), EventType.Repaint); Handles.SphereHandleCap(0, endPosition, Quaternion.identity, GetHandleSize(endPosition), EventType.Repaint); if (Application.isPlaying && (solver.IKPositionWeight > 0 || solver.IKRotationWeight > 0)) { if (modifiable) { Handles.CubeHandleCap(0, solver.IKPosition, solver.IKRotation, GetHandleSize(solver.IKPosition), EventType.Repaint); // Manipulating position and rotation switch (Tools.current) { case Tool.Move: if (solver.target == null) { solver.IKPosition = Handles.PositionHandle(solver.IKPosition, Quaternion.identity); } break; case Tool.Rotate: if (solver.target == null) { solver.IKRotation = Handles.RotationHandle(solver.IKRotation, solver.IKPosition); } break; } } // Target Handles.color = new Color(color.r, color.g, color.b, color.a * Mathf.Max(solver.IKPositionWeight, solver.IKRotationWeight)); Handles.DrawLine(endPosition, solver.IKPosition); } Handles.color = Color.white; GUI.color = Color.white; }