Unity 3D 휴머노이드 아바타의 관절 위치를 텍스트 파일에 기록해보자

하나둘셋·2024년 1월 17일
post-thumbnail

목표

Unity 3D 휴머노이드 모델을 Mixamo 캐릭터 애니메이션으로 움직이게 한 후, 모델이 움직일 때 관절 위치를 텍스트 파일에 기록 하기
파일에 기록된 관절 위치로 모델의 움직임을 구현하기 위한 단계이다.

캐릭터 애니메이션 설명 참고영상 : 오늘코딩의 애니메이션 총정리 1편



1. Mixamo 애니메이션 다운로드하기

mixamo mixamo2 마음에 드는 애니메이션 골라서 오른쪽에 Download 버튼 누르고 다운로드 받는다. (스킨 딱히 필요없어서 노스킨으로 다운받음)



2. 다운로드 한 애니메이션 파일 유니티로 가지고 오기

Unity Assets 창으로 다운 받은 FBX 파일 끌어서 가져오고, Rig 탭에서 몇가지의 설정을 바꾼 후 Apply 버튼을 눌러준다.

Animation Type : Humanoid
Avatar Definition : Copy From Other Avatar
Source : 애니메이션 적용할 아바타 모델




FBX 파일 안에 세모 모양으로 생긴 애니메이션 클립만 Assets 창에 두고 나머지 파일은 삭제한다.
Assets 창에서 Create -> Animator Controller 생성한다.




아까 만든 Animator Controller를 아바타에 적용한다 (빨간색 동그라미 처럼).

아바타 Animator Controller 두번 클릭해서 누르면 애니메이션을 적용 할 수 있는 Animator 창이 하나 생성됨



3. 아바타 애니메이션 적용하기

Assets에 있는 JabCross 애니메이션 클립을 Animator 창에다가 가져가면 자동으로 JabCross 노드가 생기면서 연결됩니다.

실행하게 되면 자동으로 JabCross 애니메이션이 아바타에 적용됩니다.



4. 텍스트 파일에 아바타 관절 위치 기록하기

'Player Animation' 이라는 C# Script를 하나 생성해서 애니메이션 캐릭터의 관절 위치(x, y, z) 기록하겠습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO; //파일 입출력 위한 헤더 파일

public class PlayerAnimation : MonoBehaviour
{
    public Animator anim; 
    private string fullpth = "Assets/Avatar/JointTextFile/"; //파일 경로 정의하기
    StreamWriter sw;
    HumanBodyBones[] myBone;

    private void Start()
    {	
    	// 아바타에 부착된 Animator 컴포넌트를 가져오기
        anim = GetComponent<Animator>();
        
        // 아바타의 13개 관절을 배열에 저장
        myBone = new HumanBodyBones[13]; 
       
        myBone[0] = HumanBodyBones.Head;
        myBone[1] = HumanBodyBones.LeftUpperArm;
        myBone[2] = HumanBodyBones.RightUpperArm;
        myBone[3] = HumanBodyBones.LeftLowerArm;
        myBone[4] = HumanBodyBones.RightLowerArm;
        myBone[5] = HumanBodyBones.LeftHand;
        myBone[6] = HumanBodyBones.RightHand;
        myBone[7] = HumanBodyBones.LeftUpperLeg;
        myBone[8] = HumanBodyBones.RightUpperLeg;
        myBone[9] = HumanBodyBones.LeftLowerLeg;
        myBone[10] = HumanBodyBones.RightLowerLeg;
        myBone[11] = HumanBodyBones.LeftFoot;
        myBone[12] = HumanBodyBones.RightFoot;
		
        //경로에 jabCross.txt 파일 없으면 새로 생성
        if (false == File.Exists(fullpth + "jabCross.txt")
        {
            var file = File.CreateText(fullpth + "jabCross.txt");
            file.Close();  // 파일 생성하고 닫기
        }
        sw = new StreamWriter(fullpth + "jabCross.txt"); //파일 열어서 쓰기
    }

    private void Update()
    {	
    	// 매 프레임이 업데이트 될 때마다 관절의 위치값(x, y, z)를 파일에 쓰기
        for (int i = 0; i < 13; i++)
        {
            sw.Write(anim.GetBoneTransform(myBone[i]).position.x + " ");
            sw.Write(anim.GetBoneTransform(myBone[i]).position.y + " ");
            sw.WriteLine(anim.GetBoneTransform(myBone[i]).position.z);
        }
		
        // Space가 눌리면 스트림 개체 닫기, 유니티 에디터 실행도 멈추기
        if (Input.GetKeyDown(KeyCode.Space))
        {
            sw.Close();
            UnityEditor.EditorApplication.isPlaying = false;
        }
    }

}



5. 텍스트 파일 기록 결과

유니티 에디터를 실행하면 아바타가 애니메이션에 의해 움직이면서 텍스트 파일에 자동적으로 아바타의 관절값이 기록된다.

이런 식으로 13개의 관절 위치가 텍스트 파일에 기록된다.
맨 위의 줄 부터 13번째 줄 까지 첫번째 프레임의 관절 위치값이며, 각 프레임의 관절 위치를 연달아서 기록했다.

profile
하나씩 뚝딱뚝딱

0개의 댓글