Skip to content

애니메이션 생성 #2

@solidSnakesado

Description

@solidSnakesado

[1] 애니메이션 생성 부분
성공 애니메이션 파이프라인 (행동 결정 → 물리 참고값 계산 → Keyframe 설계 → 수치 보정)
정답 클릭 시점에만 실행되며, 오브젝트별로 "어떤 움직임을", "어떤 물리 기반으로", "AI가 어떻게 설계할지"를 단계별로 결정한다.
AI는 애니메이션 설계를 담당하고 엔진은 실행만 담당한다. 이 분리로 안정성을 확보하고 CPU 환경에서도 배포 가능하게 한다.

💡 파이프라인 실행 조건
정답 클릭 시에만 파이프라인 전체가 실행된다.
오답 클릭과 호버에는 아무 반응 없음.
(호버/오답 반응은 위치 힌트가 되므로 의도적으로 배제)

📊 파이프라인 입력 — 오브젝트 정보
오브젝트 식별 정보
의미 분류: 카테고리 / 서브카테고리
공간·크기 정보: 위치 좌표, 장면 내 관계
시각 상태: 가림 비율
물리 속성: 재질 / 무게 / 크기 분류

📊 파이프라인 출력 — 애니메이션 설정 전체
프레임별 위치·회전·크기·투명도·발광 정보
재생 시간
보간 곡선
변환 기준점
반복 여부 / 완료 후 처리 / 파티클 효과 여부 : 파이프라인 고정값 (AI 개입 불가)

[2] 행동 결정 부분
가장 먼저 선행되어야 하는 것은 "이 오브젝트를 어떤 방식으로 움직일지"를 결정하는 것이고,
그 결과가 이후 물리 계산과 Keyframe 설계 전체의 방향을 결정한다.

*참고로 현재 오브젝트라고 정의한 것은 배경과는 별개로 분리된 Object Layer들이다.

결정 우선순위 (높은 것이 먼저 적용)

  1. 억제 규칙 — 조건 해당 시 미세 burst로 강제 교체
  2. 장면 내 관계 — 매달린 구조 → 진자 운동 등
  3. 오브젝트 의미 — 동물 종류, 탈것 종류 등 서브카테고리 기반
  4. 카테고리 기본 매핑 — 동물 → 점프, 원형 물체 → 회전 등
  5. fallback — 위 규칙 중 매칭 없으면 기본 진동

📍 억제 규칙
숨은그림찾기의 핵심 보호 장치. 정답 클릭 이후에도 오브젝트가 크게 움직이면
인접한 미발견 오브젝트의 위치까지 노출될 수 있다.
→ 크기 변화만 허용하는 미세 burst로 대체해서 피드백은 주되 위치 노출은 방지.

억제 조건 (OR 조건 — 하나라도 해당하면 강제 교체)

  1. 가림 비율이 높은 오브젝트
    → 크게 움직이면 인접 미발견 오브젝트 위치 노출 위험
  2. 매우 작은 오브젝트
    → 이동·회전이 주변 대비 과도하게 눈에 띔

억제 조건이 존재하는 이유
가림 비율 기준: 절반 이상 가려지면 움직임 자체가 위치 신호가 됨
크기 기준: 작은 오브젝트에서 큰 이동은 크기 대비 과함

📍 타입별 움직임 분류

타입 발동 조건 움직임 특징
점프 동물 계열 오브젝트 위로 튀어오름. 준비 → 상승 → 착지
진자 매달린 구조의 오브젝트 좌우 회전 감쇠. 위쪽 기준점 고정
기본 진동 fallback (기본값) 제자리 회전 진동
Y축 회전 바퀴·동전 등 회전 물체 좌우 압축·복원으로 Y축 회전 표현
수평 이동 수평 방향 특성 물체 좌우 감쇠 진동
미세 burst 억제 규칙 해당 오브젝트 크기 변화만. 위치·회전 변화 없음

💡 설계 노트
향후 확장 방향:
현재 규칙 기반(Rule-based) 결정 구조를 유지하되,
내부 결정 로직만 AI 기반으로 교체 가능하도록 입출력 인터페이스를 고정함.
입력(오브젝트 정보) → 출력(움직임 타입 + 억제 여부)의 계약은 변경되지 않음.

[3] 물리 파라미터 계산 부분
채택한 물리 설계 요소
가장 먼저 선행되어야 하는 건 "물리적으로 타당한 움직임"을 위한 수치 기반을 만드는 것이고,
그 다음에 이어지는 AI의 Keyframe 설계가 이 수치를 참고값으로 활용한다.

*참고로 물리 참고값은 AI를 구속하지 않는다. AI가 최종 수치를 자유롭게 결정하되
현실적인 움직임의 기준선으로 활용하는 용도이다.

현재 오브젝트로부터 얻을 수 있는 물리 정보의 종류
📍 from. 오브젝트 속성
물리적인 요소) 재질 | 무게 | 크기 분류
공간적인 요소) 가림 비율 | 면적

📍 from. 행동 결정 결과
결정된 움직임 타입 | 억제 여부

📍 from. 물리 수식
감쇠계수: 재질 특성 × 무게 보정
진폭: 크기 기반 기본값 → 가림 비율이 높으면 억제
각주파수: 움직임 타입별 수식 적용
지속시간: 위 값에서 도출

  1. 타입별 물리 파라미터 계산 방식

진자 운동
근거: 실제 진자 물리법칙 적용. 매달린 높이가 높을수록 느리게 흔들림.
설계 의도: 오브젝트의 장면 내 위치 관계를 수치에 반영.

점프
근거: 오브젝트 크기에 따라 튀어오르는 높이 차별화.
설계 의도: 작은 물체는 낮게, 큰 물체는 높게 튀어오르는 자연스러운 비례 관계.

미세 burst (억제 오브젝트 전용)
근거: 진폭 매우 작게, 감쇠 매우 빠르게.
설계 의도: 찾았다는 피드백은 주되 위치는 노출하지 않는 효과.

기본 진동 / Y축 회전 / 수평 이동
근거: 각 움직임 특성에 맞는 진동 수식 적용.

  1. 물리 파라미터 계산 후 AI 전달 방식
    산출된 값은 AI에 "참고값으로만" 전달.
    AI가 최종 수치를 결정하며, 참고값을 초과하거나 무시할 수 있음.

📊 물리 파라미터 계산 요약

계산 항목 입력 데이터 계산 방식 용도
감쇠계수 재질, 무게 재질 특성값 × 무게 보정 계수 AI 참고값
진폭 크기 분류, 가림 비율 크기 기반 기본값 → 가림 억제 AI 참고값
각주파수 움직임 타입, 공간 정보 타입별 물리 수식 AI 참고값
지속시간 위 값에서 도출 진폭·감쇠 기반 AI 참고값
미세 burst 억제 여부 별도 고정 파라미터 세트 AI 참고값

💡 설계 노트
물리 계산을 AI 호출과 분리한 이유:
AI 없이도 물리 수식만으로 Keyframe을 직접 계산하는 fallback이 가능.
물리 파라미터 계산은 항상 실행되며 Keyframe 생성 단계의 입력을 준비하는 역할.

[4] Keyframe 생성 부분
채택한 Keyframe 설계 방식
가장 먼저 선행되어야 하는 건 "AI가 물리 참고값을 바탕으로 프레임별 좌표를 직접 설계"하는 것이고,
그 다음에 이어지는 파이프라인 고정값 주입과 수치 보정이 최종 애니메이션 설정을 완성한다.

*참고로 파이프라인이 고정하는 값은 AI가 개입할 수 없다. 게임 일관성과 UX 보호를 위한 설계 선택이다.

현재 AI에게 제공하는 컨텍스트 종류
📍 오브젝트 정보 컨텍스트
의미 분류: 카테고리, 서브카테고리
물리 속성: 재질, 무게, 크기
공간 상태: 가림 비율, 장면 내 관계

📍 물리 참고값 컨텍스트
감쇠계수 / 진폭 / 각주파수 / 지속시간 / 타입별 참고값

📍 AI 설계 제약 컨텍스트
이동 방향 제한: 위로만 이동 (아래로 내려가는 것 금지)
이동·회전·크기 변화 허용 범위 명시
억제 오브젝트: 크기 변화만 허용. 위치·회전 변화 없음.

  1. AI 생성 경로 (AI 호출 가능할 때)
    오브젝트 컨텍스트 + 물리 참고값 → AI에 제공
    AI가 프레임별 위치·회전·크기·투명도·발광, 재생 시간, 보간 곡선, 변환 기준점 직접 설계
    응답 파싱 → 억제 오브젝트 보정(위치·회전 강제 제거) → 마지막 프레임 투명도 주입

AI 타입별 설계 가이드라인 (제약 조건으로 제공)
점프 : 준비 동작(압축) → 상승(늘어남) → 착지(압축). 수직 이동 사용. 발 기준점.
진자 : 최대 각도에서 시작, 좌우 회전 감쇠 패턴. 상단 기준점.
기본 진동: 중립에서 시작하는 회전 진동. 미세 크기 변화 추가.
Y축 회전: 좌우 압축·복원으로 Y축 회전 표현. 중심 기준점.
수평 이동: 좌우 감쇠 진동. 중심 기준점.
미세 burst: 크기 변화만. 위치·회전 없음.

  1. 수식 fallback 경로 (AI 호출 불가 시)
    AI 없이 물리 수식으로 프레임별 좌표 직접 계산 → Keyframe 생성
    AI 의존도 없이 완전 동작 보장.

  2. 공통 후처리 (경로 무관)
    프레임 데이터 구조 변환
    보간 곡선 / 변환 기준점 유효성 검사 및 보정

  3. 파이프라인 고정값 주입 (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 상 낫다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions