名古屋でアプリ・VR開発を行っています
ワクワクできるゲームをガンガン開発リリース中!

UnityでHumanoidのIKを使ってみる1

こんにちは。

SAT-BOXのカピバラさんです。

まずは告知。

ニコニコ超会議2017のブースに出店する事になりました!

場所は「超まるなげひろば」の予定です!

ニコニコ超会議に行く予定のある人は、行ったら是非探して

プレイしに来てくださいね!(^^)/

www.chokaigi.jp


では本題へ。

現在、VRスポーツの卓球で人のアニメーションを使っていて

IKがとても便利なので少し紹介します。

順番に見ていきましょう

IKとは

Inverse Kinematics(インバースキネマティクス)の略です。

ざっくり言うと、手首や足首の位置から

腕や膝等、関節の角度を逆計算する手法です。

UnityでもHumanoidの設定のAnimationはこのIKが使えて、

物を持ったりすることが出来ます。


IKを使う準備

まず、モデルがHumanoidの設定でないと使うことが出来ません。

「Generic」「Legacy」になっている場合は、「Humanoid」

変更する必要があります。


「Generic」の部分を「Humanoid」に変更
f:id:sat-box:20170424180908p:plain

「Apply」で適用
f:id:sat-box:20170424180902p:plain

変更完了!
f:id:sat-box:20170424180905p:plain


AnimationControllerを付けて、そこにHumanoid用のアニメーションを入れて、

無事アニメーションしましたね。

f:id:sat-box:20170424181822g:plain

あら、隣に棒が二本ついてますね

棒に手を固定させてみましょう。

棒に手を固定する

まず、固定させる座標が必要なので、固定させるところに分かりやすく

空のオブジェクトを配置しましょう。

f:id:sat-box:20170424185112p:plain

次に、AnimatorWindowを開いて、IKの設定をします。

下の歯車をクリックして
f:id:sat-box:20170424190044p:plain

IKPassのチェックボックスにチェックを入れます。
f:id:sat-box:20170424190053p:plain

これで準備完了。
f:id:sat-box:20170424190056p:plain

ソースコードはこんな感じ。

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がついているキャラ自体にアタッチし、

RightHandAnchorLeftHandAnchorにさっき棒の子オブジェクトに作った

空のゲームオブジェクトをアタッチします。

f:id:sat-box:20170424185609p:plain

これで再生してみましょう。

f:id:sat-box:20170424191051g:plain


手が棒に固定されました!

でも手がめり込んでますね

こういう時は、棒の子オブジェクトに作った空のゲームオブジェクト

の座標を変えたり、回転させたりして、調整します。

f:id:sat-box:20170424191223p:plain

~調整後~
f:id:sat-box:20170424191056g:plain


こんな感じで固定させることが出来ます。

これはUnityのデフォルトの機能ですが、

AssetStoreで、「FinalIK」というアセットがあり、

これを使うともっと高度な事が可能になります。

http://u3d.as/6ec


何かに使う事があれば是非。

では(^^)/

今回参考にしたページ
docs.unity3d.com


他にも書いたので是非見てください。
sat-box.hatenablog.jp
sat-box.hatenablog.jp