Skip to content

Instantly share code, notes, and snippets.

@takoyakiroom
Created February 25, 2017 12:09
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save takoyakiroom/4e7d8e4c2179bf1945b76b7777ce80e7 to your computer and use it in GitHub Desktop.
Save takoyakiroom/4e7d8e4c2179bf1945b76b7777ce80e7 to your computer and use it in GitHub Desktop.
using UnityEngine;
using System;
using System.Collections;
using VRTK;
public class IK : MonoBehaviour
{
Animator avatar; // アバター
public Transform lookAt = null; // 見る対象
public GameObject body = null; // 身体
public Transform leftHand = null; // 左手
public Transform rightHand = null; // 右手
public Transform leftFoot = null; // 左足
public Transform rightFoot = null; // 右足
public Transform leftElbow = null; // 左ひじ
public Transform rightElbow = null; // 右ひじ
public Transform leftKnee = null; // 左ひざ
public Transform rightKnee = null; // 右ひざ
void OnAnimatorIK(int layerIndex)
{
if (avatar == null)
{
// 初期化
InitAvatar();
}
else
{
// 動かす
MoveAvatar();
}
}
void InitAvatar()
{
Debug.Log("InitAvatar");
avatar = GetComponent<Animator>(); // アバター設定
// 見る対象
if (lookAt == null)
{
// 設定されていない場合、VRヘッドセットの方を向くようにする
lookAt = GameObject.Find("VRTK").GetComponent<VRTK_SDKManager>().actualHeadset.transform;
}
// グリップの位置初期化
// 身体
body.transform.position = avatar.bodyPosition;
body.transform.rotation = avatar.bodyRotation;
// 手
leftHand.position = avatar.GetBoneTransform(HumanBodyBones.LeftHand).position;
//leftHand.rotation = avatar.GetBoneTransform(HumanBodyBones.LeftHand).rotation;
rightHand.position = avatar.GetBoneTransform(HumanBodyBones.RightHand).position;
//rightHand.rotation = avatar.GetBoneTransform(HumanBodyBones.RightHand).rotation;
// ひじ
leftElbow.position = avatar.GetBoneTransform(HumanBodyBones.LeftLowerArm).position;
rightElbow.position = avatar.GetBoneTransform(HumanBodyBones.RightLowerArm).position;
// 足
leftFoot.position = avatar.GetBoneTransform(HumanBodyBones.LeftFoot).position;
//leftFoot.rotation = avatar.GetBoneTransform(HumanBodyBones.LeftFoot).rotation;
rightFoot.position = avatar.GetBoneTransform(HumanBodyBones.RightFoot).position;
//rightFoot.rotation = avatar.GetBoneTransform(HumanBodyBones.RightFoot).rotation;
// ひざ
leftKnee.position = avatar.GetBoneTransform(HumanBodyBones.LeftLowerLeg).position;
rightKnee.position = avatar.GetBoneTransform(HumanBodyBones.RightLowerLeg).position;
}
void MoveAvatar()
{
// 顔の向き
avatar.SetLookAtPosition(lookAt.position);
// 身体
avatar.bodyPosition = body.transform.position;
avatar.bodyRotation = body.transform.rotation;
// 移動先を設定
avatar.SetIKPosition(AvatarIKGoal.LeftHand, leftHand.position);
avatar.SetIKRotation(AvatarIKGoal.LeftHand, leftHand.rotation);
avatar.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position);
avatar.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation);
avatar.SetIKPosition(AvatarIKGoal.LeftFoot, leftFoot.position);
avatar.SetIKRotation(AvatarIKGoal.LeftFoot, leftFoot.rotation);
avatar.SetIKPosition(AvatarIKGoal.RightFoot, rightFoot.position);
avatar.SetIKRotation(AvatarIKGoal.RightFoot, rightFoot.rotation);
avatar.SetIKHintPosition(AvatarIKHint.LeftElbow, leftElbow.position);
avatar.SetIKHintPosition(AvatarIKHint.RightElbow, rightElbow.position);
avatar.SetIKHintPosition(AvatarIKHint.LeftKnee, leftKnee.position);
avatar.SetIKHintPosition(AvatarIKHint.RightKnee, rightKnee.position);
// 移動
avatar.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
avatar.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
avatar.SetIKPositionWeight(AvatarIKGoal.RightHand, 1.0f);
avatar.SetIKRotationWeight(AvatarIKGoal.RightHand, 1.0f);
avatar.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1.0f);
avatar.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1.0f);
avatar.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1.0f);
avatar.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1.0f);
avatar.SetIKHintPositionWeight(AvatarIKHint.LeftElbow, 1.0f);
avatar.SetIKHintPositionWeight(AvatarIKHint.RightElbow, 1.0f);
avatar.SetIKHintPositionWeight(AvatarIKHint.LeftKnee, 1.0f);
avatar.SetIKHintPositionWeight(AvatarIKHint.RightKnee, 1.0f);
avatar.SetLookAtWeight(1.0f, 0.3f, 0.6f, 1.0f, 0.5f);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment