모션 그래픽 및 타이틀
도형, 스틸 이미지, 텍스트로 구성된 조각을 위한 레시피입니다. montagent의 루프 내 빌드 단계에 삽입됩니다. 아직 로드하지 않았다면 montagent를 먼저 로드하세요.
계획을 세우기 전에 해당 조각 유형의 참조 파일을 여십시오:
| 조각 유형 | 열기 |
|---|---|
| 론치 스팟, 제품 또는 소셜 광고, 인트로, 아웃트로 | 론치 스팟 구조 |
| 로고 리빌, 로고 스팅, 루프되는 모든 것 | 로고 루프 |
| 트레일러, 또는 슬램, 글리치, 플래시, HUD 효과 | 트레일러 효과 |
새로운 조각을 만들거나 디자인을 변경하려면 레이아웃을 선택하기 전에 크리에이티브 방향을 읽으십시오. 이 문서는 네이티브 Montagent에서 시각적 개념, 구성 및 안무를 다룹니다. 특정 편집의 경우 관련 레시피만 읽고 기존 방향을 유지하십시오.
비트 시트에 계획하기
요소를 작성하기 전에 비트 시트를 작성하십시오: 모든 등장, 색상 변경, 컷 및 퇴장을 하나의 테이블에, 각각 montagent-craft가 제공하는 그리드의 비트(템포, 다운비트, 프레임 스냅 및 비트에서 발생하는 이벤트) 위에 표시합니다.
비트 시트에서 생성기 스크립트로 프로젝트를 빌드하여, 리타임이 한 줄 편집이 되도록 합니다.
레시피
모든 레시피는 정답이 아닌 시작 범위를 제공합니다. 각 레시피는 확인 단계로 끝납니다: montagent-craft를 로드한 다음, 단계에서 지정한 곳을 보고 넘어가기 전에 확인합니다.
팝
작은 오버슈트 후 안정되는 등장입니다. 오버슈트는 곡선입니다: 세 개의 키프레임이 아니라 y가 1 이상인 베지어 곡선을 가진 한 쌍의 키프레임입니다.
{
"frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/pop.mp4",
"tracks": [
{"name": "badge", "layer": 10, "elements": [
{"id": "badge", "type": "ellipse", "start": 500, "end": 2000, "x": 960, "y": [{"t": 500, "v": 580}, {"t": 900, "v": 540, "ease": [0.34, 1.56, 0.64, 1]}], "origin": "center", "width": 240, "height": 240, "fill": "#FF5A36", "scale": [{"t": 500, "v": [0.5, 0.5]}, {"t": 900, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}]}
]}
]
}
- 길이: 300–450 ms. 짧으면 스냅 효과, 길면 플로팅 효과.
- 시작 스케일: 텍스트 및 카드의 경우 0.5–0.7; 작은 도형 및 배지의 경우 0.
- 오버슈트:
[0.34, 1.56, 0.64, 1]은 약 10% 초과합니다. 재미있는 효과를 위해 두 번째 숫자를 1.8로 높이거나, 기업 스타일을 위해 1.3으로 낮추십시오. 한 조각 내의 모든 팝에 대해 하나의 곡선을 유지하십시오. - 상승:
y의 20–60 px 이동에 동일한 곡선을 사용하면 무게감이 더해집니다. 행에 배치된 팝에서는 생략하십시오. - 계단식 지연: 각 항목이 자체 비트에 도착하면 1비트; 하나의 비트 내에서 항목 사이에 60–120 ms.
- 확인:
frame을 시작 지점 + 길이의 40%에서 보고 오버슈트가 최고조에 달할 때, 항목이 프레임 가장자리나 이웃을 벗어나지 않는지 확인합니다. 그런 다음 첫 번째 팝 바로 전부터 마지막 팝 바로 후까지의 구간을preview합니다.
홀드, 이어서 클리어
등장의 마지막 키프레임은 이미 홀드되므로, 홀드는 비용이 들지 않습니다. 퇴장은 퇴장이 시작되는 순간에 홀드된 값의 키프레임으로 시작합니다. validate는 해당 키프레임을 R-EASE-INERT로 보고하며, 결과 가이드에서 이것이 예상되는 이유를 설명합니다.
- 퇴장 길이: 200–350 ms,
ease-in. 퇴장은 등장보다 빠르게 실행됩니다. - 퇴장 이동: 페이드 + 20–40 px 이동, 또는 0.9로 축소. 하드 컷의 경우 새 값으로 단일
step키프레임을 사용합니다(스타터 프로젝트의 타이틀 참조). - 홀드 길이:
montagent-craft가 제공하는 읽기 시간. - 그룹 퇴장: 전체 그룹이 함께 퇴장하거나, 읽기 순서로 30–60 ms 간격으로 계단식으로 퇴장합니다.
- 확인: 퇴장 직전의 마지막 그려진 프레임에서
frame을 보고, 전체 그룹이 완전히 들어와서 정지 상태인지 확인합니다.
단어 색상 변경
비트에서 시작하여 해당 단어의 실행(run)에 highlight를 사용하여 줄 내의 단어 색상을 변경합니다. 이렇게 하면 하나의 요소가 유지됩니다: 교차 페이드할 두 번째 복사본이 없으며, 요소 자체의 색상은 줄의 색상을 유지합니다.
{
"frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 3000, "output": "out/accent.mp4",
"fonts": {"title": [{"file": "fonts/Inter-Bold.ttf"}]},
"fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
"tracks": [
{"name": "line", "layer": 20, "elements": [
{"id": "line", "type": "text", "start": 0, "end": 3000, "x": 960, "y": 540, "origin": "center", "width": 1600, "height": 140, "font": "title", "size": 110, "color": "#F5F0E6", "align": "center", "runs": [{"text": "Video your agent can "}, {"text": "read.", "highlight": {"start": 2000, "end": 3000, "color": "#FF5A36"}}], "caption": false}
]}
]
}
- 타이밍: 변경은 비트에서 이루어지며, 단어 등장 시에는 절대 이루어지지 않습니다. 눈이 먼저 단어를 읽을 수 있도록 최소 반 비트의 시간을 주십시오.
- 강조: 단어가 자체 요소인 경우, 동일한 비트에서 스케일 범프(1.0에서 1.06–1.1로, 200–300 ms 동안 다시 돌아옴)를 적용하면 변경이 더욱 강조됩니다.
- 확인: 변경 전후 한 프레임씩
frame을 보고, 변경된 단어만 확인합니다.
키네틱 및 타자 텍스트
모든 문자, 단어 또는 줄이 규칙적인 단계(every ms)에서 하나의 모션 곡선을 공유할 때, 단일 text 요소를 유지하고 units로 계단식 지연을 적용하십시오(by: letter, word 또는 line; order: forward, reverse, center_out 또는 edges_in). 다음은 헤드라인이 중앙에서 바깥쪽으로 초점을 잡으며 나타나는 예입니다:
{
"frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/evaporate.mp4",
"fonts": {"title": [{"file": "fonts/Inter-Bold.ttf"}]},
"fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
"tracks": [
{"name": "title", "layer": 20, "elements": [
{"id": "evaporate", "type": "text", "start": 0, "end": 2000, "x": 960, "y": 540, "origin": "center", "width": 1400, "height": 160, "font": "title", "size": 108, "color": "#F5F0E6", "align": "center", "runs": [{"text": "SHARP FOCUS"}], "units": {"by": "letter", "order": "center_out", "every": 45, "y": [{"t": 0, "v": 20}, {"t": 360, "v": 0, "ease": "ease-out"}], "opacity": [{"t": 0, "v": 0}, {"t": 360, "v": 1, "ease": "ease-out"}], "blur": [{"t": 0, "v": 24}, {"t": 360, "v": 0, "ease": "ease-out"}]}, "caption": false}
]}
]
}
- 증발 / 광학 초점 인(
blur):units내에서blur를16–32px에서0으로 300–450 ms 동안 키프레임(ease-out)하고,opacity(0 -> 1) 및 작은y상승(16–28px-> 0) 또는scale([1.08, 1.08] -> [1.0, 1.0])을 함께 사용합니다.blur가0에 도달하고opacity가1에 도달하면, 렌더러는 추가 레이어 비용 없이 고속 경로를 사용합니다. - 대칭 순서(
center_out,edges_in):center_out은 중간 유닛(개수가 짝수인 경우 중간 쌍)에서 시작하여 양쪽 끝으로 바깥쪽으로 단계를 진행합니다.edges_in은 첫 번째와 마지막 유닛에서 동시에 시작하여 중간에서 수렴합니다. - 진행파 (
A -> 피크 -> A): After Effects 범위 선택기(triangle,round또는smooth) 대신,units에 세 개의 키프레임 반환 곡선을 작성하십시오. 예를 들어"y": [{"t": 0, "v": 0}, {"t": 180, "v": -28, "ease": "ease-out"}, {"t": 360, "v": 0, "ease": "ease-in-out"}](또는scale/blur펄스)를 작성하고every가 피크를 라인 전체에 리플처럼 퍼뜨리도록 하십시오. 사용자 정의 타이밍이 필요한 단어나 문자 하나를 분리하려면unit을 사용하여 자체 실행(run)으로 분할하십시오. - 글리프를
text로 유지하십시오 (글리프를path로 변환하지 마십시오):path요소는 하나의 윤곽선(holes없이points)을 가지므로, 다중 윤곽선 글리프(O,A,B,8,i,?,%)를path로 변환하면 내부 카운터가 채워지거나 섬(islands)이 빠집니다 (ADR-0224). 텍스트를text로 유지하고stroke,units,path및effects로 스타일을 지정하거나 애니메이션을 적용하십시오. - 불규칙한 비트 시간 또는 타자 커서 (
scripts/type_on.py): 단어가 불규칙한 비트 타임스탬프에 도착하거나 문자에 스테핑cursor가 필요한 경우,python3 scripts/type_on.py <project> <spec>을 실행하십시오 (--help로 사양 확인 가능).measure로 라인을 측정하고 유닛당 하나의text요소를 내보냅니다. ("by": "word"with"enter": "pop"andtimes/highlights, 또는"by": "letter"at 60–150 ms with a blinkingcursor), 각각caption: false로 표시합니다. - 트래킹 타이틀: 타이틀을 문자로 분할하지 마십시오.
letter_spacing을 사용하여 하나의text요소를 작성하십시오. 단위는 em의 1000분의 1입니다(size × letter_spacing / 1000px after each letter; 음수는 좁힘). 타이틀을 분리하기 위해 키프레임을 적용합니다:"letter_spacing": [{"t": 0, "v": 0}, {"t": 800, "v": 120, "ease": [0.65, 0, 0.35, 1]}]. 0이 아닌 값은 선택적 합자를 끄며, 아랍어와 같은 결합 스크립트는 간격을 적용하지 않습니다. - 세로 열 및 옆으로 돌린 스파인: Montagent에는
writing_mode속성이 없습니다 (ADR-0224). 수직으로 쌓은 열 (CJK 세로 텍스트 또는 쌓은 마키)의 경우, 좁은text상자 내에서 그래핌을으로 결합하십시오 ("text": "東\n京\n都"),"align": "center"및"line_height": 1.0또는1.1사용; 한 줄에 2–3개의 가로 숫자 또는 라틴 이니셜을 유지하십시오 ("text": "第\n25\n回", Tate-chu-yoko),"by": "line"로 계단식 지연을 적용하여 가로 숫자가 하나의 단위로 움직이도록 하십시오. 옆으로 돌린 라틴 스파인의 경우, 가로text요소를 설정하고"rotation": -90(아래에서 위로 읽음) 또는"rotation": 90(위에서 아래로 읽음)으로 회전하십시오. - 확인: 라인이 나타나는 구간을
preview합니다. 그런 다음 정지 상태에서frame을 보고, 간격이 한 줄로 읽히는지, 단어나 문자 경계에서 더 넓은 간격이 없는지 확인합니다.
와이프로 리빌
와이프는 가장자리를 가로질러 밀어서 무언가를 드러냅니다. 물체 위에 가림막을 놓습니다: 물체 뒤에 정확히 무엇이 있는지로 채워진 사각형입니다. 그런 다음 가림막의 먼 가장자리를 기준으로 축소하여 가까운 가장자리가 가로질러 휩쓸리도록 합니다. 그 가장자리를 따라 있는 악센트 바는 와이프가 의도적으로 보이도록 합니다.
{
"frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/wipe.mp4",
"tracks": [
{"name": "mark", "layer": 10, "elements": [
{"id": "mark", "type": "image", "start": 0, "end": 2000, "source": "media/still.png", "x": 960, "y": 540, "origin": "center", "width": 360, "height": 360, "fit": "contain"}
]},
{"name": "occluder", "layer": 11, "elements": [
{"id": "occluder", "type": "rect", "start": 0, "end": 1000, "x": 1160, "y": 540, "origin": "center-right", "width": 400, "height": 400, "fill": "#101418", "scale": [{"t": 400, "v": [1.0, 1.0]}, {"t": 900, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
]},
{"name": "edge", "layer": 12, "elements": [
{"id": "edge", "type": "rect", "start": 400, "end": 1000, "x": [{"t": 400, "v": 760}, {"t": 900, "v": 1160, "ease": [0.65, 0, 0.35, 1]}], "y": 540, "origin": "center", "width": 16, "height": 420, "fill": "#FF5A36", "opacity": [{"t": 900, "v": 1.0}, {"t": 1000, "v": 0.0, "ease": "ease-in"}]}
]}
]
}
- 길이: 400–600 ms,
[0.65, 0, 0.35, 1]: 부드럽게 시작하고 끝나는 스윕. - 가림막: 물체보다 모든 면에서 20–40 px 크고, 배경과 동일한 채움색. 시작 키프레임은 와이프가 시작되는 위치에 있어 물체가 그때까지 덮여 있도록 합니다.
- 가장자리 바: 8–24 px 너비, 가림막보다 5–10% 더 높으며, 동일한 곡선 및 시간으로 이동합니다. 스윕이 완료된 후 100–200 ms 동안 사라집니다.
- 방향: 읽기 방향으로 와이프; 와이프 오프하려면 가까운 가장자리에서 가림막을 다시 늘립니다.
- 복잡한 배경: 가림막은 단색 배경에서만 작동합니다. 사진, 그라데이션 또는 푸티지 위에서는 요소 자체의
mask를 대신 키프레임합니다:{"name": "mask", "shape": "rect", "x": 0, "y": 0, "width": [{"t": 400, "v": 0}, {"t": 900, "v": 400, "ease": [0.65, 0, 0.35, 1]}], "height": 400}은 가림막 없이 400 × 400 요소를 왼쪽 가장자리에서 드러냅니다. 사각형은 요소-로컬이며, 요소의 왼쪽 위에서 시작합니다. 너비가 0인 마스크는 요소를 숨기므로 리빌이 덮인 상태에서 시작됩니다. 부드러운 가장자리를 위해feather를 추가하십시오. - 확인: 스윕 중간에서
frame을 보고 가장자리 바가 가림막의 가장자리를 정확히 덮는지 확인합니다. 그런 다음 스윕 직후frame을 보고 가림막의 흔적이 남지 않았는지 확인합니다.
푸시, 슬라이드 또는 와이프로 전환
하나의 카드, 스틸 또는 장면에서 다음으로 모션과 함께 이동하려면, 두 개를 push, slide 또는 wipe 종류의 transition으로 연결하십시오. 두 요소 모두에 키프레임된 x는 연결 지점에서 분리되어 표류합니다. 전환은 두 반쪽을 픽셀 단위로 결합된 상태로 유지하며, validate가 이를 확인합니다.
{
"frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 3000, "output": "out/handover.mp4",
"tracks": [
{"name": "first", "layer": 10, "elements": [
{"id": "card-1", "type": "rect", "start": 0, "end": 1700, "x": 0, "y": 0, "origin": "top-left", "width": 1920, "height": 1080, "fill": "#FF5A36"}
]},
{"name": "second", "layer": 11, "elements": [
{"id": "card-2", "type": "rect", "start": 1200, "end": 3000, "x": 0, "y": 0, "origin": "top-left", "width": 1920, "height": 1080, "fill": "#2E86FF"}
]},
{"name": "handover", "layer": 12, "elements": [
{"id": "handover", "type": "transition", "start": 1200, "end": 1700, "kind": "push", "from": "card-1", "to": "card-2", "direction": "left", "ease": [0.65, 0, 0.35, 1]}
]}
]
}
- 종류:
push는 두 요소가 하나의 스트립(페이지, 단계, 캐러셀)에 속할 때;slide는 새 요소가 정지된 요소 위에 착지할 때;wipe는 이전 요소가 제자리에 머물러 잘려 나가야 할 때 사용합니다. - 방향: 모션이 이동하는 방향.
left는 새 요소를 오른쪽에서 가져오며, 읽기 방향을 따릅니다. - 길이: 400–600 ms,
[0.65, 0, 0.35, 1]. 전환의start와end는 두 요소가 정확히 공유하는 시간입니다. - 슬라이드 스태킹:
slide에서 들어오는 요소는 더 높은layer에 있어야 합니다. - 확인: 전환 중간에서
frame을 보고 픽셀 단위의 갭이나 오버랩이 없는지 확인합니다. 그런 다음montagent-craft의validate를 실행하여 전환 키프레임이 일치하는지 확인합니다.
카드 뒤집기 및 원근 도어 스윙
카드 뒤집기(뒷면 -> 앞면)는 하나의 element에서 rotation 키프레임 쌍을 사용하여 x 또는 y 축을 기준으로 수행할 수 있습니다. 시각적 원근을 위해 피벗을 면의 중앙에서 가장자리로 이동하십시오. Montagent의 perspective는 보는 사람으로부터의 오프셋을 모방하므로(음수는 물체를 뒤로 밀어냄), 중립적인 시작점 0에서 원하는 깊이로 키프레임을 적용할 수 있습니다.
원근 도어 스윙의 경우, 피벗의 한 면에 단일 rect 또는 image 요소를 사용하고 scaleX를 1.0에서 0.0으로 키프레임하십시오. 이는 문이 닫히는 효과를 만듭니다.`
{
"frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/door-swing.mp4",
"tracks": [
{"name": "door", "layer": 10, "elements": [
{"id": "door", "type": "rect", "start": 0, "end": 2000, "x": 960, "y": 540, "origin": "center-left", "width": 400, "height": 600, "fill": "#FF5A36", "scale": [{"t": 500, "v": [1.0, 1.0]}, {"t": 1100, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
]}
]
}
- 뒤집기 길이: 400–600 ms,
[0.65, 0, 0.35, 1]. - 원근:
perspective를 시작 프레임 이전에 설정된 값으로 키프레임하여 Z 공간의 깊이를 시뮬레이션합니다. - 확인:
frame을 뒤집기 중간에서preview하고, 요소가 원하는 방식으로 뒤집히는지 확인합니다.
루프: 로고 리빌, 로고 스팅, 배지
로고 리빌, 로고 스팅 또는 애니메이션 배지의 경우, 로고 루프 참조 파일을 따라 전체 구조를 만드십시오. 일반적으로 요소의 start와 end 사이에서 애니메이션이 반복되는 루프를 포함합니다.
각 루프에는 duration보다 긴 end가 있는 요소가 있습니다. 루프 애니메이션은 요소의 지속 시간 내에서 재생을 반복합니다.
- 루프 구조:
type: "loop"요소를 생성하고, 내부에 애니메이션할 자식 요소를 배치합니다. - 로고 배치: 로고는 중앙에 배치하고
fit: "contain"으로 크기를 조정합니다. - 확인: 루프를
preview하고 반복이 부드러운지 확인합니다.
트레일러 효과: 슬램드 타이틀, 글리치 컷, HUD
트레일러 또는 하이-에너지 비디오의 경우, 트레일러 효과 참조 파일을 사용하십시오. 이 효과는 급격한 컷, 오버레이 및 동기화된 텍스트를 포함합니다.
- 슬램드 타이틀:
[0.34, 1.56, 0.64, 1]과 같은 공격적인 이징을 가진 단일 키프레임 쌍을 사용하여 텍스트를 빠르게 확대합니다. - 글리치 컷:
opacity를 0에서 1로 빠르게 전환하는step키프레임을 사용하여 컷을 강조합니다. - HUD: 여러 개의 얇은
rect요소를 사용하여 그리드와 요소를 만들고,opacity를 키프레임합니다. - 확인:
preview를 실행하고 모든 효과가 올바르게 동기화되었는지 확인합니다.
일반 확인
각 레시피의 확인 단계 후, 전체 프로젝트에 대해 다음을 수행하십시오:
- 프레임 검사:
frame을 주요 이벤트(등장, 색상 변경, 퇴장) 전후의 프레임에서 확인합니다. - 미리보기:
preview를 실행하여 전체 비디오의 흐름과 타이밍을 확인합니다. - 검증:
montagent-craft validate를 실행하여 오류 및 경고를 확인합니다.