Programming/UE5

[Udemy] 컨트롤 릭(Control Rig) 강의 듣는 중

Dorasima 2024. 9. 14. 14:59

거미나 지네 같이 여러개의 다리를 가진 Skeletal을 주변 환경에 맞춰서 Procedural 하게 + 자연스럽게 움직이게 하는 방법을 알려주는 강의다.

- 전갈(Scorpion) 예제로 강의를 시작한다.

 

1. 복습용으로 아이디어를 정리하면

1_1.  Full Body IK를 사용한다.

- 강의에서 제공하는 전갈 매쉬의 다리는 6개이다.

- 이것에 맞춰서 Full Body IK를 Tick 마다 계산하도록 한다. 

1) 액터의 움직임으로 속도계산 2) 전체 사이클 계수 및 각 다리 사이클 계산 3) 각 다리마다 뻗을 위치 계산 4) 다리 위치 보간 갱신 5) FullBody IK

 

1_2. 기본적인 다리 움직임

- 각 다리마다 움직임 사이클을 다르게 하여서,

  > 다리를 땅에 짚고 있는 시간에는 다리를 움직이지 않고,

  > 다리를 땅에서 떼는 시간에는 Actor의 속력에 맞춰서, 다리를 내려놓을 자리를 향해 움직이도록 하였다.

 

- 한 사이클은 (다리를 땅에 붙이고 있는 시간 + 다리를 굴러서 다음 자리에 가지고 가는 시간)이다.

 

- 다리를 뻗을 위치는,  Actor의 속도에 맞춰서 계산을 하게 된다.

 

- Actor의 속력이 빠를 수록, Cycle이 굴러가는 시간을 짧게 만들어서 다리를 빨리 구르도록 한다.

 

1_3.복잡한 지형에서 다리 움직임

- 지형이나 장애물에 맞춰서 다리를 뻗을 위치를 계산한다.

- 강의에서는 Sphere Trace By Trace Channel을 2번 하여서 최종 위치를 정하였다.

- 첫번째로, 액터 중심에서 다리쪽으로 충돌 테스트를 진행해서 몸체에서 잘리는 부분이나 도달할 수 없는 곳에 다리를 뻗지 않도록 한다.

- 두번째로, 낭떠러지나 내려가는 경사를 가진 부분에서 다리를 뻗을 곳을 찾기 위해 다리에서 액터 아래 쪽으로 충돌 테스트를 진행한다.

 

- 좀 더 좋은 결과를 내기 위해서는, 훨씬 많은 Trace를 한다고 한다.

 

1_4. 결과

옼... 신기하다.

 

Control Rig 클래스에서 Mesh Hierachy와 Bone Name만 바꿔주면, 이렇게 다른 Mesh에도 사용할 수 있다.

 

2. 참고 사항

- 전갈 친구가 아닌 다른 다지류는 저렇게 모든 다리가 따로따로 움직이지 않는다고 한다...

거미 : https://www.youtube.com/watch?v=NV8a4QJfHVg

지네 : https://www.youtube.com/watch?v=OoAV0V8mdKQ

 

3. 잡다 정리 + 인간형에게 쓸만한 기술

3_1. Spring Interpolate

- Forwards Solve 자체에서 보간을 해주는 친구인데, Spring 움직임을 가지게 해주는 해주는 친구

- Critical Damping이 1 이하 값을 가지면, 저렇게 띠요오옹(?) 거린다.

 

3_2. Value Over Time (Vector)

- 일정 시간동안, 버퍼의 개수만큼 위치를 기억하고, 그 시간이 지나면 해당 위치를 따라서 보간된 움직임을 보여준다.

- 시간 차를 두고, 돌아가야 자연스러운 친구들에게 쓰기 좋다.

 

3_3. Basic IK에서 Axis 쉽게 찾기

- 뼈가 많지 않은 skelmesh나 부위별로 움직이고 싶을 때는, Basic IK를 종종 사용하는데,

 

- 이때 Primary Axis나 Secondary Axis를 제대로 입력을 하지 않으면

- 위와 같은 일이 벌어진다.

 

- Primary Axis : Item A의 시작지점에서 끝 지점으로의 방향이다.

- Secondary Axis : Pole Vector와 함께 Item B가 지향하기를 원하는 방향이다.(야매지만 잘 통한다.)

- UpperArm을 예로 들면?

  > 어깨에서 팔꿈치 방향이 Primary Axis 인데 minus X 방향임을 알 수 있다.

(사진으로 보면 잘 안보이지만 빨간색이 x이고, 어깨위 머리를 가리키고 있다.)

  > Secondary Axis는 mesh 뒤쪽을 원하므로 positive Y 방향으로 정하면 된다.

- 이렇게 Pole Vector까지 Control로 만들어서, Basic IK에 넣어주면 된다.

 

3_4. PoleVector 계산하는 노드

- 그냥 Item A,B, Effector를 넣으면, 적절한 Pole Vector를 계산해주는 노드다.

- ComputePoleVector 을 적극 사용하자.

 

3_5. Aim 노드

- bone이 특정  방향이나 위치를 가리키도록 만드는 노드이다.

- Primary Axis와 Target으로 정렬을 한 다음에, Secondary Axis 와 Target 으로 정렬을 한다.

- Primary에서는 연두색 Control을 Target으로, Head bone의 local 정면인 positive Y를 Axis로 정하고

- Secondary에서는 머리 꽁지를 위를 지향하도록 만들어주기 위해, local 위쪽인 Positive X를 Axis로 정하고, 적당히 큰 Z값(2000)을 가지는 Target을 임의로 설정해주었다.

 

3_6. 응용해서 상반신을 자연스럽게

- Aim 노드, Spring Interpolate 노드, Value Over Time 노드를 이용해서,

- 상반신도 적절히 함께 움직이도록 만든다.

- 이런 식으로 Aim 노드에서 Weigth를 상대적으로 적게 잡아주고, Spring Interp과 Time 노드를 이용해서, 상반신(spine)의 고개를 살짝 늦게 따라 움직이도록 만든다.

나쁘지 않다.

 

3_7. 노이즈를 이용해서, 시선을 좀 더 자연스럽게

- Target이 너무 고정되어 있고, 그로 인해 머리도 너무 부자연스럽게 고정 되어있다.

- Target Location에 noise를 살짝 섞어준다.

오...

 

3_8. 숨쉬는 듯한 가슴 움직임

- 가슴쪽에 있는 bone의 Transform 중에 Scale을 적절히 건드려 주면 된다.

- UE5 Mannequinn의 경우 Spine04에 해당하는데...

- 이를 적절히 Delta와 Curve와 함께 Scale을 건드려주면?

오오...

 

3_9. 애니메이션과 함께 Level 위에 올리기

- 요로콤 ABP에서 Control Rig 변수를 제어할 수 있도록 Pin을 활성화 시킨다.

- 그리고 Level에 적당한 Target을 배치해주고, Blueprint를 통해서 ABP로 Location을 넘겨주면?

오오오...

 

3_10. Control Rig 함수 재사용 하기 (Function Reuse)

- 그냥 Control Rig 클래스에서 함수를 만든 다음, 접근 제어자를 Public으로 하면 그대로 다른 Control Rig에서 사용할 수 있다.

- 적절히 Input / Output을 지정하면, 다양한 Mesh에서도 사용할 수 있게 된다.

 

3_11. 점을 중심으로 회전하는 Control Rig

- Quat을 이용한 회전을 Unreal에서 제공한다.

- 그대로 사용하자.

 

3_12. Rig Space에서 Bone을 회전 시키기

- bone의 Local 좌표계, 즉, 부모 Bone을 기준으로 회전을 시키는 것이다.

- 그냥 제공되는 노드 함수 고대로 사용하면 된다.

 

 

 

4. 서있을 때, 자연스러운 방향 전환

 

(전갈 이후에 인간형에게 적용할 수 있는 기술을 응용해서 알려준다.)

 

4_1. 일단 Controller에 Mesh가 영향을 받지 않도록 고정시키기.

- 키보드 마우스로 움직이는 쿼터뷰 케릭터에게 WASD와 마우스 둘 다 영향을 주기 때문에

- 이를 적절히 처리해서 Mesh를 움직이게 만들어야 한다.

 

- 예제에서 제공하는 캐릭터 블루프린트는, 요로콤 Controller를 중심으로 동작을 하도록 설정이 되어있다.

 

- 일단 마우스 움직임으로, Mesh가 카메라를 따라서 같이 회전하는 것을 멈추기 위해

- 위에서 만들었언 Control Rig 함수와 함께, Mesh를 고정 시킨다.

 

- 아이디어는 Controller의 Yaw 움직임을 그대로 다시 Mesh에 반대로 곱하는 것이다.

 

4_2.  상체가 먼저 돌아가고, 다리가 따라간다.

(실제로 해보면, 아주 약간의 차이다.)

- Get Chain을 이용해서, Spine 01에서 Head까지

- Controller Rotation을 나눠서 적용 시킨다.

 

4_3. 시간에 따라 하체가 따라 돌아가게 한다.

- 일정 각도가 (예제에서는 20도) 돌아가면 accumul delta 값을 따라, 하체가 돌아가게 만든다.

 

4_4. 한쪽 다리가 먼저 움직인다.

(예제에서는 오른발이 무조건 먼저 움직이게 된다. 함수로 빼서 순서만 바꾸면 될 듯)

- 이렇게 오른발은 accuml delta가 0 ~ 0.5 사이일때 움직이고, 왼발은 0.5 ~ 1 사이일때 움직이게 하면된다. 

 

4_5. 이런저런 보완을 해보자

- 너무 큰 움직임은 나눠서 움직이게 한다다던가..

- 상체의 움직임을 제한한다던가..

- 한 다리씩 움직일 때 몸의 무게 중심을 반대쪽 발로 옮긴 다던가..

- 묘한 몸의 흔들림을 줘서 자연스럽게 한다던가...

 

- 그 결과는?