세계적 수준의 모션 그래픽 in After Effects: 프로세스
공유된 기본 사항을 작업하고, 관련 모드를 따른 후, QA 및 전달로 마무리합니다:
- 파트 A – After Effects에 연결. 자신의 AE 인스턴스를 안정적으로 제어합니다.
- 파트 B – 항상 적용되는 규칙. 빌드하기 전에 공유된 애니메이션 및 편집 가능성 규칙을 읽습니다.
- 파트 C – 재현(RECREATE) 프로세스. 분석, 측정 및 비교를 통해 참조를 일치시킵니다.
- 파트 D – 생성(CREATE) 프로세스. 리서치, 콘셉트, 스토리 및 빌드를 통해 독창적인 영화를 개발합니다.
- 파트 E – 마무리. 최종 렌더링을 확인하고 요청된 전달물을 패키징합니다.
작업 모드
| 모드 | 목표 | 시작 방법 |
|---|---|---|
| 재현 | 타이밍, 레이아웃, 움직임 및 외관을 참조 비디오와 1:1로 일치시키되, 네이티브하게 재구성합니다. | 참조를 분석하고 측정합니다. 참조가 스토리를 정의합니다. |
| 생성 | 브랜드 또는 제품을 위한 독창적인 영화를 만듭니다. | 리서치, 콘셉트, 스토리 및 무드보드, 이어서 빌드. |
파트 A – After Effects에 연결
목표는 다른 에이전트가 방해할 수 없고, GUI를 건드리지 않고도 구동할 수 있는 개인적이고 안정적이며 스크립팅 가능한 After Effects 인스턴스를 확보하는 것입니다.
A1. 자신의 인스턴스 실행하기
- 실행 중인 AE PID 기록:
pgrep -f "Contents/MacOS/After Effects". - 새 인스턴스 실행:
작은 Swift 실행기(open -n "/Applications/Adobe After Effects 2026/Adobe After Effects 2026.app" --args -mNSWorkspace.openApplicationwithcreatesNewApplicationInstance=trueand args-m -ApplePersistenceIgnoreState YES)도 동일한 작업을 수행하고 PID를 직접 반환할 수 있습니다.- 절대
subprocess.Popen을 통해 원시 바이너리를 시작하지 마십시오. 해당 프로세스는 번들에 등록되지 않아 AppleEvents를 수신할 수 없습니다.
- 절대
- PID 목록을 차분하고 후속 명령어를 위해 새 PID를 유지합니다.
- AE는 시작 후 새 PID로 다시 생성될 수 있습니다. "Adobe After Effects" 메인 창을 소유한 PID를 사용합니다(Quartz
CGWindowListCopyWindowInfo). - 번들 ID는
com.adobe.AfterEffects.application입니다.
- AE는 시작 후 새 PID로 다시 생성될 수 있습니다. "Adobe After Effects" 메인 창을 소유한 PID를 사용합니다(Quartz
- 시작 대화상자 지우기(Crash Repair → Continue). 이러한 인스턴스의 Adobe 로그인 창은 알려진 디스플레이 결함입니다. 무시하고, 절대 자격 증명을 입력하지 않으며, 사용자에게 에스컬레이션하지 마십시오.
ensure_ae.py가 이 모든 것을 자동화합니다. PID가 사망하면 다시 실행하고, 작은 대화상자를 확인하며, 다시 생성된 PID를 감지하고, 프로젝트를 다시 엽니다.
A2. PID로만 통신하기
tell application "Adobe After Effects 2026"은 다른 에이전트의 인스턴스를 포함한 모든 인스턴스를 대상으로 합니다. 절대 사용하지 마십시오.aedo(Swift)는 하나의 PID에 AppleEventmisc/dosc(DoScript)를 보냅니다.ae.py script.jsx또는ae.py -e "code"는 모든 스크립트를 래핑합니다:- ES3 JSON 폴리필(
json.jsx) 포함; app.beginSuppressDialogs()호출;- try/catch 내에서
$.evalFile실행; {ok, value, error, line, file, ms}를 결과 파일에 기록. AppleEvent 반환 값은 신뢰할 수 없으므로 항상 파일을 읽습니다.
- ES3 JSON 폴리필(
- 프로젝트 ID 가드: 변경 스크립트 전에, 대상 PID와
app.project.file이 편집 중인 프로젝트와 일치하는지 확인하십시오. 자신이 확인하지 않은 인스턴스를 절대 닫거나 종료하지 마십시오. - 한 번에 하나의 AE 스크립트를 실행합니다. 스크립트는 종종 멱등적이지 않으므로, 대량 변경 전에 백업하거나 다른 이름으로 저장하십시오.
A3. 실제 작업 전 상태 확인
하나의 스크립트로 다음을 읽어옵니다:
app.version및 프로젝트가 자신의 것인지 여부;- 컴포지션 렌더러(
ADBE Advanced 3d는 3D 모델 레이어 및 환경 조명에 필요); - 글꼴: 사용하려는 모든 글꼴에 대해
app.fonts.getFontsByPostScriptName(name).length가 0보다 커야 함; - 테스트
saveFrameToPng가 디스크에 나타나는지 확인.
또한 스크립트가 파일을 쓰고 네트워크에 액세스할 수 있도록 환경 설정(Pref_SCRIPTING_FILE_NETWORK_SECURITY)을 설정합니다.
A4. 빌드 파이프라인: 데이터 → 네이티브 프로젝트
사용 가능한 빌드 헬퍼를 사용하거나 동등한 기능을 구현하십시오. 아래 헬퍼 이름은 역할을 설명합니다.
-
Python이 영화를 데이터로 설명합니다.
kit.pyDSL이 제공합니다:- 명명된 이징이 있는
K()스파스 키; shape,text,precomp,null,camera,model,L(레이어);- matchName별 효과, 마스크, 트랙 매트, 표현식, 마커, 노트, 레이블.
장면 명세를 단일 빌드 명세로 결합합니다.
- 명명된 이징이 있는
-
kit.jsx가 명세에서 네이티브 레이어를 빌드합니다.- 레이어를 아래에서 위로 생성하여 이미 최종 순서에 있도록 합니다.
moveTo를 사용한 대량 재정렬은 AE를 지연시킬 수 있으므로 피합니다. - 그런 다음 부모 연결, 효과, 마스크, 변형, 이징, 매트 및 환경 조명 배선을 적용합니다.
- 레이어를 아래에서 위로 생성하여 이미 최종 순서에 있도록 합니다.
-
build.py spec.json --new --only "A|B" --stills "Comp:t1,t2" --save output.aep--new는 현재 프로젝트를 저장하지 않고 먼저 닫습니다(CloseOptions.DO_NOT_SAVE_CHANGES). 그렇지 않으면newProject()가 다른 이름으로 저장 대화상자를 열고 멈춥니다.
-
스틸:
stills.py "Comp" t1,t2 prefix.saveFrameToPng는 비동기식입니다(파일이 존재할 때까지 폴링) 그리고 16비트 PNG를 씁니다(8비트 보기 전에 257로 나눕니다).
-
타겟 모션 렌더:
render.py "Comp" start end out.mp4 [--half] [--hq], 또는-s/-e와 함께 aerender 사용. -
전체 렌더:
aerender_job.py "Comp" out.mp4 [--half] [--hq].- 작업 복사본을 저장하고 별도 프로세스에서
aerender -project job.aep -rqindex 1 -sound ON을 실행합니다. - 앱 내 큐보다 빠르며, 충돌이 작업 인스턴스에 영향을 주지 않습니다.
- 작업 복사본을 저장하고 별도 프로세스에서
-
연락처 시트:
contact.py(비디오 프레임) 및sheet.py(스틸, 종횡비 유지). 보기 전에 항상 이미지를 축소합니다.
A5. ExtendScript 규칙 (ES3)
JSON및Array.indexOf없음: 폴리필이나 루프를 사용합니다.eval('('+text+')')로 JSON을 읽습니다.- 절대 체이닝 삼항 연산자 사용 금지(
a?x:b?y:z잘못 평가됨). if/else를 사용합니다. - matchName으로 속성을 지정합니다. 표시 이름 조회는 39바이트 제한이 있으며 지역화됩니다.
- 카메라는
threeDLayer가 아닙니다:matchName==='ADBE Camera Layer'를 테스트합니다. - 값 차원 표준화: 분리된 차원에 스칼라를, 3D 속성에 3-요소 배열을 전달합니다.
shutterPhase는 정수여야 합니다.- 텍스트 채우기 색상을 설정하기 전에
applyFill=true를 설정합니다. - 레이어당 새로운
TextDocument를 만듭니다. 스타일링 전에resetCharStyle()/resetParagraphStyle()를 호출합니다. - "속성 또는 부모가 숨겨져 있습니다" 오류는 해당 속성이 해당 위치에 적용되지 않음을 의미합니다. 예: 환경 조명의 Y 회전은 설정할 수 없습니다. 대신 소스 맵을 애니메이션합니다.
- 쉐이프 그래디언트 채우기 색상은 스크립팅할 수 없습니다. 그래디언트 램프 효과 또는 계층화된 라이트 그룹을 사용합니다.
A6. 다른 에이전트와 공존
- 다른 에이전트는 "이름으로" AE를 종료할 수 있으며, 이는 사용자 인스턴스에도 영향을 줍니다. 자주 저장하고
ensure_ae.py를 준비하십시오. - 종료 트리거 "변경 사항 저장?" 대화상자에서 Escape를 누르면 AE가 종료됩니다.
- 컴퓨터 사용 및 접근성 도구는 다른 인스턴스의 창만 볼 수 있습니다. PID로 필터링된 Quartz 창 목록과
screencapture -l <windowId>를 사용하여 자신의 창을 진단합니다. 자신의 PID에서 System Events를 통해 해제합니다(키 코드 36 = 리턴, 53 = 이스케이프). - 다른 AE 인스턴스에 대한 우발적인 간섭은 공개하십시오.
파트 B – 항상 적용되는 규칙
두 모드 모두에서 이 규칙을 적용하여 모션을 부드럽게 유지하고 프로젝트를 편집 가능하게 유지하십시오.
B1. 키프레임: 가능한 한 적게
- 부드러운 모션을 위해 가능한 한 적은 키프레임을 사용하십시오. 곡선이 있는 10개의 키가 평평한 1000개의 키를 이깁니다.
- 하나의 제스처에는 2–4개의 키가 필요합니다: 시작, 끝, 실제 정지 또는 실제 극한(정점, 골짜기, 위상 변화).
- 각 속성은 약 7–12개의 키로 제한하십시오. 더 많은 키는 일반적으로 모션이 설계되지 않았음을 의미합니다.
- 프레임당(또는 2프레임당) 선형 키로 모션을 절대 굽지 마십시오. 편집자가 편집할 수 없으며 기계적으로 보입니다.
- 모션이 측정 또는 레거시 데이터에서 비롯된 경우 피팅하십시오(B3 참조). 샘플을 절대 붙여넣지 마십시오.
B2. 곡선: 속도 그래프의 부드러운 호
-
애니메이션된 모든 속성의 속도 그래프를 엽니다.
- 부드러운 종 또는 호는 부드러운 모션을 의미합니다.
- 각진 계단형 그래프(모든 키가 쉽게 이징되어 0이 됨)는 모션이 끊김을 의미합니다.
- 스파이크는 급격한 움직임을 의미하며, 의도적인 악센트가 아닌 한 문제입니다.
-
하나의 연속적인 제스처의 내부 키는 멈춰서는 안 됩니다.
- 연속적인 베지어 키를 사용하십시오.
- 내부 속도를 인접 기울기의 조화 평균으로 설정하고,
2ab/(a+b)(두 기울기가 같은 부호일 때), 그렇지 않으면 0, 영향은 약 33.3입니다. - 연속적인 제스처에 전역 Easy Ease를 절대 적용하지 마십시오: 계단을 만듭니다.
-
이징 용어(이전 키의 출력 영향 / 이 키의 입력 영향):
이름 영향 ease 33/33 smooth 70/70 inout 82/82 out 12/88 expo 6/94 snap 3/97 in 88/12 soft 45/75 사용자 정의 이징은
{'o':[speed,inf],'i':[speed,inf]}입니다. 예를 들어 부드러운 당김:{'o':[0,55],'i':[0,92]}. -
공간 탄젠트는 기본적으로 0이며, 이는 경로 오버슈트를 방지합니다. 의도적으로만 호를 사용하십시오.
-
너무 짧고 거친 expo 시작이 있는 이동은 급격한 움직임으로 읽힙니다. 길이를 늘리고(0.5 → 0.8 초) 이징을 부드럽게 하십시오. 키를 추가하지 마십시오.
-
하위 이동을 하나의 제스처로 겹치십시오. 접기, 뒤집기, 밀기를 별도로 하면 정지-이동 모션이 발생합니다. 이전 이동이 끝나기 전에 다음 이동을 시작하십시오.
B3. 데이터에서 곡선 피팅
재현 모드 또는 조밀한 데이터를 변환할 때:
-
valueAtTime또는 측정을 통해 대상 모션을 조밀하게 샘플링합니다(50–200 Hz). -
시작과 끝, 정확한 정지(속도 0) 및 중요한 극한(해당 축의 기울기 0)에서 매듭을 고정합니다.
-
샘플에 대한 최소 제곱으로 속도와 영향을 계산합니다: 속도는 부호 제약, 영향은 0.04–0.94로 제한.
-
오류가 허용 오차를 초과하는 경우에만 매듭을 추가합니다:
속성 허용 오차 위치 2–3 px (카메라 3 px) 배율 0.4–0.65 불투명도 0.5–2.5 블러 ~1 회전 0.4 -
벡터 속성의 경우, 베지어 분할(de Casteljau)을 통해 축 간 매듭 시간을 병합합니다. 모든 내부 키에서 들어오는 속도가 나가는 속도와 같다고 가정합니다.
-
그대로 유지하고, 서면 이유를 포함합니다: 표현식, 시간 리맵, 타이핑 케이던스, 의도적인 정지 스위치, 1프레임 가시성 전환.
B4. 장면당 3D 카메라 하나
-
모든 장면에는 하나의
CAMERA • scene(단일 노드,NO_AUTO_ORIENT, 분리된 X/Y/Z)이 있습니다. 카메라는 프레이밍, 팬, 돌리 및 줌을 전달합니다. -
카메라 움직임을 위조하기 위해 모든 요소의 위치/배율을 애니메이션하지 마십시오.
-
기록된 UI 모션(주 레이어 위치
P, 배율s, 컴포지션 중심C, 줌Z0)에서 카메라를 도출하려면:카메라 XY = C + (C − P)/s카메라 Z = −Z0/s
그런 다음 자체적으로 움직이는 모든 것을 로컬 용어로 다시 표현합니다.
-
카메라는 스토리를 전달합니다: 도착 → 액션 → 가속 → 읽을 수 있는 안정, 그리고 매크로 디테일 → 당김 공개.
-
로컬 애니메이션은 로컬로 유지됩니다: 커서 경로, 클릭 누름, 스크롤, 카드 뒤집기. 부모 클릭 펄스는 컴포넌트 내부에 있으므로 원근 아래에서 이를 따릅니다.
-
헤드라인은 3D 세계 위의 안정적인 2D 평면에 존재하므로 카메라 푸시가 헤드라인을 잘라내지 않습니다. 투영된 텍스트 경계 검사로 확인합니다.
B5. 모션 블러, 선명도 및 깊이
- 컴포지션 모션 블러 켜기(셔터 135–180°, 12–16 샘플).
- 매우 빠른 당김 또는 UI 번짐의 경우 셔터를 45–90°로 낮춥니다.
- 텍스트가 두 배로 보이는 레이어에서는 모션 블러를 끕니다.
- UI의 큰 줌을 선명하게 유지합니다: 편집 가능한 벡터 UI를 보유한 2–4× 수퍼샘플링된 렌더-평면 프리컴프, 카메라 장면에서 축소하지 않음.
- 고급 3D 렌더러: 평행 평면 간에 ≥ 4 단위를 유지합니다. 그렇지 않으면 Z-파이팅이 발생하고 이음새가 나타납니다.
- 널의 불투명도는 자식에 영향을 주지 않습니다. 모든 하위 항목에 불투명도를 전파합니다.
- 흐릿한 글로우는 반복 가장자리 픽셀 OFF여야 합니다. 그렇지 않으면 직사각형 경계가 표시됩니다. 전체 프레임 방사형 램프가 최상의 라이트 필드를 만듭니다.
B6. 전환: 연속성, 효과가 아님
-
전환은 동기부여되어야 합니다:
- 매치 컷: A의 마지막 프레임이 B의 첫 프레임과 같습니다. 렌더에서 포즈를 측정합니다.
- 모프: 하나의 모양이 크기, 둥글기, 색상 및 위치를 애니메이션하여 다음 요소가 됩니다.
- 개체 핸드오프: 요소가 추출되어 다음 장면의 주인공이 됩니다.
- 카메라 다이브 어두운 요소 속으로, 다음 장면이 검은색에서 나타나도록 합니다.
- 밝은 또는 어두운 디스크 공개 제품 뒤에서 트랙 매트를 통해.
-
금지:
- 전체 프레임 흰색 또는 회색 플래시;
- 어둡고 밝은 장면 간 크로스페이드, 중간 회색 프레임 생성;
- 모든 컷에서 동일한 와이프;
- 회색 배경 "스윕" 줄무늬.
플래시가 물리적으로 속한 곳에 배치하십시오: 디스플레이 위에, 개체 뒤에 색상이 있는 번짐과 함께.
-
필름당 최대 2–3개의 전체 프레임 폐색 와이프를 사용합니다.
B7. 네이티브 전용, 항상 편집 가능
- 에셋 다운로드: 사용자에게 먼저 묻지 않고 작업에 필요한 모든 에셋(로고, 아이콘, 글꼴, 3D 모델, 텍스처, 이미지, 비디오 참조, 음악 및 사운드 효과 포함)을 다운로드합니다. 공식 또는 신뢰할 수 있는 소스를 선호하고, 필요한 라이선스 저작자 표시를 유지하며, AE에서 에셋을 사용할 때 아래 네이티브 프로젝트 규칙을 적용합니다.
- 네이티브는 텍스트, 쉐이프, 마스크, 효과, 프리컴프, 카메라, 조명 및 네이티브 3D 모델 레이어(GLB/OBJ)를 의미합니다. 오디오는 가져올 수 있습니다.
- 스크린샷, 참조 크롭, 사전 렌더링, 웹캠 루프 또는 네이티브 레이어의 래스터 대체물을 절대 가져오지 마십시오.
- "네이티브"라고 주장하기 전에 모든 푸티지 항목을 감사합니다.
- 편집 가능은 라이브 텍스트, 제어용 슬라이더, 명확한 레이어 이름 및 사용된 곳마다 변경 사항을 전파하는 재사용 가능한 컴포넌트 프리컴프를 의미합니다.
sourceRectAtTime에서 앵커 포인트 표현식을 사용하여 편집 후 텍스트를 중앙에 유지합니다.
B8. 타이포그래피
- 실제 브랜드 글꼴이 포함된 라이브 텍스트만 사용합니다.
getFontsByPostScriptName으로 확인하고, 필요할 때 고유한 패밀리 이름 아래에 정적 인스턴스를 설치합니다. - 헤드라인은 짧고, 굵게, 문장 케이스이며, 마침표로 끝납니다. 트래킹 −20에서 −40.
- 문자 또는 단어별 공개: 불투명도 0, 블러 20–24, y +14–26, 0.45–0.55 초 동안 ease-out. 종료는 시작을 반영합니다: 0.25–0.35 초, 위쪽으로 흐려짐.
- 실제 TTF(PIL에서 4× 수퍼샘플링)로 너비를 측정하여 밑줄, 알약 등이 정확하도록 합니다.
... (잘렸습니다)
파트 E – 마무리 (계속)
E4. 전달 패키지
- 최종 렌더 비디오 및/또는 프로젝트 파일을 제공합니다.
- 필요한 경우 사용 지침을 포함합니다.