관리 메뉴

caLAB

[유니티 VR] VR 캐릭터 리깅하기 본문

Unity/유니티VR

[유니티 VR] VR 캐릭터 리깅하기

도이(doi) 2021. 11. 4. 12:14
728x90

오늘은 VR 캐릭터를 리깅하는 방법에 대해서 알아볼 것이다. 

캐릭터를 리깅하는 방법은 IK이다.

IK (Inverse Kinematics) 란?
대부분의 애니메이션은 스켈레톤에서 미리 정해진 값에 조인트를 변경하여 회전하는 것으로 실현됩니다. 자식 조인트의 위치는 부모의 회전에 따라 변화하고, 이 때문에 일련의 조인의 종료점은, 각도 및 포함된 개별 조인트의 상대적 위치에 의해 결정됩니다. 이 스켈레톤의 포징(Posing) 기술은 Forward Kinematics (포워드 운동학)이라고 합니다.

그러나 포징(Posing) 조인트가 할 작업을 다른 관점에서 파악하는 것이 중요합니다. (공간에서 선택된 위치, 거기에서 역산하여 조인트의 방향을 종료점이 되는 위치) 효과적인 방법을 찾을 수 있습니다. 오브젝트를 사용자에 의해 선택된 점을 터치 시키거나 평탄하지 않은 땅에 발을 붙이는 것 같은 포즈를 캐릭터가 해주길 바랄 때 유용합니다. 이 방법은 Inverse Kinematics(IK)라고하며 메카님에서 잘 설정된 아바타가 있는 휴머노이드 캐릭터에서 지원됩니다.

 

사용한 캐릭터 Asset은 아래와 같습니다.

우선, Rigging을 위해서 Animation Rigging 패키지를 설치해야 됩니다.

그 후에 Robot Kyle에 Rig Builder와 Bone Renderer를 추가해줍니다.

Rig Builder 추가 시 Animator 자동 생성. (기존에 model이 가지고 있었던 Animation은 remove해줍니다.)

Robot Kyle 모델이 가지고 있는 Bone은 Root Hierarchy에 있습니다. alt + 화살표를 눌러서 Root의 하위 항목을 모두 펼쳐주고, Root부터 Root의 마지막 하위 항목까지 선택한 후에 Bone Renderer Component의 Transforms에 추가해줍니다.

그 후에는 empty GameObject를 만들어서 이름을 VR Constraints라고 이름 짓습니다.
그리고 Rig Component를 추가해줍니다.

이 VR Constraints를 위의 Rig Builder의 Rig Layers에 넣어줍니다.

VR Constraints의 하위에 empty GameObject를 하나 더 생성해서 이름을 Right Arm IK라고 지어줍니다. 

그리고 Two Bone IK Constraint라는 Component를 추가해줍니다.

Robot Kyle의 본이 있는 Root에서 아래의 이미지와 같은 팔의 joint와 관련된 부분들을 찾아서 parameter에 넣어줍니다.

Right Arm IK GameObject의 하위에 Target과 Hint라는 게임 오브젝트를 만들어 줍니다. 그리고 이것을 Right Arm IK의 Two Bone IK Constraint Component에 Source Objects의 Target과 Hint에 각각 할당해줍니다.

Target GameObject를 먼저 선택한 후에 Right_Wrist_Joint_01을 선택하고나서 Animation Rigging > Align Transform을 해줍니다. 

Hint의 경우에도 Hint GameObject를 먼저 선택한 후에 Right_Forearm_Joint_01을 선택한 후에 Animation Rigging > Align Transform을 해줍니다. 

플레이 버튼을 누른 후에 Target GameObject의 위치를 바꿔보면 자연스럽게 오른쪽 팔의 다른 관절들이 움직이는 것을 확인할 수 있습니다.

왼쪽도 오른쪽과 동일하게 만들어줍니다. Two Bone IK Constraint에 right에 연결된 것들을 left로 연결시켜주고, Target과 Hint를 left joint에 맞게 다시 Transform Align 해줍니다. 

head의 경우에는 방법이 조금 다릅니다.

empty GameObject를 만들고 이름을 Head Constraint라고 짓습니다. 

그 후에 Multi-Parent Constraint Component를 추가해줍니다.

Head를 선택하고 head bone과 Align Transform을 해줍니다.

위와 같은 과정을 마치면 이제 VR헤드셋, 오른쪽 왼쪽 컨트롤러에 해당하는 캐릭터의 머리, 왼손, 오른손 리깅이 끝난 상황입니다. 이제 이 것을 VR 헤드셋과 연결시켜줘야 되는데요. 이를 위해서 VR Rig라는 이름의 연결 스크립트를 만들도록 하겠습니다. VR Rig 스크립트는 Robot Kyle에 Component로 추가해줍니다.

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 headConstraint;
    public Vector3 headBodyOffset;

    private void Start()
    {
        headBodyOffset = transform.position - headConstraint.position;
    }

    private void Update()
    {
        transform.position = headConstraint.position + headBodyOffset;
        transform.forward = Vector3.ProjectOnPlane(headConstraint.up, Vector3.up).normalized; //머리 회전을 y축으로만 하도록 허용

        head.Map();
        leftHand.Map();
        rightHand.Map();
    }
}
728x90
반응형
Comments