-
Notifications
You must be signed in to change notification settings - Fork 0
애니메이션 생성 #2
Description
[1] 애니메이션 생성 부분
성공 애니메이션 파이프라인 (행동 결정 → 물리 참고값 계산 → Keyframe 설계 → 수치 보정)
정답 클릭 시점에만 실행되며, 오브젝트별로 "어떤 움직임을", "어떤 물리 기반으로", "AI가 어떻게 설계할지"를 단계별로 결정한다.
AI는 애니메이션 설계를 담당하고 엔진은 실행만 담당한다. 이 분리로 안정성을 확보하고 CPU 환경에서도 배포 가능하게 한다.
💡 파이프라인 실행 조건
정답 클릭 시에만 파이프라인 전체가 실행된다.
오답 클릭과 호버에는 아무 반응 없음.
(호버/오답 반응은 위치 힌트가 되므로 의도적으로 배제)
📊 파이프라인 입력 — 오브젝트 정보
오브젝트 식별 정보
의미 분류: 카테고리 / 서브카테고리
공간·크기 정보: 위치 좌표, 장면 내 관계
시각 상태: 가림 비율
물리 속성: 재질 / 무게 / 크기 분류
📊 파이프라인 출력 — 애니메이션 설정 전체
프레임별 위치·회전·크기·투명도·발광 정보
재생 시간
보간 곡선
변환 기준점
반복 여부 / 완료 후 처리 / 파티클 효과 여부 : 파이프라인 고정값 (AI 개입 불가)
[2] 행동 결정 부분
가장 먼저 선행되어야 하는 것은 "이 오브젝트를 어떤 방식으로 움직일지"를 결정하는 것이고,
그 결과가 이후 물리 계산과 Keyframe 설계 전체의 방향을 결정한다.
*참고로 현재 오브젝트라고 정의한 것은 배경과는 별개로 분리된 Object Layer들이다.
결정 우선순위 (높은 것이 먼저 적용)
- 억제 규칙 — 조건 해당 시 미세 burst로 강제 교체
- 장면 내 관계 — 매달린 구조 → 진자 운동 등
- 오브젝트 의미 — 동물 종류, 탈것 종류 등 서브카테고리 기반
- 카테고리 기본 매핑 — 동물 → 점프, 원형 물체 → 회전 등
- fallback — 위 규칙 중 매칭 없으면 기본 진동
📍 억제 규칙
숨은그림찾기의 핵심 보호 장치. 정답 클릭 이후에도 오브젝트가 크게 움직이면
인접한 미발견 오브젝트의 위치까지 노출될 수 있다.
→ 크기 변화만 허용하는 미세 burst로 대체해서 피드백은 주되 위치 노출은 방지.
억제 조건 (OR 조건 — 하나라도 해당하면 강제 교체)
- 가림 비율이 높은 오브젝트
→ 크게 움직이면 인접 미발견 오브젝트 위치 노출 위험 - 매우 작은 오브젝트
→ 이동·회전이 주변 대비 과도하게 눈에 띔
억제 조건이 존재하는 이유
가림 비율 기준: 절반 이상 가려지면 움직임 자체가 위치 신호가 됨
크기 기준: 작은 오브젝트에서 큰 이동은 크기 대비 과함
📍 타입별 움직임 분류
| 타입 | 발동 조건 | 움직임 특징 |
|---|---|---|
| 점프 | 동물 계열 오브젝트 | 위로 튀어오름. 준비 → 상승 → 착지 |
| 진자 | 매달린 구조의 오브젝트 | 좌우 회전 감쇠. 위쪽 기준점 고정 |
| 기본 진동 | fallback (기본값) | 제자리 회전 진동 |
| Y축 회전 | 바퀴·동전 등 회전 물체 | 좌우 압축·복원으로 Y축 회전 표현 |
| 수평 이동 | 수평 방향 특성 물체 | 좌우 감쇠 진동 |
| 미세 burst | 억제 규칙 해당 오브젝트 | 크기 변화만. 위치·회전 변화 없음 |
💡 설계 노트
향후 확장 방향:
현재 규칙 기반(Rule-based) 결정 구조를 유지하되,
내부 결정 로직만 AI 기반으로 교체 가능하도록 입출력 인터페이스를 고정함.
입력(오브젝트 정보) → 출력(움직임 타입 + 억제 여부)의 계약은 변경되지 않음.
[3] 물리 파라미터 계산 부분
채택한 물리 설계 요소
가장 먼저 선행되어야 하는 건 "물리적으로 타당한 움직임"을 위한 수치 기반을 만드는 것이고,
그 다음에 이어지는 AI의 Keyframe 설계가 이 수치를 참고값으로 활용한다.
*참고로 물리 참고값은 AI를 구속하지 않는다. AI가 최종 수치를 자유롭게 결정하되
현실적인 움직임의 기준선으로 활용하는 용도이다.
현재 오브젝트로부터 얻을 수 있는 물리 정보의 종류
📍 from. 오브젝트 속성
물리적인 요소) 재질 | 무게 | 크기 분류
공간적인 요소) 가림 비율 | 면적
📍 from. 행동 결정 결과
결정된 움직임 타입 | 억제 여부
📍 from. 물리 수식
감쇠계수: 재질 특성 × 무게 보정
진폭: 크기 기반 기본값 → 가림 비율이 높으면 억제
각주파수: 움직임 타입별 수식 적용
지속시간: 위 값에서 도출
- 타입별 물리 파라미터 계산 방식
진자 운동
근거: 실제 진자 물리법칙 적용. 매달린 높이가 높을수록 느리게 흔들림.
설계 의도: 오브젝트의 장면 내 위치 관계를 수치에 반영.
점프
근거: 오브젝트 크기에 따라 튀어오르는 높이 차별화.
설계 의도: 작은 물체는 낮게, 큰 물체는 높게 튀어오르는 자연스러운 비례 관계.
미세 burst (억제 오브젝트 전용)
근거: 진폭 매우 작게, 감쇠 매우 빠르게.
설계 의도: 찾았다는 피드백은 주되 위치는 노출하지 않는 효과.
기본 진동 / Y축 회전 / 수평 이동
근거: 각 움직임 특성에 맞는 진동 수식 적용.
- 물리 파라미터 계산 후 AI 전달 방식
산출된 값은 AI에 "참고값으로만" 전달.
AI가 최종 수치를 결정하며, 참고값을 초과하거나 무시할 수 있음.
📊 물리 파라미터 계산 요약
| 계산 항목 | 입력 데이터 | 계산 방식 | 용도 |
|---|---|---|---|
| 감쇠계수 | 재질, 무게 | 재질 특성값 × 무게 보정 계수 | AI 참고값 |
| 진폭 | 크기 분류, 가림 비율 | 크기 기반 기본값 → 가림 억제 | AI 참고값 |
| 각주파수 | 움직임 타입, 공간 정보 | 타입별 물리 수식 | AI 참고값 |
| 지속시간 | 위 값에서 도출 | 진폭·감쇠 기반 | AI 참고값 |
| 미세 burst | 억제 여부 | 별도 고정 파라미터 세트 | AI 참고값 |
💡 설계 노트
물리 계산을 AI 호출과 분리한 이유:
AI 없이도 물리 수식만으로 Keyframe을 직접 계산하는 fallback이 가능.
물리 파라미터 계산은 항상 실행되며 Keyframe 생성 단계의 입력을 준비하는 역할.
[4] Keyframe 생성 부분
채택한 Keyframe 설계 방식
가장 먼저 선행되어야 하는 건 "AI가 물리 참고값을 바탕으로 프레임별 좌표를 직접 설계"하는 것이고,
그 다음에 이어지는 파이프라인 고정값 주입과 수치 보정이 최종 애니메이션 설정을 완성한다.
*참고로 파이프라인이 고정하는 값은 AI가 개입할 수 없다. 게임 일관성과 UX 보호를 위한 설계 선택이다.
현재 AI에게 제공하는 컨텍스트 종류
📍 오브젝트 정보 컨텍스트
의미 분류: 카테고리, 서브카테고리
물리 속성: 재질, 무게, 크기
공간 상태: 가림 비율, 장면 내 관계
📍 물리 참고값 컨텍스트
감쇠계수 / 진폭 / 각주파수 / 지속시간 / 타입별 참고값
📍 AI 설계 제약 컨텍스트
이동 방향 제한: 위로만 이동 (아래로 내려가는 것 금지)
이동·회전·크기 변화 허용 범위 명시
억제 오브젝트: 크기 변화만 허용. 위치·회전 변화 없음.
- AI 생성 경로 (AI 호출 가능할 때)
오브젝트 컨텍스트 + 물리 참고값 → AI에 제공
AI가 프레임별 위치·회전·크기·투명도·발광, 재생 시간, 보간 곡선, 변환 기준점 직접 설계
응답 파싱 → 억제 오브젝트 보정(위치·회전 강제 제거) → 마지막 프레임 투명도 주입
AI 타입별 설계 가이드라인 (제약 조건으로 제공)
점프 : 준비 동작(압축) → 상승(늘어남) → 착지(압축). 수직 이동 사용. 발 기준점.
진자 : 최대 각도에서 시작, 좌우 회전 감쇠 패턴. 상단 기준점.
기본 진동: 중립에서 시작하는 회전 진동. 미세 크기 변화 추가.
Y축 회전: 좌우 압축·복원으로 Y축 회전 표현. 중심 기준점.
수평 이동: 좌우 감쇠 진동. 중심 기준점.
미세 burst: 크기 변화만. 위치·회전 없음.
-
수식 fallback 경로 (AI 호출 불가 시)
AI 없이 물리 수식으로 프레임별 좌표 직접 계산 → Keyframe 생성
AI 의존도 없이 완전 동작 보장. -
공통 후처리 (경로 무관)
프레임 데이터 구조 변환
보간 곡선 / 변환 기준점 유효성 검사 및 보정 -
파이프라인 고정값 주입 (AI 개입 불가)
아래 값은 AI에게 제약 조건으로 사전 고지하고, 후처리에서도 강제 적용된다.
| 고정값 항목 | 설계 이유 |
|---|---|
| 발견 후 반투명 | 찾은 오브젝트임을 시각적으로 확인시킴 |
| 1회 재생 | 성공 애니메이션은 반복 없이 1회만 |
| 완료 후 dim 처리 | 완료 후 반드시 흐리게 처리 |
| 파티클 효과 | 가림 비율 기반으로 자동 결정 |
| 발광 반경 | 오브젝트 크기에 비례하여 자동 결정 |
📊 Keyframe 설계 매핑 요약
| 단계 | 처리 경로 | 핵심 산출물 |
|---|---|---|
| AI 컨텍스트 구성 | 오브젝트 정보 + 물리 참고값 | AI에 전달할 입력 구성 |
| AI 설계 | AI 호출 → 응답 파싱 | 프레임별 좌표, 보간 곡선, 기준점 |
| 억제 보정 | 미세 burst 강제 적용 | 위치·회전 변화 제거 |
| 파이프라인 값 주입 | 고정값 덮어쓰기 | 투명도, 반복 여부, 완료 처리, 파티클 |
| fallback | 물리 수식 직접 계산 | AI 없이도 완전 동작 |
💡 설계 노트 (핵심 설계 변경 이력)
기존 구조: 물리 수식이 좌표 계산 → AI가 배율만 조정
변경 구조: 물리 수식은 참고값 제공 → AI가 좌표를 직접 설계
변경 이유: AI가 오브젝트 의미(재질·맥락·장면 관계)를 반영한 자연스러운 움직임 설계 가능.
물리 수식은 현실적인 기준선 역할에만 집중.
[5] 최종 파이프라인
🏗️ 성공 애니메이션 4단계 연쇄 파이프라인
본 파이프라인은 "행동 결정 → 물리 참고값 계산 → Keyframe 설계 → 수치 보정"을 순차 실행하며,
각 단계의 출력이 다음 단계의 입력이 되는 연쇄 구조로 설계되었습니다.
🔄 실행 시퀀스
[단계 1] 행동 결정 → 움직임 타입 + 억제 여부
[단계 2] 물리 계산 → 타입별 물리 참고값
[단계 3] Keyframe 설계 → 프레임별 좌표 전체
[단계 4] 수치 보정 → 최종 애니메이션 설정 (엔진 전달용)
📍 단계 1: 행동 결정
입력: 오브젝트 전체 정보
연쇄 프로세스:
억제 조건 판단 → 미세 burst 강제 여부 결정
장면 관계 → 오브젝트 의미 → 카테고리 순으로 움직임 타입 결정
매칭 없으면 기본 진동 (fallback)
출력: 움직임 타입 + 억제 여부 + 결정 근거
📍 단계 2: 물리 계산
입력: 오브젝트 정보 + 행동 결정 결과
연쇄 프로세스:
재질·무게 기반 감쇠계수 산출
크기·가림 비율 기반 진폭 산출
움직임 타입별 수식으로 각주파수·지속시간 계산
억제 오브젝트인 경우 별도 고정 파라미터 세트 반환
출력: 감쇠계수, 진폭, 각주파수, 지속시간, 타입별 참고값
📍 단계 3: Keyframe 설계
입력: 오브젝트 정보 + 행동 결정 결과 + 물리 참고값 + AI 연결 여부
연쇄 프로세스 (AI 경로):
오브젝트 컨텍스트 + 물리 참고값 구성 → AI 설계 → 응답 파싱
억제 오브젝트 보정(위치·회전 강제 제거) → 파이프라인 고정값 주입
연쇄 프로세스 (fallback 경로):
AI 연결 불가 또는 호출 실패 → 물리 수식으로 Keyframe 직접 생성
출력: 프레임별 좌표 전체 + 재생 시간 + 보간 곡선 + 기준점 + 파이프라인 고정값
📍 단계 4: 수치 보정
입력: Keyframe 설계 결과
연쇄 프로세스:
재생 시간 허용 범위 클램핑
이동·회전·크기 변화 허용 범위 클램핑
프레임 시간 오름차순 정렬
시작·종료 프레임 자동 보완
예외 발생 대신 클램핑으로 처리 (UX 우선)
출력: 최종 애니메이션 설정 (엔진 전달용)
📋 파이프라인 요약 테이블
| 단계 | 실행 순서 | 분기 발생 조건 | 핵심 산출물 |
|---|---|---|---|
| 행동 결정 | 1순위 | 억제 조건 해당 → 미세 burst 강제 | 움직임 타입, 억제 여부 |
| 물리 계산 | 2순위 | 억제 오브젝트 → 고정 파라미터 세트 | 감쇠계수, 진폭, 각주파수 |
| Keyframe | 3순위 | AI 연결 가능 여부 → AI 설계 / 수식 | 프레임별 좌표 전체 |
| 수치 보정 | 4순위 | 없음 (항상 실행) | 최종 애니메이션 설정 |
💡 설계 노트
설계 분리 원칙:
AI는 애니메이션 설정(config)을 생성하고, 엔진은 실행만 담당.
이 분리로 안정성 확보 및 AI 없이도 완전 동작 가능.
데이터 전달 원칙:
각 단계는 독립적으로 동작하며, 이전 단계의 출력만을 입력으로 받음.
단계 간 직접 참조 없음.
fallback 보장:
AI 연결 불가 또는 호출 실패 시 물리 수식 기반으로 자동 전환.
AI 의존도 없이 완전 동작 보장.
수치 보정 우선 원칙:
범위 초과 시 예외를 발생시키지 않고 클램핑.
하나의 오브젝트 애니메이션이 멈추는 것보다 보정값으로 실행되는 것이 UX 상 낫다.