Communitygithub.com

perspective-illusion

시각적 착시를 일으키는 루핑 일러스트레이션 3D 비디오 제작: 일본 착시 아티스트(@garments__ 등)처럼 망원 렌즈로 평평하게 눌린 장면이 깊은 원근으로 변형되고, 나란히 보이던 물체들이 서로 다른 깊이에 있음이 드러나며, 평평한 시야에서 물체들이 조용히 위치를 바꾸는 효과를 구현합니다.

perspective-illusion란 무엇인가요?

이 기술은 망원 렌즈로 평평하게 압축된 장면이 점진적으로 깊은 원근감으로 변형되는 착시 영상을 제작하는 AI 에이전트 스킬입니다. 사용자는 '원근 착시 영상', '돌리 줌(Dolly Zoom)', '평면-3D 전환 효과'를 요청하거나, 특정 참조 착시 영상을 재현하고자 할 때 이 스킬을 사용할 수 있습니다. 스킬은 Three.js와 Playwright를 기반으로 한 완전한 장면 템플릿(거리, 마트)을 제공하며, 타임라인과 카메라 리그가 사전 구성되어 있습니다. 작동 방식은 네 단계로 구성됩니다: 장면을 하나의 긴 축(예: 거리나 통로)을 따라 배치하고, 카메라를 절대 기울이거나 회전시키지 않으며(틸트-시프트 렌즈처럼 렌즈 시프트 사용), 모든 파라미터가 단조로운 3차 곡선을 따라 움직이는 돌리 줌으로 샷 간에 모핑하고, 평평한 상태에서만 물체가 움직이거나 크기가 변하도록 속임수를 씁니다. 또한 참조 영상을 정확히 재현하기 위해 프레임 측정, 팔레트 클러스터링, 3패스 셰이딩(잉크 라인, 해칭, 평면 하늘/천장)을 통한 일러스트레이션 효과를 지원합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/dotslashsimran/simcraft/tree/HEAD/skills/perspective-illusion

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

원근 착시(Perspective illusion)

templates/ 폴더 안의 템플릿은 완전하고 동작하는 장면이므로, 여기서 시작하세요:

  • street.html은 일본 거리로, 기둥, 원뿔, 횡단보도, 붉은 하늘이 있습니다.
  • market.html은 일본 슈퍼마켓으로, 통로, 진열대, 빨간 바구니, 조명 줄이 있습니다.

두 템플릿 모두 동일한 카메라 리그, 타임라인 및 일러스트레이션 패스를 공유합니다. 장면 섹션만 다릅니다.

설정 (프로젝트 폴더별)

mkdir -p ~/Movies/edits/<날짜>-<이름>/stills && cd $_
printf '{"type":"module"}' > package.json && npm i [email protected] [email protected]
cp ~/simcraft/skills/perspective-illusion/templates/{street.html,render.mjs} .
node render.mjs street.html x --stills=0.2,1,2,4,6     # 먼저 프레임 확인 (stills/st_<t>.png)
node render.mjs street.html out.mp4                     # 7초 루프, 1920x1080, 4-서브프레임 모션 블러 (~2.5분)

비결, 네 부분

  1. 장면을 하나의 긴 축을 따라 배치합니다 (거리나 통로가 -z 방향으로 멀어짐), 물체들은 서로 뒤에 정렬됩니다: 같은 x 위치의 기둥이나 컬럼, 끝의 건물이나 뒷벽. 400m 거리의 2° 망원 렌즈가 모든 것을 하나의 입면도로 평평하게 만듭니다. 정렬된 기둥은 하나로 겹쳐 보이고, 긴 측벽은 가장자리에서 사라집니다.
  2. 절대 카메라를 기울이거나 회전시키지 마십시오. 항상 축을 정면으로 바라보고 수평을 유지하므로, 수직선은 항상 수직으로 유지됩니다. "내려보기" 또는 "올려보기"는 틸트-시프트 렌즈처럼 렌즈 시프트(H, 프레임 내 수평선 위치)를 사용합니다. 각 샷은 {x, y (카메라 높이), zf, W, fov, H, lay, cs}입니다.
  3. 돌리 줌으로 샷 간에 모핑합니다. W는 초점 평면 zf에 고정된 상태로 fov가 변경됩니다. 모든 파라미터는 하나의 단조로운 3차 곡선을 따라 모든 키프레임을 지나므로 속도가 갑자기 변하지 않습니다.
  4. 평평할 때 속임수를 씁니다. 물체(원뿔, 바구니)는 평평한 상태(홀드) 동안에만 카메라 쪽으로 또는 멀어지게 슬라이드하는데, 이때 움직임이 눈에 띄지 않습니다. 이것이 한 줄이 대각선이 되는 방법입니다("앞과 뒤가 바뀜"). 평평한 시야에서 더 크게 그릴 수도 있습니다(cs).

참조 영상 매칭하기 (이렇게 하세요, 감으로 하지 마세요)

  • 각 샷의 프레임을 추출합니다. 그런 다음 각 샷에 대해 다음을 측정합니다:
    • 소실점과 수평선의 위치 (H 제공),
    • 알려진 너비를 가진 두 물체의 위치 (x 및 W 제공),
    • 알려진 길이를 가진 물체의 가까운 쪽과 먼 쪽 가장자리 (예: 횡단보도. 카메라 높이 y, 거리 및 fov 제공). 구해진 숫자는 템플릿 주석에 있습니다.
  • 프레임을 팔레트로 클러스터링합니다 (4개 프레임에 k-평균) 그리고 정확한 색상을 사용합니다.
  • 매 변경 후 동일한 타임스탬프에서 생성된 프레임과 참조 영상의 프레임을 나란히 비교합니다.

일러스트레이션 패스 (렌더링처럼 보이지 않고 그린 것처럼 보이는 이유)

페이지는 세 가지 패스를 렌더링합니다: 컬러(2톤 셀 쉐이딩), 뷰-공간 법선 및 깊이, 태양 전용 그림자 마스크. 최종 셰이더는 세 가지 작업을 수행합니다:

  • 잉크 라인 깊이(2차 미분, 그래서 평평한 땅이 가장자리로 보일 때 잉크 처리되지 않음)나 법선이 변하는 곳마다. 가중치는 노이즈에 따라 변하고 조회가 약간 흔들리므로 선이 자처럼 곧지 않습니다. 깊이 임계값은 거리에 따라 증가합니다.
  • 해칭 그림자가 드리운 곳에만: 차가운 색조와 가는 대각선 스트로크, 표면이 거의 가장자리로 보일 때 희미해집니다.
  • 하늘 (또는 천장) 지오메트리가 없는 곳은 평평하게 칠해집니다.

겪었던 문제들 (반복하지 않도록)

  • 한 줄짜리 문장에 // 주석을 추가하면 scene.add(sun)이 무시되어 마스크가 검게 변하고 모든 것이 해칭 처리됩니다. /* */를 사용하거나 새 줄을 사용하세요.
  • 겹치는 동일 평면의 바닥이 멀리서 깜빡입니다. 바닥 조각이 가장자리에서 맞닿도록 하세요.
  • 벽을 얕은 각도로 스치는 빛은 얼룩덜룩한 셀프 섀도잉을 유발합니다. 키 라이트를 정면에서 약 45°로 유지하고, 전체 높이의 기둥과 천장 고정물이 그림자를 드리우지 않도록 하세요.
  • 생성된 이미지나 표지판에 텍스트를 절대 넣지 마세요. 표지판은 모양만 사용합니다.
  • 전체 렌더링 전에 항상 스틸 프레임을 확인하고, 모션 체크(vox-explainer의 motion_check.py)를 실행하세요.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

관련 스킬