Communitygithub.com

atlas-flythrough

사진이나 생성된 스틸 이미지를 World Labs Atlas를 사용하여 깊이 인식 카메라 움직임으로 변환합니다. 이미지 기반 장면을 통한 워크스루, 플라이오버, 리빌, 오빗에 사용합니다.

atlas-flythrough란 무엇인가요?

Atlas Flythrough는 단일 정지 이미지를 기반으로 3D 공간을 탐험하는 듯한 카메라 움직임을 생성하는 전문 기술입니다. World Labs CLI, Python 3(NumPy), FFmpeg를 활용하여 사진의 깊이 정보를 추정하고, 사용자가 정의한 카메라 경로와 키프레임에 따라 부드러운 비행 경로를 생성합니다. 이 기술은 건축 워크스루, 자연 경관 플라이오버, 제품 리빌, 씬 오빗 등에 적합하며, 깊이 인식을 통해 전경과 배경의 관계를 자연스럽게 보여줍니다. 특히 까다로운 이동(예: 장애물 뒤를 비추는 리버스 리빌)의 경우, 여러 앵커 뷰를 생성하고 비교하여 최적의 경로를 선택하는 고급 기능을 제공합니다. 최종 출력은 MP4 비디오 파일이며, 시작 및 종료 지점, 렌즈 설정, 이동 속도 등을 세밀하게 제어할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wendlerc/atlas-skills/tree/main/skills/atlas-flythrough

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

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

문서

Atlas flythrough

촬영이 끝날 때 시청자가 발견해야 할 대상을 선택하세요. 스틸 이미지에서 전경 가장자리, 열린 이동 공간, 여러 깊이의 랜드마크를 살펴보세요. 전경 물체를 지나치는 오프셋 이동은 스케일을 더 쉽게 읽을 수 있게 합니다. 역방향 앵글에는 피사체 뒤에 무엇이 있는지에 대한 증거가 필요합니다.

인증된 World Labs CLI, Python 3(NumPy), FFmpeg를 사용하세요. 새로운 샷 디렉토리에서 작업하세요. PREP을 이 스킬에 포함된 scripts/prepare.py의 절대 경로로 설정하세요. JPEG 파일과 원하는 출력 해상도를 제공하세요.

프롬프트 향상은 지원 뷰와 최종 비행에 대해 기본적으로 활성화됩니다. prepare.py의 생성 명령에 --no-enhance-prompt를 전달하면 해당 패스에 대해 씬 프롬프트를 그대로 사용합니다.

python3 "$PREP" pose scene.jpg --resolution 1280 720 > pose-request.json
worldlabs tasks run images2PosedRGBD --request pose-request.json --wait --json > pose.json

씬 프롬프트와 키프레임이 포함된 shot.json을 작성하세요. 각 행은 정규화된 시간, 카메라 로컬 XYZ 이동(오른쪽, 위, 뒤), 정규화된 이미지 공간 조준점 U와 V(좌측 상단 기준), 소스 카메라 단위의 조준 깊이, 초점 배율 및 뱅크 각도(도)를 지정합니다. 시간은 0에서 1까지 엄격하게 증가해야 합니다. 예상 깊이를 검사하여 씬 스케일에 맞는 거리를 선택하세요. 이 최소한의 측면 이동이 시작점입니다:

{"prompt":"햇빛이 비치는 작업장, 작업대와 높은 창문.","knots":[[0,0,0,0,0.5,0.5,2,1,0],[0.5,0.15,0,-0.12,0.53,0.5,2,1,0],[1,0.35,0,-0.25,0.57,0.5,2,1,0]]}
python3 "$PREP" angles shot.json --pose pose.json --supports 6 > supports-request.json
worldlabs tasks run atlasGenerate --request supports-request.json --wait --json > supports.json
worldlabs operations download "$(jq -er '.id' supports.json)" --out supports

전체 렌더링 전에 경로 순서대로 지원 뷰를 검사하세요. 인접한 앵글에서 동일한 랜드마크를 추적하세요. 프레임 0에서 입력과 정확히 일치시키려면 원래 포즈 카메라를 사용하세요.

어려운 이동을 위한 앵커 선택

통과, 오빗 또는 리버스 리빌의 경우, 장애물의 양쪽과 회전 중간을 정찰하세요. Developer API를 사용하여 Viewfinder 스타일의 스틸 이미지를 생성하세요. targetCameras를 희소하게 설정하고, returnDepth: true 및 enhancePrompt: true를 활성화하여 atlasGenerate를 실행하세요. 적용 범위가 좋은 간단한 이동은 첫 번째 지원 패스를 사용할 수 있습니다.

첫 번째 패스가 일관되지 않은 경우, 동일한 카메라 포즈에서 대안을 생성하세요. 희소 대상 배열과 씬 프롬프트는 고정하세요. contextFrames에서 제공하는 신뢰할 수 있는 이전 포즈 뷰를 다양하게 변경하세요. 예를 들어, 한 패스에서는 입구 쪽 뷰를 선호하고 다른 패스에서는 출구 쪽 뷰를 선호하세요. 모든 카메라와 깊이 맵을 동일한 월드 좌표계로 유지하세요.

후보들을 카메라 시간당 하나의 열과 패스당 하나의 행으로 배치하세요. 각 후보를 양옆의 뷰와 비교하세요. 연속적인 개방 공간, 안정적인 랜드마크 실루엣, 그럴듯한 전경 깊이, 명확한 시야선을 찾으세요. 카메라가 가까이 지나가는 표면의 깊이를 검사하세요. 시퀀스 전체에서 일치하는 뷰를 선택하세요. 중복되거나 깨진 포즈는 건너뛰거나, 밀집 렌더링을 확정하기 전에 누락된 앵글을 정찰하세요.

혼합 선택을 사용하려면 각 선택을 저장된 작업의 0부터 시작하는 프레임 인덱스로 기록하세요. 예를 들어, 두 개의 6뷰 패스를 다운로드하고 검토한 후, jq로 최종 컨텍스트를 구성하세요. 자신의 선택으로 대체하세요. 동일한 반환된 프레임에서 RGB 에셋, 깊이 에셋 및 카메라를 함께 유지하세요.

# 동일한 컨텍스트를 나중에 다시 빌드할 수 있도록 선택 사항을 저장합니다.
echo '[["A",0],["B",2],["A",4],["B",5]]' > picks.json
jq -n --slurpfile a supports.json --slurpfile b alternate.json --slurpfile picks picks.json '
  {A: $a[0].response.frames, B: $b[0].response.frames} as $runs
  | [$picks[0][] as [$run, $i]
     | ($runs[$run][$i] // error("Unknown anchor: \($run)[\($i)]"))
     | {camera, imageAsset: {assetId: .imageAsset.assetId},
        depth: {depthAsset: {assetId: .depth.depthAsset.assetId}}}]
' > anchors.json

렌더링 및 비교

샷 키프레임에서 밀집 카메라 요청을 준비하세요.

python3 "$PREP" flight shot.json --pose pose.json --angles supports.json --frames 120 > flight-request.json

혼합 세트를 선별했다면 지금 해당 앵커로 교체하세요. 이렇게 하면 첫 번째 포즈 이미지가 선택된 프레임과 함께 유지됩니다.

jq --slurpfile picks anchors.json '.contextFrames = [.contextFrames[0]] + $picks[0]' flight-request.json > selected-request.json
mv selected-request.json flight-request.json

전체 경로를 하나의 작업으로 제출하세요.

worldlabs tasks run atlasGenerate --request flight-request.json --wait --timeout 1800 --json > flight.json
worldlabs operations download "$(jq -er '.id' flight.json)" --out frames
ffmpeg -framerate 24 -i frames/frames_%03d_image.jpg -c:v libx264 -pix_fmt yuv420p -movflags +faststart shot.mp4

시작, 가장 넓은 기준선, 리빌, 끝을 검사한 다음 클립을 실제 속도로 시청하세요. 이동이 여전히 줌처럼 느껴진다면 렌즈를 고정하고 지원되는 전경 가장자리 근처에서 측면 이동을 늘리세요. 두 개의 연속적인 이동을 연결할 때 끝점 위치, 방향, 렌즈 및 속도를 일치시키세요. 선택적 --footfalls는 걷는 샷에 미세한 바운스를 추가합니다.

앵커 세트를 비교할 때, contextFrames만 변경하여 동일한 밀집 요청을 두 번 렌더링하세요. 정찰 중 궤적을 수정했다면 수정된 궤적에서 이전 앵커를 다시 실행하세요. 요청당 고유한 작업을 사용하고, 요청을 저장한 다음, contextFrames을 삭제해도 동일한 JSON이 남는지 확인하세요. 동일한 타임스탬프, 특히 회전 또는 리빌 지점에서 동기화된 프레임을 표시하세요. 프롬프트 향상이 활성화된 경우, 두 응답의 promptUsed를 검사하세요. 선택한 이미지가 향상된 설명을 변경할 수 있습니다. 효과적인 텍스트를 고정하는 실험의 경우, 두 실행에서 enhancePrompt: false와 함께 하나의 설명을 재사용하세요. 독립적인 렌더링은 여전히 달라질 수 있습니다.

Tide Organ 해변 예시에서 두 번의 API 패스는 20개의 포즈에서 40개의 스틸을 생성했습니다. 17개의 선택이 접근로, 늑골 아치, 열린 파도, 해변의 역방향 뷰를 포함했습니다. 구리 파이프는 해상 방향 전환 중 연속성을 판단하는 데 유용한 랜드마크였습니다.

관련 스킬