こんにちは。
SAT-BOXのカピバラさんです。
まずは告知。
ニコニコ超会議2017のブースに出店する事になりました!
場所は「超まるなげひろば」の予定です!
ニコニコ超会議に行く予定のある人は、行ったら是非探して
プレイしに来てくださいね!(^^)/
では本題へ。
現在、VRスポーツの卓球で人のアニメーションを使っていて
IKがとても便利なので少し紹介します。
順番に見ていきましょう
IKとは
Inverse Kinematics(インバースキネマティクス)の略です。
ざっくり言うと、手首や足首の位置から
腕や膝等、関節の角度を逆計算する手法です。
UnityでもHumanoidの設定のAnimationはこのIKが使えて、
物を持ったりすることが出来ます。
IKを使う準備
まず、モデルがHumanoidの設定でないと使うことが出来ません。
「Generic」や「Legacy」になっている場合は、「Humanoid」に
変更する必要があります。
「Generic」の部分を「Humanoid」に変更
「Apply」で適用
変更完了!
AnimationControllerを付けて、そこにHumanoid用のアニメーションを入れて、
無事アニメーションしましたね。
あら、隣に棒が二本ついてますね
棒に手を固定させてみましょう。
棒に手を固定する
まず、固定させる座標が必要なので、固定させるところに分かりやすく
空のオブジェクトを配置しましょう。
次に、AnimatorWindowを開いて、IKの設定をします。
下の歯車をクリックして
IKPassのチェックボックスにチェックを入れます。
これで準備完了。
ソースコードはこんな感じ。
using UnityEngine; using System.Collections; public class IKController : MonoBehaviour { [Header("HandAnchors")] [SerializeField] public Transform rightHandAnchor = null; [SerializeField] public Transform leftHandAnchor = null; private Animator animator; void Start() { animator = GetComponent<Animator>(); } void OnAnimatorIK() { if (!animator) return; if (rightHandAnchor != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1); animator.SetIKPosition(AvatarIKGoal.RightHand, rightHandAnchor.position); animator.SetIKRotation(AvatarIKGoal.RightHand, rightHandAnchor.rotation); } if (leftHandAnchor != null) { animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1); animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1); animator.SetIKPosition(AvatarIKGoal.LeftHand, leftHandAnchor.position); animator.SetIKRotation(AvatarIKGoal.LeftHand, leftHandAnchor.rotation); } } }
このスクリプトをAnimatorがついているキャラ自体にアタッチし、
RightHandAnchorとLeftHandAnchorにさっき棒の子オブジェクトに作った
空のゲームオブジェクトをアタッチします。
これで再生してみましょう。
手が棒に固定されました!
でも手がめり込んでますね
こういう時は、棒の子オブジェクトに作った空のゲームオブジェクト
の座標を変えたり、回転させたりして、調整します。
~調整後~
こんな感じで固定させることが出来ます。
これはUnityのデフォルトの機能ですが、
AssetStoreで、「FinalIK」というアセットがあり、
これを使うともっと高度な事が可能になります。
何かに使う事があれば是非。
では(^^)/
今回参考にしたページ
docs.unity3d.com
他にも書いたので是非見てください。
sat-box.hatenablog.jp
sat-box.hatenablog.jp