이 페이지에서
모델 애니메이션
“호기심 있게 둘러보기, 천천히 날개 펴기, 짧은 인사를 추가하고 발은 고정해라”처럼 동작이 전달할 의미를 에이전트에게 알려주세요. 각각 선택할 수 있도록 이름 있는 클립을 요청합니다.
inspect로 클립 이름을 찾고 capture --clip NAME --time SECONDS로 포즈, replay --clip NAME으로 전체 주기를 확인합니다. 정지 포즈는 --clip을 생략하세요. 스타터 폴더에서 실행합니다.
npx --no-install ashfox replay fox.ashfox --clip tail_wag --output tail-wag.gif

아래는 에이전트가 작성할 원본을 설명합니다. 조각 예제는 기존 파일 안에 넣는 코드이며 완전한 시작 예제는 문서 끝에 연결되어 있습니다.
먼저 관절 배치하기
skeleton 바인딩은 **부모 관절 좌표계의 parent-origin**을 사용합니다. 루트는 모델 좌표입니다. 회전하지 않은 몸통이 (0u, 13u, 0u), 어깨의 모델 위치가 (6.5u, 19.5u, 0u)라면 parent-origin = (6.5u, 6.5u, 0u)입니다. 부모는 자식과 함께 이 오프셋을 회전·반사합니다. 과거 속성 origin은 추측하지 않고 거부합니다. 무기는 리그에서 손 관절 아래에 두고 원점을 손잡이에 놓으세요. 전체 동작으로 회전 방향·손 접촉·발 고정을 확인합니다.
motion 만들기
움직이는 관절의 rig contract를 대상으로 motion을 선언합니다. 사용하는 모든 채널을 rig가 허용해야 합니다. 지원 채널은 회전과 크기입니다.
조각 예제 — motion 선언 하나:
export motion idle for CreatureRig {
duration = 2s;
fps = 20;
loop = loop;
rest-relative = true;
track head.rotation {
key 0s = (0deg, 0deg, 0deg) linear;
key 1s = (0deg, 3deg, 0deg) linear;
key 2s = (0deg, 0deg, 0deg) linear;
}
}
duration은 양수, fps는 정수 1–240입니다. 재사용 리그 동작에는 rest-relative = true가 필요합니다. 키 시간은 길이 안에 있고 엄격히 증가해야 합니다.
회전과 크기 트랙
대상은 관절 이름에 .rotation 또는 .scale을 붙입니다.
조각 예제 — 회전과 크기:
track wing_left.rotation {
key 0s = (0deg, 0deg, 0deg) catmullrom;
key 0.8s = (0deg, 0deg, -18deg) catmullrom;
key 1.6s = (0deg, 0deg, 0deg) catmullrom;
}
track root.scale {
key 0s = (1ratio, 1ratio, 1ratio) step;
key 0.8s = (1.1ratio, 1ratio, 1ratio) linear;
key 1.6s = (1ratio, 1ratio, 1ratio) linear;
}
회전은 도 단위 세 값, 크기는 양수 ratio 세 값이며 대상 관절의 channels에 scale이 있어야 합니다. 위치·IK 트랙은 작성할 수 없으므로 정지 위치는 skeleton과 형상으로 정합니다.
키마다 보간을 명시합니다. linear는 다음 키까지 혼합, step은 다음 키까지 현재 값 유지, catmullrom은 주변 키로 부드러운 곡선을 만듭니다. 보간 단어는 값 뒤, 세미콜론 앞에 놓습니다.
반복과 길이 설정하기
허용되는 반복값 세 가지 중 선택합니다.
| 원본 값 | 재생 동작 |
|---|---|
once |
길이 끝까지 재생 후 정지 |
loop |
처음으로 돌아가 반복 |
hold_on_last_frame |
끝까지 재생 후 마지막 포즈 유지 |
첫·마지막 키를 의도적으로 정하세요. 반복 idle은 시작·끝 포즈를 맞추면 연결이 자연스럽습니다.
동작 할당과 선택
여러 에셋이 공유할 motion은 재사용 모듈에 선언하고 별칭으로 import합니다. 에셋 조립에서 각 동작을 명시적으로 할당하세요.
조각 예제 — 여러 동작 가져오기와 할당:
import "./animation.ashfox" as animation;
export asset griffin {
settings { density = 16; forward = north; }
skeleton = animation.GriffinSkeleton;
motion = animation.idle;
motion = animation.look_around;
motion = animation.wing_display;
motion = animation.wing_flap;
motion = animation.greeting;
motion = animation.alert;
// component uses and surface bindings continue here
}
여러 다른 동작을 선택할 수 있지만 각 동작은 한 번만 할당하며 모두 선택된 skeleton의 rig를 대상으로 해야 합니다. component의 rig 포트도 같은 계약에 연결해야 합니다.
inspect로 클립 이름과 길이를 확인한 뒤 replay --clip NAME으로 재생하세요. 특정 시점은 capture --clip NAME --time SECONDS로 확인하고, 기본 자세는 --clip 없이 캡처합니다.
Griffin의 여섯 클립
검증된 Griffin 예제는 animation 모듈에서 여섯 이름을 export합니다. 일반 소스 선언이므로 할당 시 모듈 별칭과 함께 사용하세요.
| 클립 | 동작 | 길이 |
|---|---|---|
idle |
부드러운 대기 | 3s |
look_around |
고개를 돌려 양쪽 관찰 | 4s |
wing_display |
날개를 들어 포즈 유지 | 3.6s |
wing_flap |
양쪽 날개를 빠르게 퍼덕임 | 1.6s |
greeting |
고개 끄덕임과 꼬리 흔들기 | 3s |
alert |
자극에 반응해 방향 전환 | 2.4s |
Griffin 원본과 애니메이션 모듈을 함께 사용합니다. 완전한 그래프는 게임 프로젝트에 있습니다. 압축을 푼 폴더에서 models/workbench/main.ashfox를 출력하세요.
여섯 동작 모두 rest-relative입니다. 대상은 head, wing_left, wing_right, tail 등 의미 있는 리그 관절입니다.
모든 동작 리뷰하기
원본 변경 후 할당된 모든 클립의 전체 주기를 확인하세요. 시작·끝 포즈, 가장 큰 움직임, 실제 게임 크기의 동작을 검사합니다. 양쪽에서 반사된 부착물을 보고 타임라인을 탐색해 갑자기 튀는 키를 찾으세요.
크기 트랙은 부품이 보이며 세 성분이 모두 양수인지, 회전은 최대 각도에서 피벗·부착을 확인합니다. 유효한 원본인데 잘못 보이면 시각적 문제를 설명하고 소유 트랙·관절 바인딩·정지 포즈를 수정하세요. 검증만으로 애니메이션 품질을 인증하지 않습니다.
완전한 원본
언어 레퍼런스의 완전한 원본은 rig·skeleton·surface·component·motion·asset 조립을 갖춘 작은 애니메이션 큐브입니다. 독립 시작 파일이 필요할 때 사용하세요. 이 페이지는 동작 조각이므로 주변 surface·component 선언을 의도적으로 생략합니다.