다이내믹 애니메이션 제작

AnimDynamics 를 사용하여 캐릭터에 물리 기반 이차 애니메이션을 주는 법입니다.

Windows
MacOS
Linux

캐릭터 동작의 사실감을 향상시킬 수 있는 한 가지 방법은, 캐릭터가 들거나 입고 있는 아이템에 동적인 애니메이션을 주는 것입니다. AnimDynamics (애님 다이내믹스)로 현실에서 움직일 것으로 기대되는 부분(헤어, 목걸이, 팔찌, 칼, 주머니 등)을, 캐릭터가 움직이면 같이 움직이도록 만들 수 있습니다.

여기서는 캐릭터에 애님 다이내믹스를 적용시켜 아래와 같은 효과를 내 보도록 하겠습니다:

위에서, 캐릭터의 목에 걸어 들고 다니는 장비와 풀무에 애님 다이내믹스가 적용되어 있습니다. 캐릭터가 움직임에 따라, 장비가 약간씩 움직이며, 풀무는 약간 더 앞뒤로 움직입니다. 움직이는 정도는 AnimDynamics 노드의 디테일 패널을 통해 조절하여 원하는 효과를 얻을 수 있습니다. 컨스트레인트를 추가하여 본의 이동 방식을 추가 조정할 수 있습니다.

애님 블루프린트가 있는 캐릭터와 애님 다이내믹스로 구동시킬 준비가 된 본이 있으면, 2 단계로 진행하세요.

1 - 필수 구성

캐릭터에 다이내믹 애니메이션을 적용하기 전, 사용하고픈 캐릭터를 먼저 준비해야 합니다. 템플릿 캐릭터에는 사용할 수 있는 다이내믹 본이 없습니다. 인피니티 블레이드 캐릭터에는 있긴 하지만 애니메이션이 없으므로, 템플릿 캐릭터의 애니메이션을 리타기팅하여 가져오도록 하겠습니다.

여기서는 블루프린트 삼인칭 템플릿을 사용하여 새 프로젝트를 만들었습니다.

그런 다음 마켓플레이스에서 무료로 받을 수 있는 Infinity Blade: Adversaries 팩을 프로젝트에 추가했습니다.

AdversariesPack.png

블루프린트 삼인칭 기반 템플릿 프로젝트를 열고 인피니티 블레이드 애셋을 추가한 후:

  1. 콘텐츠 브라우저 에서 Content/Mannequin/Character/Mesh 아래 UE4_Mannequin_Skeleton 애셋을 엽니다.
    1_OpenMesh-2.png

  2. 리타깃 매니저 버튼을 클릭하고, Select Rig (릭 선택) 아래 Humanoid (인간형) 릭을 선택합니다.
    2_SetRig-2.png

    이 캐릭터의 애님 블루프린트와 애니메이션을 인피니티 블레이드 캐릭터로 리타기팅 하겠습니다.

  3. 콘텐츠 브라우저 에서 Infinity Blade Adversaries 폴더의 SK_Master_Grunt_Skeleton 을 찾아 엽니다.
    3_OpenGrunt-1.png

  4. 리타깃 매니저 버튼을 클릭하고, Select Rig (릭 선택) 옵션 아래 Humanoid (인간형) 을 선택합니다.

  5. 릭의 각 노드에 대해, 스켈레톤에서 본을 할당합니다.
    4_AssignBones-1.png

    전체 할당 내역은 아래 표와 같습니다.

    노드 (릭)

    본 (스켈레톤)

    Root

    b_MF_Root

    Pelvis

    b_MF_Pelvis

    spine_01

    b_MF_Spine_01

    spine_02

    b_MF_Spine_02

    spine_03

    b_MF_Spine_03

    clavicle_l

    b_MF_Clavicle_L

    upperarm_l

    b_MF_UpperArm_L

    lowerarm_l

    b_MF_Forearm_L

    hand_l

    b_MF_Hand_L

    clavicle_r

    b_MF_Clavicle_R

    upperarm_r

    b_MF_UpperArm_R

    lowerarm_r

    b_MF_Forearm_R

    hand_r

    b_MF_Hand_R

    neck_01

    b_MF_Neck

    head

    b_MF_Head

    thigh_l

    b_MF_Thigh_L

    calf_l

    b_MF_Calf_L

    foot_l

    b_MF_Foot_L

    thigh_r

    b_MF_Thigh_R

    calf_r

    b_MF_Calf_R

    foot_r

    b_MF_Foot_R

    리타기팅을 진행하기 전, 애니메이션이 정상 재생될 수 있도록 Translation Retargeting (이동 리타기팅)을 조절해 주도록 하겠습니다.

  6. 스켈레톤 트리 에서 Show Advanced Options (고급 옵션 표시) 버튼을 누릅니다.

  7. b_MF_Root 본에 우클릭 한 뒤 Recursively Set Translation Retargeting Skeleton (스켈레톤의 트랜슬레이션 리타기팅 재귀적 설정)을 선택합니다.
    5_TranslationRetargetingA-1.png

  8. Translation Retargeting (이동 리타기팅) 아래, set b_MF_RootAnimation (애니메이션) 으로, b_MF_PelvisAnimation Scaled (스케일 적용 애니메이션)으로 설정합니다.
    5_TranslationRetargetingB-1.png

    스켈레톤 구성이 완료되어 이제 템플릿 캐릭터에서 애님 블루프린트와 애니메이션을 리타기팅할 수 있습니다.

  9. ThirdPersonAnimBP 로 탐색하여 우클릭 한 뒤 Duplicate Anim Blueprints and Retarget (애님 블루프린트 복제 및 리타깃)을 선택합니다.
    6_RetargetAnimBP-1.png

  10. Select Skeleton (스켈레톤 선택) 창에서, SK_Master_Grunt_Skeleton 애셋을 선택한 뒤 Retarget (리타깃)을 선택합니다.
    7_SetTarget-1.png

    원한다면 Change... (변경) 버튼을 눌러 리타기팅된 애셋을 복사할 위치를 할당할 수 있습니다.

  11. 복제된 애셋 위치를 탐색하여 새 애님 블루프린트 이름을 GruntAnimBP 로 바꿉니다.
    8_RenameAnimBP-1.png

  12. ThirdPersonCharacter 블루프린트를 탐색하여 엽니다.
    9_OpenThirdBP-1.png

  13. 아래 Components (컴포넌트) 창에서 Mesh (메시)를 선택한 뒤, 디테일 패널에서 SK_Master_GruntGruntAnimBP_C 를 할당합니다.
    10_AssignNewCharacter-1.png

  14. 컴파일, 저장, 후 블루프린트를 닫습니다.

이제 에디터에서 플레이해 보면, WASD스페이스 바 로 달리고 점프할 수 있는 그런트 캐릭터를 제어하고 있습니다.

캐릭터의 목에 걸린 장비와 풀무의 제한된 움직임을 보세요. 비교적 고정된 것으로 보이며, 캐릭터의 이동에 따라 이 오브젝트도 같이 움직이니 캐릭터가 더욱 자연스러워 보입니다.

다음 단계에서는 애님 다이내믹스 노드로 장비와 화로에 애니메이션을 적용하여 캐릭터 운동에 반응하도록 하겠습니다.

2 - 애님 다이내믹스 적용

캐릭터에 애니메이션 블루프린트 와 동적 애니메이션을 적용할 본이 준비되었으니, 애니메이션 블루프린트애님 그래프 에서 AnimDynamics 노드 작업을 해 주면 되겠습니다.

우리 예제에서, 캐릭터는 목에 커다란 장비를 달고 다니는데, 여기에 캐릭터의 이동에 따라 애니메이션을 적용하고 싶습니다. 별도의 캐릭터를 사용중이시라면, 아래 단계에서 AnimDynamics 로 구동시키고자 하는 본을 할당해 주고 원하는 대로 세팅을 조절해 주시면 됩니다.

단계

  1. 콘텐츠 브라우저 에서 캐릭터의 애니메이션 블루프린트 (GruntAnimBP) 를 엽니다.

    1_OpenAnimBP.png

  2. 내 블루프린트, 애님 그래프 를 클릭하여 애니메이션 그래프를 엽니다.

    2_AnimGraph.png

  3. 그래프에 우클릭 하고 AnimDynamics 노드를 검색하여 추가합니다.

    3_AddNode.png

    AnimDynamics 노드는 External Force 값을 받는데, 시뮬레이션의 모든 바디에 적용되는 외부의 힘을 말합니다 (옵션이지만 고려는 해볼 만 합니다). Component Pose 라는 레퍼런스 포즈 데이터와 아울러 Alpha 값도 (스켈레탈 컨트롤을 적용할 세기로, 0 은 없음, 1 은 최대) 받습니다.

  4. 노드를 복사 하고 붙여넣기 한 뒤, 아래와 같이 노드를 연결합니다.

    4_ConnectNodes.png

    핀을 연결할 때 Local to ComponentComponent to Local 이 자동 생성됩니다.

    우리 예제에서는 AnimDynamics 노드를 두 개 (하나는 Harness(장비)에, 다른 하나는 Furnace(풀무)에) 사용하고 있습니다.

  5. 시퀀스의 첫 번째 AnimDynamics 노드를 선택한 뒤, 디테일 패널에서 아래와 같이 세팅을 할당합니다.

    5_Furnance1.png

    Preview 섹션은 뷰포트에서 운동에 적용되는 현재 제한 값을 알아보는 데 도움이 되는 시각화입니다. (이 예제에서는 다루지 않지만 실험해 볼 수 있는 세팅인) Planar Limits (평면형 제한)을 사용하거나 CoM (Center of Mass, 질량 중심)이 켜져있지 않은 경우, Collision Spheres (콜리전 구체)를 확인할 수도 있습니다.

    마지막으로 설정할 것은 Bound Bone 또는 캐릭터의 furnace 본에 설정하여 영향을 끼치고 있는 본(이 본이 Harness(장비)에 영향을 끼치는 것)입니다.

  6. 이 노드를 선택한 채, SetupConstraint 섹션을 아래와 같이 설정합니다.

    6_Furnance1.png

    SetupConstraint 섹션은 애님 다이내믹스로 구동되는 본의 운동 및 그 범위를 정의하는 곳입니다. Box Extent 는 관성을, Local Joint Offset 은 피벗 포인트를, Angular Limits 는 운동의 회전 범위를 나타냅니다 (각각 프리뷰 시각화 옵션을 켜서 확인할 수 있습니다).

    Setup 및 Constraint 섹션 관련 상세 정보는 스켈레탈 컨트롤 문서를 참고하세요.

  7. 컴파일 버튼을 클릭하고 장비가 좌우로 흔들리는 모습을 확인해 보세요.

    6_Furnance1b.png

    Y 축에 대한 Angular Limits 가 꽤 큰데, 위 그림에서 초록색 원뿔로 보이는 부분입니다. 이 범위를 줄여봅시다.

  8. 이 노드를 여전히 선택한 채 Constraints 섹션에서, Angular LimitsMin/Max 값을 아래와 같이 바꿉니다.

    6_Furnance1c.png

    이번에 컴파일 하면, (SpeedIsInAir? 세팅을 변경해도) 장비가 이전처럼 많이 움직이지 않을 것입니다.

    6_Furnanced.png

  9. 시퀀스의 두 번째 AnimDynamics 노드를 선택하고 다음 세팅을 사용합니다.

    클릭하면 원본을 확인합니다.

    위의 세팅을 가지고, Bound Bone 이 이제 풀무 오브젝트에 영향을 끼치는 캐릭터의 Furnace_Pivot 본을 타깃으로 하도록 변경해 주었습니다. Twist AxisY 축으로 뒤틀리도록 조정하여 좌우가 아닌 전후 운동을 하도록 했습니다. Angular Limits 는 -50 에서 50 으로 운동 범위를 설정했습니다.

  10. 컴파일, 저장 후 에디터에서 플레이 합니다.

최종 결과

이제 캐릭터가 움직이면 컨스트레인트 세팅에 따라 풀무도 같이 움직이는 것이 보일 것입니다.

Setup 섹션의 Box Extent, Local Joint Offset 값은 물론 Constraints 섹션의 LinearAngular Limits 값도 자유롭게 변경하면서 애님 다이내믹스가 본의 운동에 어떤 영향을 끼치는지 실험해 보시기 바랍니다.

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼