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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions