Unity VR Arm IK

패키지 매니저에 들어가서 Animation Rigging 패키지를 다운받는다

준비해둔 휴머노이드 모델에다가 Rig Builder를 추가하고 Animation을 삭제해준다

Bone Renderer를 추가해주고 모델의 Root부분부터 맨 아래까지 다 Transforms안에다가 넣어주면 된다

IK를 만들기 위한 사전 작업으로 빈오브젝트 VR Contraints를 하나 생성해준다음 Rig컴포넌트를 부착해준다

그다음으로 아까 만들어둔 Rig Builder 컴포넌트에 방금 생성한 VR Contraints컴포넌트를 넣어준다

다음으로 VR Contraints자식으로 빈 오브젝트 Right Arm Ik를 하나 만들어주고 거기에 Two Bone IK Contraints 컴포넌트를 만들어준다

Root, Mid , Tip 각각 알맞은 트랜스폼을 할당해주어야 한다

모델의 클릭해보면 아까 Bone Renderer을 추가해서 파란색 뼈대같은것들이 보일텐데 빨간색 어깨(?)을 클릭하면 파란색 테두리가 노란색 테두리가 되는 것을 볼 수 있다

그럼 자동으로 하이러키창에서 누른 팔 부위가 클릭되는데 그거를 끌어다가 놓으면 된다

1번 2번 3번을 순서대로 클릭하고 그거 넣어주면 된다

Right Arm Ik 자식으로 Target 과 Hint를 추가하고 

Source Objects의 아래 Target과 Hint에 넣어주면 된다

타켓 오브젝트를 누르고 쉬프트를 누른 상태로 손을 클릭하면 Right_Writs_Joint가 함께 선택된다

그 상태로 상단 Animation Rigging 메뉴바를 누르고 Align Transform을 누르면 Target이 Right_Writs_Joint 위치로 이동한다

Hint도 똑같이 해주는데

가운데 팔에다가 해주면 된다

그리고 Hint는 팔꿈치 약간 뒤에 배치시켜주면 된다

Left Arm IK도 똑같이 세팅해주면 된다

다음으로 Head Contraints를 만들어주고 Mulit-Parent Contraints 컴포넌트를 붙여준다

Constrained Object에는 Head를 붙여주고 Source Objects에는 Head Contraints를 붙여주면 된다

 

얘도 Align Transform을 통해 머리쪽으로 옮겨준다

 

VRRig라는 스크립트를 하나 생성하고  캐릭터에 붙여준다

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class VRMap
{
    public Transform vrTarget;
    public Transform rigTarget;
    public Vector3 trackingPositionOffset;
    public Vector3 trackingRotationOffset;

    public void Map()
    {
        rigTarget.position = vrTarget.TransformPoint(trackingPositionOffset);
        rigTarget.rotation = vrTarget.rotation * Quaternion.Euler(trackingRotationOffset);
    }
}

public class VRRig : MonoBehaviour
{
    public VRMap head;
    public VRMap leftHand;
    public VRMap rightHand;
    
    public Transform headContraints; 
    Vector3 headBodyOffest;

    public float smoomthness;

    private void Awake()
    {
        headBodyOffest = transform.position - headContraints.position;
    }

    private void Update()
    {
        transform.position = headContraints.position + headBodyOffest;
        transform.forward = Vector3.Lerp(transform.forward,
            Vector3.ProjectOnPlane(headContraints.up, Vector3.up).normalized, Time.deltaTime * smoomthness);

        head.Map();
        leftHand.Map();
        rightHand.Map();
    }
}

 

OVRCameraRig도 하나 만들어준다

수치를 조정해준다