[XRI] Hand Animation

리유리·2022년 10월 18일
0

XR Interaction Toolkit

목록 보기
6/7
post-thumbnail

컨트롤러 대신 손 모델이 나와서 grip, trigger 상호작용이 손가락 움직임으로 반영되게 해보기

📌 과정

  • 손 모델로 쓸 파일을 가져와 각각 왼손, 오른손 컨트롤러의 하위 오브젝트로 넣음

    • 왼손 모델에서 scale (-1, 1, 1) 하면 오른손 모델처럼 방향이 바뀜
  • Hand 에 Animator 스크립트 추가 및 아바타 할당

    • 아바타가 없는 경우 모델 파일 > Rig > Avatar Definition > Create From This Model 후 Apply 하면 생성됨
  • 손이 모두 접힌 경우를 나타내는 close 애니메이션 생성

  • 아바타 마스크 생성

    • Trigger : 엄지, 검지만 체크
    • Grip : 중지, 약지, 소지만 체크
  • Animator 에서 레이어와 float 파라미터 생성

    • 각 레이어의 Weight = 1, Mask 는 앞에서 생성한 아바타 마스크 할당
  • new state, blend tree 생성 후 아래 그림과 같이 연결

  • 각 레이어에 맞는 조건 할당 및 Exit Time, Fixed Duration 체크 해제

  • Hand.cs : LeftHand, RightHand 오브젝트에 넣기

public class Hand : MonoBehaviour
{
    public float speed;

    Animator animator;
    private float gripTarget;
    private float triggerTarget;
    private float gripCurrent;
    private float triggerCurrent;
    private string animatorGripParam = "Grip";
    private string animatorTriggerParam = "Trigger";

    void Start()
    {
        animator = GetComponent<Animator>(); 
    }

    void Update()
    {
        AnimateHand();
    }

    internal void SetGrip(float v)
    {
        gripTarget = v;
    }

    internal void SetTrigger(float v)
    {
        triggerTarget = v;
    }

    void AnimateHand()
    {
        if (gripCurrent != gripTarget)
        {
            gripCurrent = Mathf.MoveTowards(gripCurrent, gripTarget, Time.deltaTime * speed);
            animator.SetFloat(animatorGripParam, gripCurrent);
        }

        if (triggerCurrent != triggerTarget)
        {
            triggerCurrent = Mathf.MoveTowards(triggerCurrent, triggerTarget, Time.deltaTime * speed);
            animator.SetFloat(animatorTriggerParam, triggerCurrent);
        }
    }
}
  • HandController.cs : LeftHandController, RightHandController 오브젝트에 넣기
public class HandController : MonoBehaviour
{
    ActionBasedController controller;
    public Hand hand;

    void Start()
    {
        controller = GetComponent<ActionBasedController>();
    }

    void Update()
    {
        hand.SetGrip(controller.selectAction.action.ReadValue<float>());
        hand.SetTrigger(controller.activateAction.action.ReadValue<float>());
    }
}

📌 결과

📌 문제점

  • Grab 시 손과 물체가 겹쳐져서 보기 좋지 않음 -> Grab 중일 때는 손 숨기기!

    • Hand.cs 에 다음 내용 추가
    SkinnedMeshRenderer mesh;
    
    public void ToggleVisibility()
    {
        mesh.enabled = !mesh.enabled;
    }
    • 컨트롤러 오브젝트 > XR Ray Interactor > Select Entered, Select Exited 에 위에서 만든 ToggleVisibility() 함수 추가
profile
내 이름은 이유리, 거꾸로 해도 이유리

0개의 댓글