티스토리 뷰
Shape Control 마을에 오신 여러분, 반가워요!
여러분은 지금부터 마을의 입구부터 시작해서 토끼들의 움직임을 구현하기까지의 여행을 저와 함께 떠나볼 거예요.
그럼 준비되셨나요?

앗, 입구부터 이상하게(?) 생긴 녀석들이 나타났어요!
겁먹지 말아요. 이 세 친구는 토끼의 움직임을 구현하는 데 가장 기본이 되는 친구들이랍니다.
앞으로 이 세 친구들을 중심으로 여행을 떠나게 될 테니, 오늘은 한번 이 친구들과 친해져 보는 시간을 가져 볼게요.

먼저 Local이라는 친구부터 만나볼게요.
이 친구는 원하는 객체(파란색)의 위치를 기준이 되는 객체(초록색)의 좌표계로 표현하는 방식을 뜻한답니다.
참, 말이 나온 김에 말인데, 앞으로는 편의를 위해 원하는 객체(파란색)는 Target, 기준이 되는 객체(초록색)는 Source라고 표현할게요!
만약 여러분이 유니티에 익숙하다면 Local이 비교적 친숙한 개념이라고 느끼실 수 있는데, 이것이 바로 Target 객체의 transform.localPosition과 같은 개념이기 때문이에요.
여기서 localPosition이 있는데도 Local이라는 친구를 따로 사용하는 이유는, 유니티의 localPosition은 Hierarchy상 Parent에 대해서만 작동하기 때문에 그렇지 않은 객체의 경우에 Local 개념을 적용할 수 없기 때문이에요.

이렇게 Local 표현법을 적용하면, Hierarchy상 Parent-Children 관계가 아닌 두 객체에 대해서도 위치 관계를 설정할 수 있답니다.
다음은 World 친구에 대해 알아볼게요.

World 친구는 Local과 같이 Target의 위치를 Source를 기준으로 해서 표현한 위치예요.
차이점이 있다면 Local은 Source Transform의 위치뿐만 아니라 회전, 스케일을 전부 기반으로 했지만, World는 Source Transform의 위치만 기반으로 하고, 회전과 스케일은 절대 좌표를 기반으로 한다는 점이 있어요.
이 때문에 Source 객체가 회전하거나 스케일이 바뀌면 Local 표현법으로 정의된 Target 객체는 이에 맞게 움직이지만, World 표현법으로 정의된 Target 객체는 Source 객체가 움직이지 않는 한 동일한 위치를 가진다는 특징이 있어요.
아래 간단한 예시를 통해 설명해드릴게요.

보이는 것처럼 왼쪽의 Local 표현법은 Target 객체가 Source 객체의 위치와 회전 모두에 영향을 받지만, 오른쪽의 World 표현법은 Source 객체의 위치에만 영향을 받는 걸 볼 수 있어요.
마지막으로 Pivot 표현법에 대해 알아볼게요.

Pivot 친구는 Local, World과 같이 Target의 위치를 Source를 기준으로 해서 표현한 위치예요.
이렇게 보니 세 친구는 모두 Target의 위치를 Source를 기준으로 해서 표현한 위치라는 공통점이 있네요!
하지만 Pivot 역시 두 친구와는 차이점이 있는데, Local은 Source Transform의 위치, 회전, 스케일을 전부 기반으로 하고, World는 Source Transform의 위치만 기반으로 하고 회전과 스케일은 절대 좌표를 기반으로 했다면, Pivot은 Source Transform의 위치만 기반으로 하고 회전과 스케일은 제 3의 객체인 Pivot(주황색)을 기준으로 한다는 점이 있어요.
이 특성 때문에 Pivot 객체가 원점에 있다면 Pivot 표현법으로 정의된 위치는 World 표현법으로 정의된 위치와 완전히 같다는 특징을 가진답니다.
하지만 Pivot 객체가 원점이 아니거나 연속적으로 움직인다면 Target 객체 역시 이에 맞춰 움직이겠죠?
예시를 통해 진짜 그런지 한번 보도록 할게요!

보이는 것처럼 World 표현법은 Pivot 객체의 움직임과 관계 없이 Source 객체로부터 일정한 위치에 Target 객체의 위치를 정의하지만, Pivot 표현법은 Pivot 객체의 관점에서 볼 때 Source 객체에 대한 Target 객체의 위치가 World 표현법과 같아지게끔 유지된다는 걸 볼 수 있어요.
Pivot 표현법의 이러한 특징 덕분에 캐릭터의 모션 표현에서 캐릭터를 중심으로 일정한 위치에 있어야 하는 객체의 위치 구현이 가능해진답니다 - 만약 오른손에 든 삽이 캐릭터가 회전하면서 왼손에 든 삽으로 바뀌어 버리면 곤란하겠죠?
반대로 World 표현법은 캐릭터의 방향과 관계 없이 항상 캐릭터의 어느 부분에 존재해야 하는 객체의 위치 구현을 할 때 용이하게 쓰일 수 있어요 - 예를 들어 대화상자나 펫(pet)의 위치 구현 등이 있겠네요.
지금까지 알아본 세 친구들은 사실 한 지붕 아래서 사는 가족과 같아서, 서로가 서로의 좌표로 변환이 가능해요.
이 특성을 이용하면 Local 좌표를 World 좌표로부터의 변환을 통해 지정하여 Source 객체의 Transform을 몰라도 직관적으로 좌표를 지정하는 등의 여러 이점을 누릴 수 있어요.

이 세 표현법은 차례가 있는데, 첫째가 Local, 둘째가 World, 그리고 막내가 Pivot이에요.
이 관점에서 보면 Local에서 World로 바꾸는 것, 그리고 World에서 Pivot으로 바꾸는 것(혹은 그 반대)은 비교적 수월하게 할 수 있어요.
예를 들어, Local에서 World로 변경하려면 원하는 좌표를 Source 객체의 매트릭스에 곱하면 되고, World를 Pivot으로 변경하려면 원하는 좌표를 Pivot 객체의 역 매트리스에 곱하면 돼요.
그러면 첫째에서 셋째, 셋째에서 첫째로의 변환은 어떻게 하면 될까요? 맞아요! 먼저 첫째를 둘째로 바꾸고, 둘째를 셋째로 바꾸면 돼요.

한번 이 변환이 제대로 일어나는지 확인해볼게요.

먼저 Target 객체를 Source 객체의 Child로 두고, Local Position을 (5, 1)로 설정했어요.
보면 Source의 Local 좌표계에서 (5, 1)의 위치에 Target이 있는 게 보이죠?
이제 이 로컬 좌표를 바탕으로 세 좌표를 전부 구해 볼게요.


보면 Local 좌표는 (5, 1), World 좌표는 (4.57, 2.26), Pivot 좌표는 (4.83, -1.63)이라고 나와요.
이번엔 관점을 바꿔서, World 좌표를 기준으로 한번 확인해볼까요?

같은 위치에 있는 같은 오브젝트들을 이번엔 표현법만 바꿔서 다시 표현해봤어요.
앞에서 Local 좌표를 바탕으로 World 좌표를 구했을 때 (4.57, 2.26)이 나왔는데, 벌써부터 해당 위치에 Target이 있는 것 같이 보이네요!
그러면 이제는 월드 좌표를 기준으로 나머지 세 좌표들을 한번 구해 볼게요.


보면 Local 좌표는 (5, 1), World 좌표는 (4.57, 2.26), Pivot 좌표는 (4.83, -1.63)으로, 앞서 구한 값과 동일한 값이 나오는 것을 확인할 수 있어요.
마지막으로 Pivot 기준으로 세 객채를 봅시다.

앞의 두 방법에서 Pivot 좌표를 구했을 때 (4.83, -1.63) 이 나왔는데, 보면 해당 위치에 Target이 있는 것 같이 보이죠?
실제로 한번 확인해봅시다.


앞의 두 실험에서와 같이 Local 좌표는 (5, 1), World 좌표는 (4.57, 2.26), Pivot 좌표는 (4.83, -1.63)으로 나오는 걸 확인할 수 있었습니다!
오늘은 이렇게 Target의 위치를 Source를 기준으로 해서 표현하는 세 가지 표현법과 이들간의 변환 방법에 대해 알아봤어요.
다음 시간에는 이 표현법을 직접적으로 사용하는 Transform Handler라는 녀석과 한번 만나보도록 할 거예요.
이 친구부터가 토끼의 모션 구현에 사용되는 요소이니, 다음 시간도 꼭 오셔야 해요!
그럼 안녕!
'토끼마을 개발 백서 > Shape Control' 카테고리의 다른 글
| 다음 일지는 11월에 올라와요 (0) | 2024.08.03 |
|---|---|
| Transform Syncer (0) | 2024.07.26 |
| 모션 확대범 (3) | 2024.07.23 |
| Transform Parent (2) | 2024.07.16 |
| Shape Control 마을 (0) | 2024.07.11 |