Hierarchical Film Data Model
1. 구조와 소유 관계
Project, Sequence, Scene은 상위에서 하위로 이어지는 구조다. Beat와 Shot은 모두 Scene에 속하지만 서로를 포함하지 않는다. BeatShotMapping은 별도 관계 엔티티여야 하며, Beat ID나 Shot ID 배열만으로 관계를 암묵적으로 표현하지 않는다.
2. 엔티티별 책임
| 엔티티 | 책임 | 핵심 필드 | 하위 엔티티 |
|---|---|---|---|
| Project | 영화 전체의 정체성과 기준 설정 | title, logline, script, theme, genre, visualStyle, aspectRatio, targetRuntime, defaults | Sequence, Project Asset Usage |
| Sequence | 하나의 서사 목적을 가진 이야기 구간 | title, scriptRange, narrativePurpose, startState, endState, emotionalArc, visualDefaults, soundDirection | Scene, Sequence Asset Usage |
| Scene | 동일한 장소와 시간에서 진행되는 제작 단위 | title, scriptRange, location, time, weather, lighting, environment, layout | Beat, Shot, Mapping, Scene Asset Usage |
| Beat | 사건·변화·의도·행동·연기의 단위 | narrativeEvent, startState, endState, characterIntent, emotionalChange, action, performance, blocking, timing | Beat Reference, Asset State |
| Shot | 카메라가 포착하는 화면 단위 | shotPurpose, camera, lens, composition, duration, frameDesign, motionDesign | Generation Attempt, Selected Clip |
| BeatShotMapping | Beat와 Shot의 시간·표현 관계 | beatId, shotId, coverageRange, role, notes | 없음 |
| EditRelation | Shot 연결이 만드는 의미·감정·연속성·정보 공개 | previousShotId, nextShotId, transitionType, intendedViewerInference, continuityRequirements | 없음 |
3. 상속과 Override
상속은 Project -> Sequence -> Scene까지의 기본값 해결 규칙이다. 이를 데이터 복사로 구현하지 않는다. 하위 엔티티가 요청될 때 상위 값을 해석해 resolved context를 만든다.
Resolved Scene Context
= Project defaults
+ Sequence overrides
+ Scene overrides
Beat와 Shot은 같은 Scene의 resolved context를 기반으로 한다. 그러나 다음 규칙을 유지한다.
- Beat는 Shot 값을 상속하지 않는다.
- Shot은 Beat 값을 상속하지 않는다.
- Shot은 Mapping으로 연결된 Beat의 정보를 생성 문맥에서 참조할 수 있다.
- 개별 필드의
unset은 상위 값을 사용한다. 상위 값을 의도적으로 비워야 하는 경우를 위한 명시적 제거 표현은 API/DB 계약에서 별도로 정의해야 한다.
권장 우선순위는 다음과 같다.
Project default < Sequence override < Scene override < entity-specific override
Shot 생성 전 Context Director가 판단하는 전체 문맥은 아래를 합성한다.
Project + Sequence + Scene + mapped Beats + Shot
+ neighboring Shots + Edit Relations
+ effective Asset State + continuity state
이 resolved context는 생성 모델의 프롬프트가 아니다. Context Director 전용 입력이며, Renderer에는 Field Routing과 Brief Compiler를 거친 부분집합만 전달한다. 데이터 상속과 생성 프롬프트 주입을 동일한 연산으로 취급하지 않는다.
4. Beat의 구조
Beat는 "무슨 일이 일어나며 무엇이 달라지는가"를 정의한다. 하나의 Beat는 카메라 수나 생성 클립 길이에 종속되지 않는다.
| 영역 | 예시 필드 | 역할 |
|---|---|---|
| Narrative | narrativeEvent, narrativeGoal | 사건과 서사적 의미 |
| State change | startState, endState, emotionalChange | Beat 전후의 차이 |
| Character intent | intention, obstacle, relationshipState | 인물의 목적과 관계 |
| Action | primaryAction, reaction | 화면에서 일어나는 행동 |
| Performance | gaze, expression, posture, gesture, tempo, intensity | 행동이 연기로 드러나는 방식 |
| Blocking | positions, movement, interaction targets | 공간에서의 동선과 배치 |
| Timing | duration, internal cues | Beat 내부 변화의 시간 정보 |
| References | reference assets or media | 연기·행동·분위기 참조 |
Performance는 Beat의 하위 영역으로 독립 보존한다. 예를 들어 "A가 거짓말을 알아챈다"는 Narrative Event이고, "0.7초간 응시한 뒤 천천히 시선을 내린다"는 Performance다. 두 정보를 분리해야 서로 다른 모델·Shot에서 적절히 조합할 수 있다.
5. Shot의 구조
Shot은 서사의 단위가 아니라 화면과 카메라의 단위다.
| 영역 | 예시 필드 |
|---|---|
| 목적 | shotPurpose, viewerInformation, emphasis |
| 카메라 | cameraType, position, height, angle |
| 광학 | lens, focalLength, depthOfField |
| 구도 | framing, subjectPlacement, lookDirection |
| 움직임 | motionType, path, speed, stabilization |
| 시간 | duration, inPoint, outPoint |
| 시작 프레임 | frameDesign: startingMoment, startState, placement, pose, expression, lighting, visibleProps |
| 시간적 전개 | motionDesign: actionFlow, cameraFlow, performanceFlow, gazeFlow, emotionalProgression, temporalRhythm |
| 생성 제어 | promptOverrides, referenceOverrides, modelProfile |
| 결과 | attempts, selectedClip |
frameDesign은 시작 이미지 생성의 입력이고, motionDesign은 시작 이미지로부터 전개되는 영상 생성의 입력이다. startImagePrompt와 videoPrompt는 편집 가능한 원천 데이터가 아니라, 해당 구조와 Context Director 결과에서 컴파일된 실행 산출물로 취급하는 것이 원칙이다.
6. Beat-Shot Mapping 계약
단순한 shot.beatIds는 Shot 안에서 Beat가 어떻게 표현되는지 기록하지 못한다. Mapping은 최소한 다음을 가져야 한다.
| 필드 | 설명 |
|---|---|
beatId | 연결할 Beat |
shotId | 연결할 Shot |
coverageStartMs, coverageEndMs | Shot 내부에서 Beat가 표현되는 시간 범위. 초기에는 선택값일 수 있음 |
role | PRIMARY, SECONDARY, TRANSITION, CONTEXT 등 표현 목적 |
notes | Shot에서 강조하거나 생략해야 할 요소 |
sortOrder | 같은 Shot에서 Beat 문맥을 합성하는 순서 |
예시: Shot 3이 Beat 2의 발견과 Beat 3의 망설임을 모두 다룰 수 있다.
| Shot | Beat | coverageRange | role |
|---|---|---|---|
| Shot 3 | Beat 2: B를 발견 | 0-2.5s | PRIMARY |
| Shot 3 | Beat 3: 망설임 | 2.5-5.0s | TRANSITION |
반대로 하나의 Beat가 와이드 샷, 리액션 클로즈업 등 여러 Shot에 매핑될 수 있다. Beat의 자체 타이밍과 Shot 안의 coverage 범위는 서로 다른 정보이므로 모두 보존한다.
7. Edit Relation 요약
Beat-Shot Mapping은 "어떤 Shot이 어떤 Beat를 표현하는가"를 기록한다. Edit Relation은 "한 Shot 다음에 다른 Shot이 올 때 무엇을 의미하는가"를 기록한다. 두 관계는 서로 대체할 수 없다.
| 필드 | 설명 |
|---|---|
previousShotId, nextShotId | 의미를 생성하는 방향성 있는 Shot 쌍 |
transitionType | cut, dissolve 등 편집 연결 방식 |
intendedViewerInference | 연결을 통해 관객이 추론해야 하는 의미 |
emotionalEffect | 의도한 감정 효과 |
continuityRequirements | 시선, 동작, 위치, 소품 등 유지 조건 |
contrastOrMatch | 시각·행동·의미의 대비 또는 일치 |
informationRevealed | 이 연결에서 새롭게 공개되는 정보 |
상세 계약은 Edit Relation 문서를 따른다.
8. 데이터 무결성 규칙
- Sequence, Scene, Beat, Shot의 순서는 별도 정렬 키로 관리한다.
- Mapping의 양 끝점은 같은 Scene에 속해야 한다.
- 삭제된 Beat 또는 Shot의 Mapping은 함께 정리하거나 복구 가능한 상태로 보존하는 정책이 필요하다.
Selected Clip은 하나의 Shot에서 여러 개가 될 수 없도록 기본 제약을 둔다. 대체 선택본이 필요하면 명시적 버전 또는 alternate 역할을 둔다.- 생성 Attempt는 변경 가능한 현재 상태가 아니라 실행 시점의 입력 스냅샷을 참조한다.
- 인접 Shot용 Edit Relation은 현재 Shot 순서와 일치해야 하며, 순서 변경 시 자동 갱신하지 말고 검토 필요 상태로 표시한다.
- Renderer Prompt에는
director_private또는validator_only정보가 포함되지 않아야 한다. - 현재 범위에서 Edit Relation의 두 Shot은 같은 Scene에 속해야 한다. Scene 경계를 넘는 관계는 편집 타임라인 모델에서 별도로 결정한다.