public void UpdateAllTargetPositions(Point p) { IkPositions lhTemp = p.ReturnIK(AvatarIKGoal.LeftHand); if (lhTemp.target) { lhTargetPosition = lhTemp.target.position; } IkPositions rhTemp = p.ReturnIK(AvatarIKGoal.RightHand); if (rhTemp.target) { rhTargetPosition = rhTemp.target.position; } IkPositions lfTemp = p.ReturnIK(AvatarIKGoal.LeftFoot); if (lfTemp.target) { lfTargetPosition = lfTemp.target.position; } IkPositions rfTemp = p.ReturnIK(AvatarIKGoal.RightFoot); if (rfTemp.target) { rfTargetPosition = rfTemp.target.position; } }
void OnSceneGUI() { DrawWireCube t = target as DrawWireCube; if (t.IkPositionList.Count == 0) { t.IkPositionList = t.transform.GetComponent <Point>().iks; } for (int i = 0; i < t.IkPositionList.Count; i++) { IkPositions currentIK = t.IkPositionList[i]; if (currentIK.target != null) { // Default color, to be overwritten once determined IK part Color targetColor = Color.red; switch (currentIK.IK) { case AvatarIKGoal.LeftHand: targetColor = Color.cyan; break; case AvatarIKGoal.RightHand: targetColor = Color.yellow; break; case AvatarIKGoal.LeftFoot: targetColor = Color.magenta; break; case AvatarIKGoal.RightFoot: targetColor = Color.green; break; default: Debug.Log("Invalid IK component!"); break; } Handles.color = targetColor; Handles.CubeHandleCap(0, currentIK.target.position, currentIK.target.rotation, 0.05f, EventType.Repaint); if (currentIK.hint != null) { Handles.CubeHandleCap(0, currentIK.hint.position, currentIK.hint.rotation, 0.05f, EventType.Repaint); } } else { // Assign IKs to editor t.IkPositionList = t.transform.GetComponent <Point>().iks; } } }
void UpdateIK(AvatarIKGoal ik, IkPositions ikInfo, Transform ikHelper, float ikWeight, AvatarIKHint ikHint) { if (ikInfo != null) { anim.SetIKPositionWeight(ik, ikWeight); anim.SetIKRotationWeight(ik, ikWeight); anim.SetIKPosition(ik, ikHelper.position); anim.SetIKRotation(ik, ikHelper.rotation); if ((ik == AvatarIKGoal.LeftHand) || (ik == AvatarIKGoal.RightHand)) { Transform shoulder = (ik == AvatarIKGoal.LeftHand) ? anim.GetBoneTransform(HumanBodyBones.LeftShoulder) : anim.GetBoneTransform(HumanBodyBones.RightShoulder); // relative offset Vector3 offset = modelTransform.forward + Vector3.up / 2; // [TUNE] Rotate hand to align with should so that the gesture is more natural, can be tuned Vector3 targetRotationDirection = shoulder.transform.position - (ikHelper.transform.position + offset); Quaternion targetRotation = Quaternion.LookRotation(-targetRotationDirection); ikHelper.rotation = targetRotation; } else { ikHelper.rotation = ikInfo.target.transform.rotation; } if (ikInfo.hint != null) { anim.SetIKHintPositionWeight(ikHint, ikWeight); anim.SetIKHintPosition(ikHint, ikInfo.hint.position); } } }
void OnAnimatorIK(int layerIndex) { if (lhPoint) { IkPositions lhTemp = lhPoint.ReturnIK(AvatarIKGoal.LeftHand); if (lhTemp.target) { lhHelper.transform.position = Vector3.Lerp(lhHelper.transform.position, lhTargetPosition, Time.deltaTime * helperSpeed); } UpdateIK(AvatarIKGoal.LeftHand, lhTemp, lhHelper, lhWeight, AvatarIKHint.LeftElbow); } if (rhPoint) { IkPositions rhTemp = rhPoint.ReturnIK(AvatarIKGoal.RightHand); if (rhTemp.target) { rhHelper.transform.position = Vector3.Lerp(rhHelper.transform.position, rhTargetPosition, Time.deltaTime * helperSpeed); } UpdateIK(AvatarIKGoal.RightHand, rhTemp, rhHelper, rhWeight, AvatarIKHint.RightElbow); } if (hips == null) { hips = anim.GetBoneTransform(HumanBodyBones.Hips); } if (lfPoint) { IkPositions lfTemp = lfPoint.ReturnIK(AvatarIKGoal.LeftFoot); if (lfTemp.target) { Vector3 targetPosition = lfTargetPosition; if (forceFeetHeight) { if (targetPosition.y > hips.transform.position.y) { targetPosition.y = targetPosition.y - 0.2f; } } lfHelper.transform.position = Vector3.Lerp(lfHelper.transform.position, lfTargetPosition, Time.deltaTime * helperSpeed); } UpdateIK(AvatarIKGoal.LeftFoot, lfTemp, lfHelper, lfWeight, AvatarIKHint.LeftKnee); } if (rfPoint) { IkPositions rfTemp = rfPoint.ReturnIK(AvatarIKGoal.RightFoot); if (rfTemp.target) { Vector3 targetPosition = rfTargetPosition; if (forceFeetHeight) { if (targetPosition.y > hips.transform.position.y) { targetPosition.y = targetPosition.y - 0.2f; } } rfHelper.transform.position = Vector3.Lerp(rfHelper.transform.position, rfTargetPosition, Time.deltaTime * helperSpeed); } UpdateIK(AvatarIKGoal.RightFoot, rfTemp, rfHelper, rfWeight, AvatarIKHint.RightKnee); } }