UNITY中做动画的两个不错的连接

Inverse Kinematics

Unity - Manual: Inverse Kinematics

Most animation is produced by rotating the angles of joints in a skeleton to predetermined values. The position of a child joint changes according to the rotation of its parent and so the end point of a chain of joints can be determined from the angles and relative positions of the individual joints it contains. This method of posing a skeleton is known as forward kinematics.

However, it is often useful to look at the task of posing joints from the opposite point of view - given a chosen position in space, work backwards and find a valid way of orienting the joints so that the end point lands at that position. This can be useful when you want a character to touch an object at a point selected by the user or plant its feet convincingly on an uneven surface. This approach is known as Inverse Kinematics (IK) and is supported in Mecanim for any humanoid character with a correctly configured Avatar.

UNITY中做动画的两个不错的连接_第1张图片

 

To set up IK for a character, you typically have objects around the scene that a character interacts with, and then set up the IK thru script, in particular, Animator functions like SetIKPositionWeight, SetIKRotationWeight, SetIKPosition, SetIKRotation, SetLookAtPosition, bodyPosition, bodyRotation

In the illustration above, we show a character grabbing a cylindrical object. How do we make this happen?

We start out with a character that has a valid Avatar.

Next create an Animator Controller with containing at least one animation for the character. Then in the Layers pane of the Animator window, click the cog settings icon of the Layer and and check the IK Pass checkbox in the menu which pops up.

UNITY中做动画的两个不错的连接_第2张图片

 Next, attach to it a script that actually takes care of the IK, let’s call it IKControl. This script sets the IK target for the character’s right hand, and its look position to make it look at the object it is holding:

using UnityEngine;
using System;
using System.Collections;

[RequireComponent(typeof(Animator))] 

public class IKControl : MonoBehaviour {
    
    protected Animator animator;
    
    public bool ikActive = false;
    public Transform rightHandObj = null;
    public Transform lookObj = null;

    void Start () 
    {
        animator = GetComponent();
    }
    
    //a callback for calculating IK
    void OnAnimatorIK()
    {
        if(animator) {
            
            //if the IK is active, set the position and rotation directly to the goal. 
            if(ikActive) {

                // Set the look target position, if one has been assigned
                if(lookObj != null) {
                    animator.SetLookAtWeight(1);
                    animator.SetLookAtPosition(lookObj.position);
                }    

                // Set the right hand target position and rotation, if one has been assigned
                if(rightHandObj != null) {
                    animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
                    animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);  
                    animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position);
                    animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
                }        
                
            }
            
            //if the IK is not active, set the position and rotation of the hand and head back to the original position
            else {          
                animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0);
                animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); 
                animator.SetLookAtWeight(0);
            }
        }
    }    
}

As we do not intend for the character’s hand to reach inside the object to its centre (the cylinder’s pivot point), we position an empty child object (in this case, named “Cylinder Grab Handle”) where the hand should be on the cylinder, and rotate it accordingly. The hand then targets this child object.

UNITY中做动画的两个不错的连接_第3张图片 

 

How to Create Animations from Models

How To Create Animations From Models And Sprites Within Unity - GameDev Academy

Click on the play icon (the red circle) to get started.

UNITY中做动画的两个不错的连接_第4张图片 

 UNITY中做动画的两个不错的连接_第5张图片

 UNITY中做动画的两个不错的连接_第6张图片

 Click on the arrow to go to the next keyframe and this time, we will change the rotation in the Animation window instead of the character in the hierarchy. Change the Y rotation to -58 and 58 respectively.

UNITY中做动画的两个不错的连接_第7张图片

 We will continue to do this in 0.10 second clips until the Y rotation value reaches 28.

UNITY中做动画的两个不错的连接_第8张图片

 But wait…There’s more! We aren’t done with this animation clip yet. We now have to take all the frames we made and do the reverse in this clip.

UNITY中做动画的两个不错的连接_第9张图片

Now that we have done all of that, we can deselect that red play button and watch it in game view. The Animation is automatically saved now. But always save your project and scenes often.

UNITY中做动画的两个不错的连接_第10张图片

 As you can see, it is not difficult to do the animations. The only issue I have is that it can be extremely tedious to do and depending on what you want to do with the animations can make it become a bit unmanageable at times.

 

你可能感兴趣的:(Unity,unity,动画)