거미나 지네 같이 여러개의 다리를 가진 Skeletal을 주변 환경에 맞춰서 Procedural 하게 + 자연스럽게 움직이게 하는 방법을 알려주는 강의다.
- 전갈(Scorpion) 예제로 강의를 시작한다.
1. 복습용으로 아이디어를 정리하면
1_1. Full Body IK를 사용한다.
- 강의에서 제공하는 전갈 매쉬의 다리는 6개이다.
- 이것에 맞춰서 Full Body IK를 Tick 마다 계산하도록 한다.
1_2. 기본적인 다리 움직임
- 각 다리마다 움직임 사이클을 다르게 하여서,
> 다리를 땅에 짚고 있는 시간에는 다리를 움직이지 않고,
> 다리를 땅에서 떼는 시간에는 Actor의 속력에 맞춰서, 다리를 내려놓을 자리를 향해 움직이도록 하였다.
- 한 사이클은 (다리를 땅에 붙이고 있는 시간 + 다리를 굴러서 다음 자리에 가지고 가는 시간)이다.
- 다리를 뻗을 위치는, Actor의 속도에 맞춰서 계산을 하게 된다.
- Actor의 속력이 빠를 수록, Cycle이 굴러가는 시간을 짧게 만들어서 다리를 빨리 구르도록 한다.
1_3.복잡한 지형에서 다리 움직임
- 지형이나 장애물에 맞춰서 다리를 뻗을 위치를 계산한다.
- 강의에서는 Sphere Trace By Trace Channel을 2번 하여서 최종 위치를 정하였다.
- 첫번째로, 액터 중심에서 다리쪽으로 충돌 테스트를 진행해서 몸체에서 잘리는 부분이나 도달할 수 없는 곳에 다리를 뻗지 않도록 한다.
- 두번째로, 낭떠러지나 내려가는 경사를 가진 부분에서 다리를 뻗을 곳을 찾기 위해 다리에서 액터 아래 쪽으로 충돌 테스트를 진행한다.
- 좀 더 좋은 결과를 내기 위해서는, 훨씬 많은 Trace를 한다고 한다.
1_4. 결과
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. 이런저런 보완을 해보자
- 너무 큰 움직임은 나눠서 움직이게 한다다던가..
- 상체의 움직임을 제한한다던가..
- 한 다리씩 움직일 때 몸의 무게 중심을 반대쪽 발로 옮긴 다던가..
- 묘한 몸의 흔들림을 줘서 자연스럽게 한다던가...
- 그 결과는?
'Programming > UE5' 카테고리의 다른 글
HD - 2D(?)에서 Mouse Cursor to World location (0) | 2024.06.10 |
---|---|
[Udemy] 언리얼로 2D 게임 만들기 찍먹 (0) | 2024.06.05 |
[Udemy][메모용] Unreal Engine 미세 꿀팁(?) 정리 (0) | 2024.01.25 |
[SequencePlayer] 시네마틱 (Cinematic) 찍먹 (0) | 2023.09.22 |
[Regex] 유효한 에셋 이름 정규식으로 체크하기 - 메모용 (0) | 2023.09.02 |