3ds Max 맥스스크립트(MaxScript) 기초: 반복 노가다를 줄여주는 애니메이션 키프레임 자동화 스크립트 작성법
3D 게임 개발 및 애니메이션 파이프라인에서 수십 개의 캐릭터 본(Bone)과 오브젝트에 일일이 키프레임(Keyframe)을 복사하고 타이밍을 미세 조정하는 작업은 막대한 시간과 반복적인 피로를 유발합니다. 특히 모션 캡처 데이터 정격화, 주기적인 공중 부유(Idle) 애니메이션 생성, 다관절 꼬리 및 날개의 시간차 오버랩(Overlap) 연출과 같은 작업은 수동으로 진행할 경우 작업자마다 퀄리티 편차가 크고 수정 비용이 급증합니다. 3ds Max의 자체 내장 스크립팅 언어인 맥스스크립트(MaxScript)는 별도의 외부 개발 환경이나 복잡한 빌드 과정 없이도 3ds Max 내부에서 즉시 실행 가능한 강력한 자동화 도구입니다. 본 포스팅에서는 맥스스크립트의 핵심 기초 문법부터 실무에서 당장 활용할 수 있는 키프레임 자동 제어 실전 코드 3선과 UI 롤아웃(Rollout) 제작법까지 상세히 정리합니다.
1. 맥스스크립트 시작하기: 리스너(Listener)와 매크로 레코더
맥스스크립트를 처음 접할 때 가장 강력한 학습 도구는 맥스스크립트 리스너(MaxScript Listener, 단축키 F11)입니다.
- 실시간 코드 테스트: 리스너 창 하단(하얀색 영역)에 명령어를 입력하고
Shift + Enter또는Enter(키패드)를 누르면 뷰포트에서 즉각 결과를 확인할 수 있습니다. - 매크로 레코더(MacroRecorder): 리스너 상단 메뉴의
MacroRecorder > Enable을 켜면, 3ds Max UI에서 마우스로 조작하는 모든 행동(오브젝트 이동, 키 생성, 회전 등)이 맥스스크립트 명령어로 실시간 자동 번역되어 출력됩니다. 이를 복사하여 스크립트 작성의 뼈대로 활용할 수 있습니다.
2. 키프레임 제어 핵심 문법과 컨트롤러 다루기
맥스스크립트에서 애니메이션을 다룰 때 반드시 알아야 할 3대 컨텍스트 키워드와 함수입니다.
| 구문 / 함수 | 기능 설명 | 실무 활용 예시 |
|---|---|---|
animate on { ... } |
Auto Key 모드를 켠 상태로 코드 블록을 실행. 내부의 위치/회전 변화가 자동으로 키프레임으로 기록됨 | 자동 절차적 애니메이션 생성 |
at time t { ... } |
특정 프레임(t)으로 타임라인 슬라이더를 이동하여 속성값을 설정하거나 조회 | 프레임별 특정 포즈 일괄 적용 |
deleteKeys <obj> ... |
지정된 오브젝트의 특정 시간 범위 또는 전체 키프레임을 일괄 삭제 | 불필요한 모션 데이터 초기화 |
moveKeys <controller> delta |
선택된 키프레임들을 타임라인 상에서 앞/뒤로 지정된 프레임 수만큼 일괄 이동 | 시간차(Stagger) 오버랩 연출 |
3. 실무 생산성을 극대화하는 실전 자동화 스크립트 3선
3.1 [스크립트 1] 선택된 다중 오브젝트 시간차(Stagger Offset) 애니메이션 자동 생성
깃털, 머리카락, 꼬리 등 여러 개의 본을 순차적으로 선택하고 실행하면, 선택된 순서대로 키프레임을 2프레임씩 뒤로 밀어주어 완벽한 팔로우스루(Follow-through) 오버랩 애니메이션을 완성합니다.
-- 선택된 오브젝트들의 키프레임을 순차적으로 오프셋하는 스크립트
(
undo "Stagger Animation Keys" on
(
local selObjs = selection as array
local offsetFrame = 2 -- 오브젝트마다 밀어줄 프레임 간격
if selObjs.count > 0 then
(
for i = 1 to selObjs.count do
(
local currentObj = selObjs[i]
local shiftAmount = (i - 1) * offsetFrame
-- 트랜스폼(위치, 회전, 스케일) 컨트롤러의 모든 키프레임 이동
if currentObj.transform.controller != undefined then
(
moveKeys currentObj.transform.controller (shiftAmount as time)
)
)
print ("총 " + selObjs.count as string + "개 오브젝트 키 오프셋 완료!")
)
else
(
messageBox "오브젝트를 1개 이상 선택해주세요." title:"알림"
)
)
)
3.2 [스크립트 2] 주기적 사인파(Sine Wave) 부유(Floating Idle) 모션 생성기
공중에 떠 있는 몬스터, 마법석, 드론 등의 Z축 상하 둥둥 뜨는 루프 모션을 수학적 사인 곡선을 바탕으로 완벽한 무한 루프 키프레임으로 자동 생성합니다.
-- 0~60프레임 동안 Z축 사인파 부유 애니메이션 생성
(
undo "Generate Floating Idle" on
(
local sel = selection as array
local totalFrames = 60
local heightAmplitude = 15.0 -- 상하 진폭 (높이)
for obj in sel do
(
local basePos = obj.pos
deleteKeys obj.pos.controller #allKeys
animate on
(
for f = 0 to totalFrames by 5 do
(
at time f
(
local angle = (f as float / totalFrames) * 360.0
local zOffset = (sin angle) * heightAmplitude
obj.pos = [basePos.x, basePos.y, basePos.z + zOffset]
)
)
)
-- 키프레임 탄젠트를 Smooth(부드럽게)로 설정
for k in obj.pos.controller.keys do k.inTangentType = #smooth; k.outTangentType = #smooth
)
)
)
3.3 [스크립트 3] 베이크된 빽빽한 키프레임 최적화(Reduce Keys)
모션캡처나 물리 시뮬레이션 후 매 프레임마다 박힌 빽빽한 키프레임을 오차 범위(Threshold) 내에서 정밀하게 걸러내어, 애니메이션 곡선 형태는 100% 유지하면서 데이터 용량과 수정 난이도를 대폭 낮춥니다.
-- 선택된 오브젝트의 불필요한 키프레임 최적화 압축
(
undo "Optimize & Reduce Keys" on
(
local thresholdValue = 0.5 -- 오차 허용 임계값
for obj in selection do
(
if obj.transform.controller != undefined do
(
reduceKeys obj.transform.controller thresholdValue 1f
)
)
print "키프레임 최적화 압축 완료!"
)
)
4. 버튼 클릭으로 실행하는 플로팅 UI 롤아웃(Rollout) 만들기
작성한 스크립트를 동료 아티스트나 본인이 손쉽게 사용할 수 있도록 플로팅 UI 창으로 패키징하는 템플릿 코드입니다.
rollout rAnimTools "애니메이션 자동화 툴킷" width:220 height:140
(
spinner spnOffset "오프셋 프레임:" range:[1, 30, 2] type:#integer fieldWidth:40
button btnStagger "선택 본 순차 오프셋" width:190 height:32 style:#soft
button btnReduce "키프레임 다이어트(최적화)" width:190 height:32 style:#soft
on btnStagger pressed do
(
local objs = selection as array
if objs.count == 0 then (messageBox "본을 선택하세요."; return false)
undo "Stagger" on
(
for i = 1 to objs.count do
(
moveKeys objs[i].transform.controller ((i-1) * spnOffset.value as time)
)
)
)
on btnReduce pressed do
(
undo "Reduce" on
(
for obj in selection do reduceKeys obj.transform.controller 0.5 1f
)
)
)
createDialog rAnimTools
5. 결론 및 맥스스크립트 실무 안전 수칙 체크리스트
맥스스크립트로 대규모 키프레임 연산을 수행할 때는 씬 안정성과 뷰포트 성능을 위해 아래 5가지 안전 수칙을 반드시 지켜야 합니다.
- Undo 블록 필수 적용: 스크립트 실행 후
Ctrl + Z로 되돌릴 수 있도록 모든 변경 코드를undo "동작명" on { ... }으로 감쌌는가? - 뷰포트 리드로우 일시 정지: 수백 개의 키프레임을 반복 연산할 때
with redraw off ( ... )를 사용하여 불필요한 실시간 뷰포트 갱신을 끄고 실행 속도를 10배 이상 가속했는가? - 선택 예외 처리: 오브젝트가 선택되지 않았거나 엉뚱한 타입이 선택되었을 때 에러 창 대신 친절한 경고 메시지(
if selection.count == 0)가 출력되도록 방어 코딩을 했는가? - 임시 씬 백업: 파괴적인 일괄 편집 스크립트를 돌리기 전
Hold(단축키 Ctrl + H) 또는 씬 저장을 습관화했는가? - 탄젠트 타입 무결성: 키프레임 생성 후 탄젠트 타입이
#smooth나#linear로 올바르게 설정되어 이상 가속(Overshoot) 현상이 없는지 확인했는가?
댓글 쓰기