이곳에서 피벗 페인터 툴의 최신 버전을 찾을 수 있습니다. 2.0 버전에서는 간결해진 파이프라인으로 인터랙티브 폴리지를 만들 수 있습니다.
피벗 페인터 툴(Pivot Painter Tool) 은 모델의 버텍스 데이터에 모델 피벗과 회전 정보를 저장하는 MAXScript입니다. 해당 정보를 언리얼의 셰이더 시스템에서 참조하여 인터랙티브 이펙트를 만들 수 있습니다.
샘플 영상에 보이는 모션은 버텍스 셰이더를 이용해 실시간으로 생성된 것입니다. 풀잎마다 뿌리 주변을 회전하며 굽어지고 있습니다. 나뭇가지와 잎사귀는 계층구조를 이루면서 부모의 모션을 상속받고, 각자 피벗 포인트를 중심으로 애니메이팅합니다. 서브 오브젝트의 회전 역시 저장하므로 바람이 불어도 사실적이고 역동적으로 반응할 수 있습니다.
피벗 페인터에 머티리얼 함수 기능이 추가되면서 이러한 셰이더 생성 작업이 훨씬 간편해졌습니다. 위에서 본 것처럼 샘플 콘텐츠를 통해서도 애니메이션이 어떻게 생성되는지 볼 수 있습니다. 서브 오브젝트의 피벗 포인트를 구할 때도 3ds Max에서 피벗 페인터 스크립트로 메시를 처리하고, 파일을 임포트한 뒤 피벗 페인터 함수로 머티리얼을 만들기만 하면 됩니다. 머티리얼 함수에는 2단계 계층구조와 1단계 계층구조 모두 해당하는 피벗 포인트 출력이 들어 있습니다.
이렇게 모션을 만들었을 때의 장점이 있습니다. 이 기법으로 처리한 모델은 메모리를 표준 스태틱 메시보다 18% 정도만 더 사용합니다. 애니메이션도 바로 계산하여 저장할 필요가 없기 때문에 비용이 스켈레탈 애니메이션보다 훨씬 적게 듭니다. 모델에 있는 버텍스의 수는 화면의 픽셀 수보다 훨씬 적기 때문에, 대개 버텍스 셰이더의 인스트럭션 수는 퍼포먼스 측면에서 픽셀 인스트럭션 수보다 영향을 덜 미칩니다.
다음 링크의 셰이더 예제가 보여주는 기능은 극히 일부에 불과합니다. 제공된 정보로 실험하다 보면 다른 사용법도 알고 싶다는 생각이 들 것입니다. 플레이어 상호작용, 흥미로운 바람 설정, 폴리지에 무관한 모션, 기타 이펙트 모두 서브 오브젝트 수준의 정보에 액세스할 때 이용할 수 가능합니다.
설치
다음 위치에서 피벗 페인터(Pivot Painter) 스크립트를 찾을 수 있습니다.
[UERootDirectory]/Engine/Extras/3dsMaxScripts/PivotPainter.ms
다음 영상에서는 스크립트를 설치하고, 피벗 페인터 툴을 여는 키보드 단축키와 메뉴를 만드는 법을 다룹니다.
프렙 툴
해당 영상은 스크립트의 '프렙 툴(Prep Tool)' 부분과 워크플로에 대한 팁, 전반적인 프로세스에 대한 정보를 다룹니다. 프렙 툴에는 모델 엘리먼트를 별도의 오브젝트로 분리하는 옵션, 새 피벗 포인트를 쉽게 만들 수 있는 여러 툴이 존재합니다.
프렙 툴 의 목적은 주어진 모델 엘리먼트를 새로운 여러 모델로 분할하고, 이 모델들의 피벗을 이상적인 위치로 옮기는 것입니다. 프렙 툴은 필수가 아니며 편의상 제공되는 툴일 뿐입니다. 처리 중인 모델이 이미 분할되었고, 모델의 피벗은 원래 회전해야 할 곳에 위치해 있으며, 모델의 X축이 모델과 마주 보고 있다면 모델 작업을 다음 단계로 진행하셔도 좋습니다.
예시: 풀 한 포기는 풀잎 단위로 분할되어야 합니다. 풀잎 하나는 바람에 나부낄 때 바닥을 중심으로 회전해야 합니다. 즉, 그 피벗 포인트는 풀 모델의 기반에 위치해야 하고, 피벗의 X축이 모델과 마주 보고 있어야 합니다. 풀의 경우 대부분은 위쪽을 향할 것입니다.
계층구조 페인터
해당 영상은 스크립트의 '계층구조 페인터(Hierarchy Painter)' 부분을 다룹니다. 툴의 이 부분은 가지와 잎처럼 부모-자손 관계를 저장하는 데 사용되며, 메시의 모델 피벗과 회전 정보도 저장합니다.
모델이 계층구조를 필요로 하는 경우, 스크립트의 '계층구조 페인터(Hierarchy Painter)' 섹션으로만 처리해야 합니다. 적절한 예로는 잎이 달린 나무를, 반대의 예로는 단순한 풀을 들 수 있습니다. 풀은 '오브젝트별 페인터(Per Object Painter)' 섹션으로 칠해야 합니다.
또한 분기/부모 피벗의 박스 내 위치는 '부모 피벗에 대한 최대 거리(Max dist for parent piv)'의 수치를 벗어날 수 없습니다. 예를 들어 모델을 페인팅할 때 'Max dist for parent piv'가 4096으로 설정된 경우, 분기/부모 피벗 포인트는 X/Y 좌표로 -2048~2048, Z 좌표로 0~4096 안에 위치할 수 있습니다. 추가로 모델을 처리하는 도중 'Max dist for parent piv'를 4096 이외의 값으로 설정한 경우, 언리얼의 모델 셰이더에도 동일한 숫자를 사용해야 합니다.

오브젝트별 페인터
해당 영상은 '오브젝트별 페인터(Per Object Painter)' 스크립트에서 사용 가능한 옵션을 다룹니다. 또한 몇 가지 사용법과 데이터를 모델에 저장하는 법에 대한 일부 정보도 다룹니다.
3ds Max 예제 파일
비디오 튜토리얼에 사용된 트리 사본이 담긴 파일입니다.
- https://d1iv7db44yhgxn.cloudfront.net/documentation/attachments/9e570fea-8723-42c5-8ba0-d58503f243ad/tree.max ( 우클릭 후 다른 이름으로 저장 을 눌러 다운로드)
요구사항
- 3ds Max - 스크립트는 3ds Max 2010/2012 버전으로 테스트했습니다.
- 피벗 페인터 머티리얼 함수. 함수가 없어도 스크립트를 사용할 수 있으나, 함수가 있으면 데이터를 훨씬 편하게 사용할 수 있습니다.
기타 참고사항
스크립트의 '계층구조 페인터(Hierarchy Painter)' 또는 '오브젝트별 페인터(Per Object Painter)' 중 하나의 섹션으로만 모델을 처리해야 하며 둘 다는 안됩니다. 모델을 '계층구조 페인터'로 칠할 경우, 오브젝트 머티리얼 안에서는 'PivotPainter_HierarchyData' 머티리얼 함수를 사용해야 합니다. 스크립트의 '오브젝트별 페인터' 섹션을 사용할 경우, 'PivotPainter_PerObjectData'를 사용해 머티리얼 내 피벗 정보를 디코딩해야 합니다.
3ds Max의 월드 단위 세팅은 칠할 때 센티미터로 설정해야 하며, 익스포트 시 스케일 조절/변경해서는 안 됩니다. 3ds Max와 언리얼 간 단위를 동일하게 유지하는 것이 중요합니다. 단위가 불일치하면 원하지 않은 결과가 나올 수 있습니다.