Base Skeleton 의 Animation 에 추가되는 Detail Animation 으로써, 움직임에 사실감과 재미를 더한다.
머리카락, 옷, 끈, 가슴 등 메인 애니메이션에 맞춰서 흔들려야 하는 곳에 적용한다.
구현 방법으로는 Anim Dynamics, Rigid Body Animation Node(RBAN), Physics Control, Cloth 등이 있다.
Design
Secondary Animation 을 구현하는 방법을 알아보기에 앞서 Design 에 대해 고민을 해 볼 필요가 있다.
Design 에 따라 노력 대비 결과물이 더 좋아 보이기도 나빠 보이기도 하기 때문이다.
Design 은 Bone 을 활용한 Rigidbody Physics 를 사용할 때 더욱 중요해 진다.
Good


아래와 같은 디자인이 Secondary Animation 을 구현하는데 유리하다.
- 상체부분과 하체부분이 연결되어 있지 않은 디자인
- 앞, 옆, 뒤 부분 으로 나누어져 있어서 팔다리가 사이사이로 나올 수 있는 디자인
Bad

위와 같은 의상을 입은 캐릭터가 쪼그려 앉거나 다리를 찢는다면, Bone 사이의 Skin 이 심하게 늘어날 것이다.
첫번째 치마 같은 경우 Bone(Rigidbody) Physics 사용 시, 서로 다른 체인의 Body 와 Body 사이에 충돌 처리를 할 수 없어서 다리가 치마를 뚫고 나올 것이다.
Conclusion

결론은 만세/다리 찢기/쪼그려 앉기 등 캐릭터가 취할 수 있는 최대 가동 범위의 포즈(Extreme Pose)를 취했을 때도 보기 좋은 디자인이 Secondary Animation 을 Set up 하기에도 좋고 움직였을 때도 보기 좋다는 것이다.
그렇게 하기 위해서는 Design 시 Extreme Pose 상태도 고려해서 최대한 찢어 놓는 것이 좋겠다.
Anim Dynamics
Secondary Animation 을 구현하는 방법 중에 첫번째로 Anim Dynamics 가 있다.
귀걸이 같이 충돌처리가 필요 없거나, 간단한 충돌 처리만 필요한 경우 가볍게 Physics 움직임을 Simulation 한다.
How to Set Up

Dynamic 을 적용할 Bone 을 선택한다. Bone 이 Chain 형태라면, End Bone 도 선택한다.


Box Extents 와 Local Joint Offset 을 조절해서, Bone 이 Drive 하는 Mesh 에 맞게 Box 의 크기 및 위치를 맞춘다.
너무 가늘게 만들면, 시뮬레이션이 불안정해진다. 길이의 반 정도 수치로 두께를 준다.

Twist Axis 및 Angular Limits 를 설정한다.

Alpha 값으로 움직임의 강도를 조절한다.
Issue
FPS 에 따라 움직임이 달라지는 이슈가 있는 듯 하다.
t.maxFPS 콘솔명령을 사용해서, 낮은 FPS 에서도 잘 동작 하는지 확인한다.
Kawaii Physics
일본인 개발자가 Anim Dynamics 를 커스터마이징 한 피직스 노드이다.
복원력이 좋아서 시뮬레이션이 터지는 경우가 잘 없이 안정적으로 동작 한다고 한다.
스텔라블레이드, P의 거짓, 철권8 등 잘 알려진 프로젝트 들에서 많이 사용되어 어느정도 검증된 플러그인이라고 할 수 있다.
Tutorials
흔들림 물건 초도 아마추어가 KawaiiPhysics를 사용해, 감각을 의지해 여성 캐릭터 모델의 Kawaii를 늘리는 방법 정리
다른 피직스 에셋과 마찬가지로, 모듈 방식의 캐릭터를 구성할 때 Blueprint 에서 Set Leader Pose 로 Main Skeleton 의 애니메이션을 따라가게 하면 Animation Blueprint 가 작동하지 않기 때문에 피직스가 적용되지 않는다. Main Skeleton 의 애니메이션을 적용 시 Animation Blueprint 에서 Copy Pose From Mesh 를 사용해야 한다.
Collision
본으로 피직스를 셋팅할 경우, 치마의 경우에 다리가 본 사이를 뚫고 나오는 것이 항상 문제인데 아래의 자료들을 참고해 볼만 하다.
https://kairandou.blogspot.com/2020/10/unitydynamic-plane-colliderdynamic-bone.html
Rigid Body Animation Node (RBAN)
Anim Dynamics 및 Kawaii Physics 보다 비싸지만, 더 좋은 퀄리티의 Physics Simulation 을 할 수 있다.
충돌 처리가 가능한 Physics Asset 을 사용해서 Physics 움직임을 Simulation 한다.
기본적인 작업 흐름은 아래와 같다.
- Skeleton 의 Attached Asset 들을 제거 한다. (제거하지 않을 시 정상적인 시뮬레이션이 되지 않는다.)
- Bone 에 Collision Shape 추가 및 설정
- Collision Shape 간에 Constraint 설정
- Collision Shape 간에 Collide 설정
Solver Type
작업을 시작하기에 앞서 먼저 Solver Type 을 설정한다.

Ragdoll 로 사용하는 경우에는 World 로 설정하고, Animation Blueprint 에서 사용하는 경우에는 RBAN (Rigid Body Animation Node) 로 설정해야 실제 인게임에서의 움직임에 가깝게 시뮬레이션 된다.
Shape of Body


Show All Bones 를 해서 Bone 을 보이게 하고, Bone 을 선택한 후 Shape 을 추가하고 조절한다.

Shape 은 Box vs Box 가 가장 비싸고, Sphere 형태에 가까울 수록 비용이 싸다.
주로 Capsule 형태를 사용하게 된다.

Chain 구조는 Parent 와 Child 의 Shape 을 겹쳐서, 다른 Shape 이 틈 사이로 뚫고 지나가지 못하게 한다.

Shape 들을 선택하고, Mirror 를 사용하면 반대쪽을 쉽게 만들 수 있다.
Constraint
Shape 을 만들고 설정을 해 주었다면, Body 간에 Constraint 를 만들고 설정해서, 중력에 의해 바닥으로 떨어지지 않고 Parent Body 에 매달려 있도록 셋팅 한다.

Child Body (Driven Body) 를 선택하고, Parent Body (Driver Body) 를 선택한 다음 Ctrl+Y 를 누르면 편하게 Constraint 를 만들 수 있다.


Child Body 가 움직일 때 Pivot 이 될 곳에 위치 시키고, 각도도 조절한다.

Linear 및 Angular Limits 를 설정해서 움직임에 제약을 준다.

상위의 Body 들을 Kinematic 으로 설정하면, 정확한 움직임을 확인할 수 있다.

특정 방향으로만 움직이게 하려면, Constraint Transforms > Child 의 값들을 조절해 줘야 한다.
Physics Properties
Physics Type

Bone Animation 을 따라가는 Body 의 Physics Type 은 Kinematic 으로 설정하고, Simulation 되어야 하는 Body 는 Simulated 로 설정한다. 기본 상태인 Default 로 두면 Physics Asset Editor 및 Level Editor 에서는 정상적으로 Simulation 되지만, Animation Blueprint 의 Rigid Body Node 에서 Simulation 되지 않는다.
Mass
질량이 커질수록 움직이는데 더 큰 힘이 필요하다. 즉, 질량이 작을수록 더 많이 움직인다.


Chain 의 경우 Child 로 갈수록 Mass 가 줄어들게 해야 움직임이 안정된다. Child 의 Mass 총합이 Parent 의 Mass 를 넘기지 않도록 한다.
Damping
에너지를 잃어버리는 정도이다. 수치가 높을수록 빠르게 멈추고 뻣뻣한 느낌이 든다.

이동과 회전 Damping 값을 따로 설정할 수 있다.
Inertia Tensor
회전에 대한 저항. 수치가 클수록 회전을 덜 하게 된다.

각 축의 회전에 대해서 따로 설정할 수 있다. 예를 들어 Y 축으로 긴 모양은 Y 값만 높여주면 정육면체 처럼 회전한다.

Collision Setting

출동처리 되어야 하는 Body 들을 선택해서 Enable Collision 을 실행한다.

선택한 Body 와 Collision 이 되는 Body 들은 연보라색을 띈다.

Chain 을 이루는 Body 들은 Disable Collision 을 해줘야, 겹쳐진 Body 들이 Collision 처리를 하지 않아서 안정적이게 된다.
Shortcuts
- Ctrl + 2: Add Capsule Shape for Selected Bone
- Alt + I: Simulate Toggle
- Ctrl + RMB Drag: Drag Body While Simulated
- Ctrl + C: Copy Properties
- Ctrl + V: Paste Properties
- Ctrl + Y: Constraint First Selected Body to Second Selected Body
- M: Mirror
- G: Toggle Isolate Selected
- Ctrl + G: Hide All
- Shift + G: Show All

Body 간의 Collision 을 설정할 때, 두개의 Body 를 선택하고 Enable/Disable 하게 되는데 위와 같이 Editor Preferences 에서
collision 을 검색해서 Ctrl+Shift+D/Alt+Shift+D 로 단축키를 설정해 놓으면 편하다. (기본 설정인 Right Bracket 이 작동하지 않는다.)
Console Variables
- p.chaos.debugdraw.enabled 1
- p.Chaos.DebugDraw.ColorShapesByIsland 1
- ShowFlag.TemporalAA 0
- ShowFlag.MotionBlur 0
- p.ForceDisableAsyncPhysics 1
- p.Chaos.Solver.DebugDrawShapes 1
- P.chaos.immphys.debugdrawshapes 1
- P.chaos.immphys.debugdrawcollisions 1
- P.chaos.immphys.debugdrawjoints 1
- p.Chaos.ImmPhys.lIterations 3
- p.Chaos.ImmPhys.Collision.Pairlterations 2
- p.Chaos.ImmPhys.Joint.Pairlterations 2
- p.Chaos.ImmPhys.PushOutlterations 1
Animation Blueprint

Secondary Animation 을 위해 제작된 Physics Asset 은 Skeletal Mesh 의 Post Process Anim Blueprint 에서 사용되는 Animation Blueprint 에서 RigidBody 노드를 통해 호출된다.

Override World Gravity, Compute Linear Acc Scale, Component Linear Vel Scale Component Applied Linear Acc Clamp, Simulation Space 등을 위 이미지를 참고해서 설정한다.




Sequence Player 및 Transform Bone 노드를 앞쪽에 연결해서 움직임을 주면, Physics 의 상태를 체크 하는데 용이하다.
Physics Control
References
Examples
Party Animals 처럼 Physics 가 섞인 플레이에 사용할 수 있을 것이다.

Zelda BotW(Breath of the Wild) 의 Stalkoblin 이 분해되고 합체되는 것처럼, Kinematic Animation 과 Physics Animation 을 섞어서 연출하는데 사용될 수 있을 것이다.
Cloth
비용이 가장 비싼 만큼, 리얼한 옷 주름 표현이 필요한 경우에 사용을 고려해 볼 수 있다.
Tutorials
- https://dev.epicgames.com/community/learning/tutorials/2YW1/unreal-engine-echo-cape-tutorial
- https://dev.epicgames.com/community/learning/tutorials/VLb5/unreal-engine-cloth-lod-tutorial
Workflow
Preparing Render and Proxy Mesh
균일하고 단순한 형태의 Proxy Mesh 를 Simulation 하고, Render Mesh 에 Data 를 전달(Maya 의 Wrap 과 유사)한다.



- Proxy Mesh 와 Render Mesh 모두 Skin 된 상태여야 하고, Unreal Engine 에서 Section 구분을 위해 서로 다른 Material 이 적용되어 있어야 한다.
- Unreal 에서 Cloth 를 적용하는 Section 의 Material 은 “Usage > Use with Clothing” 옵션을 활성화 해야 한다. 비활성화 된 경우 Build 된 게임에서 Material 이 적용되지 않아서, 해당 Mesh 의 Material 이 표시되지 않는다.
- 옷의 일부 영역에만 Cloth 를 적용 할 때 Proxy Mesh 전체를 Simulation 에 의해 움직이게 하면 Render Mesh 에서 Cloth 가 적용된 경계 부분이 찢어진다. 따라서 경계 부분의 일정 영역은 Skin 에 의해 움직이게 설정해야 하기 때문에 Proxy Mesh 의 Resolution 을 너무 낮게 제작하지 않는다.
- Proxy Mesh 를 제작 시 Quad 로 만들어서 Unreal Engine 에 Import 시 자동으로 삼각형이 만들어 지게 할 수도 있지만, 접히는 모양을 고려해서 Face 의 대각선 Edge 를 수동으로 추가하면 접히는 형태를 컨트롤 할 수도 있다.
Creating Cloth with Proxy Mesh

Proxy Mesh Section 을 Isolate 하고 Mesh 를 선택한 후, RMB > Create Clothing Data from Section > Create 을 한다.
Proxy Mesh 로 Render Mesh 를 드라이브 하기 때문에 Remove from Mesh 를 선택해서 Skeletal Mesh 에서 제거한다.
Connecting to Render Mesh


Render Mesh Section 을 Isolate 하고 RMB > Apply Clothing Data… 으로 이전 과정에서 생성한 Cloth Asset 을 적용 한다.
Viewport 에서 적용할 수도 있고, LOD Sections 에서 적용할 수도 있다.

Proxy Mesh 의 Resolution 이 너무 낮을 경우 Render Mesh 가 지글 거릴 수 있는데, MESH SKINNING 에서 Use Multiple Influences 를 활성화 하고 Kernel Radius 값을 올려 준다.
- Use Multiple Influences: Proxy Mesh 의 최대 5개의 Vertex 로 부터 영향을 받는다.
- Kernel Radius: Proxy Mesh 의 Resolution 에 영향을 받는다. Proxy Mesh 의 Resolution 이 낮을 수록 수치를 올려줘야 할 것이다.
- Smooth Transition From Skin to Cloth: Max Distance 속성 값을 사용해서 Skin Mesh 와 Simulation Mesh 를 부드럽게 Transition 되도록 Blend 한다.
Cloth Properties
개인적 경험을 바탕으로 속성에 관해 아래와 같이 정리해 둔다.

Environmental Properties
- Damping Coefficient: 값이 높을수록 무거운 느낌이 난다.
- Gravity Scale: 값이 높을수록 무거운 느낌이 난다.
Animation Properties
Input Mesh (Skin Mesh) 에 영향을 받는 정도를 설정한다.
- Anim Drive Stiffness: Lo 값이 높을수록 Input Mesh 를 따라간다.
Preview Animation 을 적용하고 수치를 조정하면, 좀 더 직관적으로 원하는 느낌을 찾아갈 수 있다.
Painting Masks

Material Properties 의 Weight 를 설정한다.
Mass

Edge Stiffness

많이 늘어나는 Mesh 일 경우에만 1 미만의 값을 사용한다. Iteration 값이 높을수록 덜 늘어난다.
Bend Stiffness

수치가 낮을수록 주름이 많이 생긴다. Iteration 값이 높을수록 주름이 덜 생긴다.
Buckling

Bend 에 대해 좀 더 정확한 계산을 하는 Use Bending Elements 를 활성화 하면 사용할 수 있다. 잡혀있는 주름을 유지하면서 주름을 만든다.
Long Range Attachment

Max Distance

Backstop

Normal 반대 방향으로의 움직임을 제한한다.
Collision Shape 과의 충돌 계산을 하지 않음으로써 퍼포먼스 향상을 기대할 수 있다.
Pressure

풍선처럼 부풀어 오르게 한다.
Hiding Proxy Mesh

Proxy Mesh Section 의 Material Icon 위에서 RMB > Disable 를 실행해서 Proxy Mesh 가 나타나지 않도록 한다.
Physics Asset

Cloth 의 충돌 처리를 위해 Physics Asset 을 적용한다.
Physics Asset 을 수정한 경우, Skeletal Mesh Asset Editor 닫았다가 다시 열어야 수정 된 내용이 반영된다.
Testing and Debugging

Preview Animation 을 적용하거나, Character > Clothing > Wind Strength 를 조절해서 Cloth 의 움직임을 테스트 해 볼 수 있다.
SkeletalMesh Editor CVAR Commands
- P.ChaosClothEditor.DebugDrawCollision 1
- p.ChaosClothEditor.DebugDrawPhysMeshShaded
- p.ChaosClothEditor.DebugDrawPhysMeshWired
- p.ChaosClothEditor.DebugDrawAnimMeshWired
- p.ChaosClothEditor.DebugDrawParticleIndices
- p.ChaosClothEditor.DebugDrawElementindices
- p.ChaosClothEditor.DebugDrawPointNormals
- p.ChaosClothEditor.DebugDrawinversedPointNormals
- p.ChaosClothEditor.DebugDrawBackstops
- p.ChaosClothEditor.DebugDrawBackstopDistances
- p.ChaosClothEditor.DebugDrawMaxDistances
- p.ChaosClothEditor.DebugDrawMaxDistanceValues
- p.ChaosClothEditor.DebugDrawAnimDrive
- p.ChaosClothEditor.DebugDrawBendingConstraint
- p.ChaosClothEditor.DebugDrawLongRangeConstraint
- p.ChaosClothEditor.DebugDrawWindForces
- p.ChaosClothEditor.DebugDrawLocalSpace
Editor CVAR Commands
- p.ClothPhysics
- p.ClothPhysics.WaitForParallelClothTask 1
- p.ChaosCloth.DebugDrawPhysMeshWired 1
- p.Chaos.DebugDraw.Enabled 1
- ShowFlag.TemporalAA 0
- ShowFlag.MotionBlur 0
- Stat ChaosCloth
- Stat Physics