	AI4Animation 사용 설명서
	ETRI 2024 동계연구연수
	국방ICT융합연구실
	김기현
	Feb 26 2024

목차

설명

개요

Unity 기본
3.1 Unity Editor

Unity 심화
4.1 애트리뷰트
4.2 추상 클래스
4.3 코루틴

AI4Animation

AI4Animation 예제 – 4족보행

AI4Animation 응용 – 이족보행

설명

AI4Animation은 에든버러 정보대학원(Edinbura University of Informationatics) 박사 연구의 일환으로 캐릭터 애니메이션 및 제어를 위한 딥러닝(Deep Learning)의 기회를 탐구하는 프로젝트이다. 지난 몇 년 동안 이 프로젝트는 Unity3D / Tensorflow / PyTorch에서 개발된 데이터 처리, 네트워크 훈련 및 런타임 제어를 포함한 데이터 기반 캐릭터 애니메이션의 포괄적인 프레임워크가 되었다. 이 저장소는 신경망을 사용하여 이족보행, 4족보행, 물체 및 환경, 스포츠 및 격투 게임과의 캐릭터-장면 상호작용을 애니메이션화하는 것을 보여준다.

https://github.com/sebastianstarke/AI4Animation

.. 부족한 부분은 AI4Animation 2022 Guide.pptx 참조

개요

AI4Animation을 익히기에 앞서 Unity의 사용법을 숙지하여야 한다. 이후 4족보행 예시를 실행함으로써 AI4Animation이 Unity 환경에서 어떤 구조로 실행되는 지를 익히고, 이족보행으로 변경, 응용하면서 다음 프로젝트를 어떤 식으로 진행하여야 하는지를 파악한다.

Unity 기본

Unity는 2004년 8월 Unity Technologies가 개발한 통합 멀티미디어 게임 엔진이다. 게임 엔진은 게임 개발에 필요한 여러 기능을 제공함으로써 게임 개발의 작업 속도를 높혀주고 난이도를 낮춰준다.

Unity의 장점

Unity의 장점은 다음과 같다.

직관적인 IDE (WYSIWTG) : WYSIWYG방식으로 게임을 개발함에 있어 직관적인 게임 개발 화면을 제공해주고 개발 환경을 커스터마이징 가능하며, 내부 에셋들을 드래그 앤 드롭으로 외부 파일을 임포트하거나 파일 위치를 바꾸는 행위를 손쉽게 할 수 있다.

What You See Is What You Get의 약자로, 문서 및 문서 작성 방법을 GUI로 구현한 것을 이른다.

멀티 플랫폼 지원 : 모바일 플랫폼(IOS, 안드로이드 등), 데스크톱 플랫폼(윈도우, 리눅스 등) 뿐만 아니라 콘솔, 웹, VR 등 총 25개 이상의 다양한 플랫폼을 지원한다.

낮은 요구 사양 : 요구 사양이 절대적으로 낮은 것은 아니지만, 다른 게임 엔진과 비교하였을 때 가벼운 환경에서도 무리 없이 수행이 가능하다.

낮은 가격 : 개인이나 월 10만 불 이하의 기업에게는 무료로 제공하며, 연 매출 20만불 이하는 월 40,000원 그 이상은 140,000원의 라이센스 비용을 요구한다.

에셋 스토어 : 캐릭터 모델, 애니메이션, 사운드 등 게임 개발에 있어 필요한 자원들을 사고 팔 수 있는 사이트를 제공한다. 이는 개발자와 디자이너의 역할을 분리시켰고 게임 개발의 장벽을 낮춰주었다.

활성화된 커뮤니티 : 위의 사항들로 인하여 Unity는 접하기 쉽다는 특징이 가장 크게 부각되었고, 이는 커뮤니티 활성화라는 결과에 도달하였다. 다양한 강의나 자료를 손쉽게 찾을 수 있고 개발하다가 막힌 상황이 있으면 대부분의 상황 해결 방식이 인터넷에 올라와 있음을 확인할 수 있다.

Unity 설치

Unity Editor를 설치하기 위하여 Unity Hub를 설치하여야 한다. Unity Hub는 다양한 버전의 Unity Editor를 설치하고, 프로젝트별로 맞는 버전을 설정, 관리할 수 있도록 하는 게이트웨이이다.

Unity Hub Download : https://unity.com/kr/download

Unity Hub를 설치한 후 개발자 계정을 생성한 뒤 로그인하여야 라이선스를 발급받고 프로젝트를 생성할 수 있다.

Unity 학습

3.1 Unity Editor

Unity Editor의 기본 화면은 다음과 같다.

각각의 기능들은 다음과 같다.

https://docs.unity3d.com/kr/2023.2/Manual/UsingTheEditor.html

(A) 툴바는 Unity 계정과 Unity 클라우드 서비스에 대한 액세스를 제공합니다.여기에는 플레이 모드, 실행 취소 이력, Unity 검색, 레이어 표시 메뉴, 에디터 레이아웃 메뉴에 대한 컨트롤도 포함됩니다.

(B) 계층 창은 씬의 모든 게임 오브젝트를 계층 구조에 텍스트로 표시합니다. 씬에 있는 각 항목마다 계층 구조에 엔트리가 있으므로 두 창은 본질적으로 연결되어 있습니다. 계층 구조는 게임 오브젝트의 상호 연결 방식을 구조로 나타냅니다.

(C) 게임 뷰는 씬 카메라를 통해 최종적으로 렌더링된 게임 모습을 시뮬레이션합니다. Play 버튼을 클릭하면 시뮬레이션이 시작됩니다.

(D) 씬(Scene) 뷰를 통해 씬을 시각적으로 탐색하고 편집할 수 있습니다.씬 뷰는 작업 중인 프로젝트 타입에 따라 3D 또는 2D 시점으로 표시할 수 있습니다.

(E) 오버레이에는 씬 뷰와 그 안에 있는 게임 오브젝트를 조작하기 위한 기본 툴이 들어 있습니다. 커스텀 오버레이를 추가하여 워크플로를 개선할 수도 있습니다.

(F) 인스펙터(Inspector) 창에서는 현재 선택한 게임 오브젝트의 모든 프로퍼티를 보고 편집할 수 있습니다.게임 오브젝트의 타입이 다르면 프로퍼티 설정이 다르기 때문에 다른 게임 오브젝트를 선택할 때마다 인스펙터 창의 레이아웃과 콘텐츠가 달라집니다.

(G) 프로젝트 창 에는 프로젝트에서 사용할 수 있는 에셋 라이브러리가 표시됩니다. 프로젝트로 에셋을 임포트하면 이 창에 나타납니다.

(H) 상태 표시줄은 다양한 Unity 프로세스에 대한 알림을 제공하고, 관련 툴 및 설정에 대한 빠른 액세스를 지원합니다.

4. Unity 심화

4.1 애트리뷰트

애트리뷰트들은 Unity에서 게임 오브젝트 및 스크립트의 동작을 제어하고 에디터에서 사용자 편의성을 높이는 데 사용된다. 사용할 클래스 또는 메서드 위에 대괄호를 치고 사용할 애트리뷰트 명을 적으면 된다. 사용 예시는 다음과 같다. 프로퍼티 선언 위에 HideInInspector 속성을 추가하여 인스펙터가 공용 프로퍼티인 경우에도 프로퍼티를 표시하지 않도록 할 수 있다.

[HideInInspector]

public float strength;

다음은 자주 사용하는 애트리뷰트의 목록이다.

attribute	discription
SerializeField	private, protected 변수를 인스펙터에 표시
Serializable	커스텀 클래스를 인스펙터에 표시
Header	변수 위에 타이틀을 설정해 카테고리 분류 가능, 인스펙터 외관 정리에 사용
HideInInspector	public 변수를 인스펙터에서 숨길 수 있음
RequireComponent	필수 컴포넌트를 추가 할 수 있음
Range	int, float 변수를 슬라이드바로 표시하고 범위를 제한함
Space	변수와 변수 사이에 간격 주기
CreateAssetMenu	ScriptableObject Asset을 생성할 때 사용하는 메뉴를 추가할 때 사용
MenuItem	임의의 정적 함수 (static) 실행을 메뉴 항목으로 추가
ContextMenu	임의의 비정적 함수 (non-static) 실행을 컴포넌트 톱니 메뉴에 추가
AddComponentMenu	인스펙터의 AddComponent 메뉴 항목으로 컴포넌트를 추가 할 때 사용
ExecuteInEditMode	에디터가 플레이 모드가 아니더라도 컴포넌트가 동작하도록 할 때 사용
Multiline	string 변수를 여러 줄 입력 가능하게 만들 때 사용
TextArea	Multiline과 비슷, 폭에 맞춰 자동으로 줄바꿈과 슬라이드 바 표시
Tooltip	인스펙터에 표시되는 변수에 설명을 추가할 때 사용

4.2 추상 클래스

추상 클래스는 객체 지향 프로그래밍에서 하나 이상의 추상 메서드를 포함하고 있으며, 직접적으로 인스턴스화될 수 없다. 대신에 하위 클래스에 의해 확장되어야 하며, 이를 통해 객체의 공통된 특성과 동작을 정의한다. 이러한 특징으로 인해 추상 클래스는 상속과 다형성을 강화하고, 코드의 재사용성과 유연성을 높이는데 사용된다. Java의 인터페이스의 역할이 같으며 추상화를 목적으로 사용한다.

4.3 코루틴

코루틴은 Unity에서 비동기적으로 작업을 수행하기 위한 강력한 도구로, 다음과 같이 설명할 수 있다.

코루틴은 Unity에서 사용되는 비동기적 작업 패턴으로, 함수의 실행을 일시 중단하고 나중에 이어서 실행할 수 있도록 해준다. 일반적인 동기적 함수 호출과 달리, 코루틴은 실행 중에 다른 코드와 함께 병행하여 작업을 수행할 수 있다. 이를 통해 긴 작업을 여러 프레임에 걸쳐 나누어 처리하거나, 시간 지연이 필요한 작업을 효율적으로 관리할 수 있다.

코루틴은 함수 앞에 IEnumerator 형식의 반환 형식으로 선언되며, yield return 문을 사용하여 실행 중에 일시 중단되고 다시 시작될 지점을 지정한다. yield return null을 사용하면 다음 프레임까지 대기하고, yield return new WaitForSeconds(delay)를 사용하면 지정된 시간 동안 대기한다. 또한, yield return StartCoroutine()을 사용하여 다른 코루틴을 호출하고 대기할 수도 있다.

코루틴은 Unity에서 자주 사용되며, 주로 애니메이션, 이동, 대기 및 상태 머신과 같은 비동기적 작업을 처리하는 데 활용된다. 이를 통해 게임의 성능을 향상시키고, 사용자 경험을 개선하는 데 도움이 된다.

5. AI4Animation

AI4Animation은 다양한 파일 형태로 저장되어있는 애니메이션을 학습하여 다양한 상호작용에 따른 애니메이션을 출력하도록 만들기 위한 프로젝트이다. 이 문서에서 다룰 버전은 2022 버전으로 제목은 DeepPhase: Periodic Autoencoders for Learning Motion Phase Manifolds (DeepPhase: 운동 위상 다양체 학습을 위한 주기적 자동 인코더)이다.

위의 내용을 번역하면 다음과 같다.

신체 움직임의 시공간 구조를 학습하는 것은 캐릭터 모션 합성의 근본적인 문제입니다. 이 연구에서 우리는 비지도(학습) 방식으로 대규모 비정형 모션 데이터 세트에서 주기적 특징을 학습할 수 있는 Periodic Autoencoder라는 새로운 신경망 아키텍처를 제안합니다.

캐릭터 움직임은 시간이 지남에 따라 진행되는 동안 다양한 신체 부분의 비선형 주기성을 캡처하는 여러 잠재 채널로 분해됩니다. 우리의 방법은 애니메이션을 효과적으로 클러스터링하고 계산된 특징 거리가 원래 모션 공간보다 더 나은 유사성 측정을 제공하여 더 나은 시간적 및 공간적 정렬을 달성하는 매니폴드를 생성하는 전신 동작 데이터에서 다차원 위상 공간을 추출합니다.

우리는 학습된 주기적 임베딩이 다양한 운동 기술, 스타일 기반 움직임, 음악의 댄스 모션 합성, 축구의 드리블 모션 합성, 포즈 일치를 위한 모션 쿼리 등 대규모 애니메이션 데이터베이스 내 다양한 작업에서 신경 모션 합성을 개선하는 데 크게 도움이 될 수 있음을 보여줍니다.

6. AI4Animation예제 – 4족보행

AI4Animation 개발자의 github에서 제공하는 4족 보행 예제를 실행하여보고 AI4Animation 프로젝트가 어떻게 작동하는지 알아본다.

6.1 AI4Animation 실행

Unity Hub를 실행한 뒤, Project -> Add -> (github 파일을 다운로드하고 압축을 해제한 파일의 위치)/AI4Animation/SIGRAPH_2022/ 의 경로로 들어가 Unity 폴더를 선택한 후, [Add Project] 버튼을 눌러 프로젝트 예제 환경을 실행한다. Unity Hub는 프로젝트 실행에 맞는 Editor 버전이 설치되어 있지 않을 경우 경고창을 띄운 다음 프로젝트에 맞는 버전을 설치할 것인지, 프로젝트 버전에 가까운 LTS(Long Term Support)를 설치할 것인지, 아니면 기존에 설치 되어있는 Editor 버전으로 실행할 것인지를 선택할 수 있도록 한다. 예제 실행에 오류가 발생하지 않도록 프로젝트에 맞는 버전을 설치한다.

버전을 설치하였다면 Projects 목록에 Unity라는 이름의 프로젝트가 생성된다. 다른 프로젝트의 이름과 구분짓는 것을 원한다면 우측의 [...] 버튼을 눌러 프로젝트의 이름을 변경한다.

프로젝트를 실행시킨 화면이다. 개발자들의 개발 환경에 맞춰 레이아웃이 변경되어있음을 확인할 수 있다. 본인에게 익숙하거나 편한 GUI대로 창의 라벨을 드래그하여 위치를 옮기거나 메뉴 창의 [Window] -> [Layout]에서 화면 레이아웃을 변경할 수 있다.

Project창의 경로를 Assets/Project/Demos/Quadruped로 이동한 뒤, [MotionCapture] 씬을 더블클릭하여 실행한다.

씬이 변경되면 Hierachy 창에 ViewCamera, World_Dark, Editor등이 생긴 것을 확인할 수 있다. Editor를 클릭하여 Inspectr창에서 자세히 볼 수 있도록 한다. Editor 오브젝트는 Motion Editor 컴포넌트를 가지고 있는 것을 확인할 수 있다.

6.2 Motion Editor

MotionEditor는 Asset화 된 모션(이하 Motion Asset)의 목록 디렉터리를 가지고 개발자가 선택한 모션의 필요한 정보를 시각화 하는 역할을 한다. Motion Asset을 Frame(프레임) 단위로 분리하여 해당 프레임의 시계열 정보(해당 프레임은 Motion이 달리고 있는 상태인가?)를 관측하거나 N프레임 전 후를 동시에 시각화하여 학습할 데이터를 관찰하기 유용하도록 기능을 제공한다.

다음은 MotionEditor의 클래스 다이어그램이다.

다음은 MotionEditor의 필드이다.

Name	Data Type	Definition
Directiories	List<AssetDirectory>	Asset이 들어있는 디렉터리들의 묶음입니다.
session	AssetSession	현재 선택한 Asset입니다.
Assets	List<string>	Asset들의 이름 List입니다.
Asset	string	현재 선택한 Asset의 이름입니다.
TimeSeries	TimeSeries	시계열을 나타내기 위한 클래스 인스턴스입니다.

다음은 MotionEditor의 메소드이다.

Name	Return Type	Definition
LoadSession (string guid)	void	현재의 Motion Asset을 설정하기 위한 메소드들입니다.
OpenSession()	void
CloseSession()	void
GetSession()	AssetSession
Import()	void	Directories에 해당하는 디렉터리를 순회하며 Asset들을 LoadSession 합니다.
GetTimeSeries()	TimeSeries	시계열 TimeSeries을 반환합니다.
SetMirror()	void	대칭 여부 Mirror를 설정합니다.
GetTimeStamp()	void	시계열을 나타내기 위한 클래스 인스턴스입니다.
Play()	void	Start() 코루틴을 실행합니다.
IsPlaying()	bool	Play 코루틴이 실행되는지 반환합니다.
Play()	IEnumerator	Motion Asset 애니메이션을 실행합니다. Inspecter 창에서는 초록색 |> 버튼을 누르면 실행합니다.
OnRenderObject()	void	OnRenderObject는 카메라에 오브젝트가 렌더링 됐을 때 실행됩니다. 시리즈 데이터를 기반으로하여 미리보기 모션과 메시를 렌더링하고, 해당 객체의 공간 변형을 적용하여 화면에 표시합니다. 또한, 메시에 투명도를 적용하고, 이전 단계 및 다음 단계로의 이동에 따라 메시를 업데이트하고, 렌더링할 자산을 가져와 화면에 표시합니다.
GetMeshInstances()	Actor[]	모델링에 피부와 같은 Mesh가 필요한 오브젝트들을 찾아 반환합니다.
UpdateMeshinstance()	void	Mesh가 필요한 오브젝트를 찾아 위치를 변경합니다.
GetWindow()	float
GetView()	void
DrawRect	void
DrawWindow(Frame frame, float window, Color color, Rect rect)	void
DrawPivot(Rect rect)	void
DrawFunction()

AssetDirectory는 Path 변수에 Motion Asset이 담긴 디렉터리 경로를 저장해 놓은 다음 Motion Asset의 이름들로 반환한다.

AssetSession은 Motion Asset이다. 주체가 될 스켈레톤을 담당 할 Actor와 각각의 Bone들을 다룬다.

MotionEditor_Editor는 Editor를 상속하여 Inspector() 메소드를 사용하여 Unity Editor의 Inspector창에 MotionEditor를 다룰 수 있는 화면을 제공하는 클래스이다.

상단에서부터 Select All, Deselect All, Exporable Only버튼은 조건을 설정하여 Motion Asset 고를 수 있는 버튼이다.

그 아래의 초록색 창은 Unity Editor의 Asset/ 기준으로 Motion Asset의 디렉터리 경로를 설정할 수 있다. +로 검색경로를 추가할 수 있다.

Import 버튼을 눌러서 Motion Editor 창에 Motion Asset을 Import 할 수 있다.

Settings로 Motion을 시각화함에 세부 사항을 설정할 수 있다.

Asset Inspector에서 프레임을 고르고 재생시키거나 프레임 별 Module의 상태를 관측 할 수 있다. Add Module로 자신이 제작한 Module을 설정할 수 있다.

하단의 Settings로 모델의 위치나 크기, 대칭도, Motion Asset을 Export (학습 데이터로 사용할지) 여부를 결정할 수 있다.

6.2 AssetPipeline

상단 메뉴의 AI4Animation -> Tools -> AssetPipeline을 클릭한다. 클릭하면 AssetPipeline의 창이 나온다.

AssetPipeline은 BatchProcessor를 상속받은 클래스로 Pipeline을 Setup하여 해당 Pipeline에 맞게 Data를 처리 할 수 있도록 하는 화면을 제공한다. Editor에 모션을 적용할 MotionEditor 컴포넌트를 가지고 있는 오브젝트를 설정할 수 있다. (중복되었다면 Hierachy 창 기준 상단의 Editor를 자동으로 고르며, 이는 AssetPipeline창에서 변경 할 수 없으므로 Hierachy 창의 위치를 바꿔주어야 한다.) Setup에는 Data를 Pipeline하기 위하여 제작한 ScriptableObject를 고를 수 있다. Mode는 이후 설명하겠지만 QuadrupedPipeline의 모드를 변경 할 수 있다. Refresh 버튼을 누르면 조건에 맞는 MotionAsset들의 목록들이 등장한다.

BatchProcessor은 AI4Animation에서 사용하기 위해 제작한 기능들을 화면으로 띄워주기 위해 만든 클래스로 EditorWindow를 상속한다. 상단 메뉴에 AI4Animation에서 제공하는 기능들이 BatchProcessor나 EditorWindow를 상속받는다.

Unity에서 사용자 지정 에디터 창을 만들고 확장하기 위한 클래스로, 게임 오브젝트 및 에셋의 속성을 편집하거나 작업을 자동화하기 위한 도구를 개발할 때 사용된다.

다음은 AssetPipeline의 클래스 다이어그램이다.

다음은 AssetPipeline(+ BatchProcessor)의 필드이다.

Name	Data Type	Definition
Setup	AssetPipelineSetup	데이터처리를 위해 Setup된 AssetPipeline입니다.
Editor	Editor	MotionEditor를 나타냅니다.

다음은 AssetPipeline의 메서드이다.

Name	Return Type	Definition
Assign(AssetPipelineSetup)	void	AssetPipeline을 Set 합니다.

Data와 File은 각각 AssetPipeline에서 다루기 위하여 Data와 File을 추상화 한 것이다.

AssetPipelineSetup은 추상클래스로 데이터 가공을 하기 위한 Pipeline 모델의 추상화를 위한 클래스이다. 필드는 자신을 가지고 있는 AssetPipeline 하나를 가지고 있다.

다음은 AssetPipelineSetup의 추상메서드이다.

Name	Return Type	Definition
Inspector()	void	Inspector 창에
Inspector(AssetPipeline.Item)	void	Item을 입력받으면 아무 일도 일어나지 않습니다. 추상클래스의 모든 메서드를 상속해야 하므로 빈 메서드로 작성합니다.
CanProcess()	bool	프로세스 처리가 가능한지 반환합니다.
Begin	void	Export 모드일 경우 Input과 Output, Sequences 파일을 생성합니다. (Quadruped
Callback	void	자원을 관리하고 변경사항을 저장합니다. 사용되지 않는 에셋들을 언로드합니다.
Finish()	void	모드에 따라 Motion Asset을 편집하고, 변경사항을 저장합니다.
Iterate(MotionAsset)	IEnumerator	코루틴에서 사용하며 Motion Asset을 입력하면 프레임별로 파이프라이닝을 진행합니다.

다음은 QuadrupedPipeline의 클래스 다이어그램이다.

다음은 QuadrupedPipeline의 필드이다.

Name	Data Type	Definition
Mode	enum	QuadrupedPipeline의 모드를 설정하기 위한 열거형이다. ProcessAssets, ExportController, ExportControllerLMP, ExportControllerMANN가 있다.
mode	MODE	MODE의 변수이다. 기본값은 ProcessAssets이다.
Channels	int	학습할 모델의 채널 수이다. 4족보행 동물은 2~5, 이족보행은 5~8이 권장된다.
Timestamp	DateTime	학습된 시간대를 체크한다
Progress	float	진행도를 나타낸다.
SamplesPerSecond	float	초당 샘플링 속도를 나타낸다.
Samples	int	샘플 수를 나타낸다.
Sequence	int	샘플들을 쌓아올려 만들어낸 시퀀스의 수를 나타낸다.
S	AssetPipeline.Data.File	데이터 생성시 제작하는 Sqeunce 파일이다.
X, Y	AssetPipeline.Data	Export로 모드를 설정할 경우 생성되는 학습 데이터 Input, output 데이터이다.

다음은 QuadrupedPipeline의 메서드이다.

Name	Data Type	Definition
ProcessAssets	void	“Character”의 이름을 가진 오브젝트를 찾고 프레임단위(시계열로 표현)로 각각의 Module에 맞는 값을 반환합니다. StyleModule을 예시로 들면 해당 프레임이 평소 상태인지, 달리고 있는 상태인지를 구분하도록 한다.

중요하게 봐야 할 부분은 ProcessAsset 메서드이다. StyleModule를 예시로 보겠다. StyleModule은 애니메이션의 상태(State)를 구분하는 모듈로 예시에서는 Idle, Move, Speed가 있다. threshold는 임계점으로 하단부에 idle.StandardValues[f] = motion < threshold ? 1f : 0f ..를 보아 움직임이 임계점 이하일 경우 움직이지 않는 상태 (평상시, 이상적 상태)로 구분함을 알 수 있다. 마찬가지로 move는 idle이 아닐 경우 움직인다고 판단하는 것이고, speed는 움직이는 속도를 값으로 잡는다. 이를 보아 StyleModule를 추가하여 Head Bone의 위치에 따라 상태를 구분하여 포복, 엄폐 Style을 추가 할 수 있고, 이러하게 Module를 추가하여 다른 학습 매개변수를 추가 할 수 있음을 알 수 있다.

BipedPipeline.cs 코드를 들여다보면 Finish() 메서드 안에서 모든 Motion Asset의 Export를 false로 설정해두고 Retrieve를 사용하여 학습할 데이터를 잘라 지정한 프레임들만 Export = true로 바꾸어 학습할 데이터를 수동으로 전처리 하는 것을 확인 할 수 있다. SetSequence의 첫 번째 매개변수는 애니메이션을 자른 index 번호이고, 두 세 번째 매개변수는 각각 시작 프레임, 끝 프레임이다. 만약 300 프레임의 애니메이션이 있고, 10~90, 140~290 부분만을 학습하고 싶다면 SetSequence(0, 10, 90), SetSequence(1, 140, 290)으로 작성하여 추출하면 된다.

다음은 DeepPhasePipeline의 클래스 다이어그램이다.

다음은 DeepPhasePipeline의 필드이다.

6.3 Actor

다음은 Actor의 클래스 다이어그램이다. 액터 클래스는 Bone을 모은 스켈레톤을 나타낸다. Bone의 List를 가지고 UnityEditor에서 시각화하거나 특정 이름을 가진 Bone을 반환한다.

각 설명은 생략하겠습니다.. 죄송합니다..

AI4Animation 응용 – 이족보행

4족보행 Demo를 이족보행으로 변경하기 위하여 환경을 제작하여야 한다. 환경을 제작하는 것에 있어 다른 요소가 많기에 우선 Biped폴더를 복사한다.

Quadruped(4족보행)와 Biped(2족보행) 구분을 짓기 위하여 QuadrupedPipeline -> BipedPipeline, QuadrupedController_GNN -> BipedController_GNN으로 변경하고 각 코드를 열어 Quadruped로 작성되어 있는 부분을 전부 Biped로 변경한다.

학습환경을 제작하기 위해선 MotionCapture씬의 Edior->Character의 스켈레톤 구조가 학습할 애니메이션 데이터와 같아야 한다. 학습할 데이터의 스켈레톤 구조를 통일시키고 그에 맞게 모델의 스켈레톤 계층을 변경한다.

또한 각각 부위에 맞도록 QuadrupedPipeline.cs에 작성되어있던 BoneName들을 변경하여야 한다.

학습에 사용할 이족보행 데이터를 임포트하여야 한다. 단순히 드래그해서 임포트 하는 것이 아닌 Motion Asset화를 시켜야 함으로 AI4Animation에서 제작한 Importer를 사용한다.

상단 메뉴의 AI4Animation -> Importer -> (애니메이션 데이터 형태) Impoter를 실행한다.

<Path>에는 모션 데이터를 불러올 디렉터리를 작성한다. 우측 O 버튼을 눌러 파일 탐색기를 열어 디렉터리를 직접 탐색할 수도 있다.

Destination에서는 Asset/을 기준으로 Import 후 Asset 파일을 저장할 경로를 작성한다.

X축 기준, Y축 기준, Z축 기준으로 애니메이션을 Import할지를 결정할 수 있다. (축은 X Positive로 두고 하였다. 이후 스켈레톤에 애니메이션 메시를 입히는데 뒤집혀서 입혀지는 현상이 있었고, 이 축을 잘못 설정하여 import하였기에 이렇게 되었을까 생각하고 있다.)

Import에 성공하였으면 MotionEditor의 디렉토리를 입력하는 초록색 창에 Import한 MotionAsset 경로를 작성, Import버튼을 누른다.

스켈레톤의 구조를 맞게 설정하면 MotionEditor에 오류가 나지 않아아 하지만 간혹 Bone을 찾지 못한다는 오류가 생기는 경우가 있다. “Bone Hip does not Imported”와 같은 오류가 나온다면 Bone의 객체 이름만 바뀌고 cs 코드 내의 이름(BoneName)이 바뀌지 않아서 생기는 오류일 수 있다.

Character에 있는 Actor 스크립트에서 Skeleton을열면 아래와 같이 Skeleton을 조정할 수 있는 창이 확장된다. Reference에서 Hip > Hip으로 설정 후 Rename 버튼을 눌러  이름을 그대로 바꾸는 과정을 수행하면 Import 오류가 사라지는 것을 볼 수 있다.

이족보행 데이터를