Communitygithub.com

atlas-flythrough

将照片或生成的静态图像转换为具有深度感知的摄像机运动,支持漫游、飞越、揭示或环绕等镜头效果。

atlas-flythrough 是什么?

此技能用于将单张图片(照片或AI生成的静态图)转化为带有深度感知的动态镜头,实现如室内漫游、高空俯瞰、镜头揭示或环绕飞行等效果。它基于World Labs的Atlas平台,通过CLI工具、Python 3和FFmpeg工作流,在保持原始图像风格的前提下生成平滑的摄像机运动路径。用户需要提供一张JPEG图片及其目标输出分辨率,然后通过定义关键帧(包含时间、位置、瞄准点、焦距等参数)来规划镜头轨迹。技能支持提示词增强功能,可自动优化场景描述以提升生成质量。它特别擅长处理复杂镜头(如环绕或反向揭示),当首次生成效果不佳时,可通过相同相机姿态下多次生成并手动挑选最佳候选帧(锚点)来构建一致的上下文,最终合成连贯的飞行视频。该技能适用于需要从静态图像出发制作动态视效的场景,如建筑可视化、电影预可视化或沉浸式内容创作。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wendlerc/atlas-skills/tree/main/skills/atlas-flythrough

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Atlas 飞越镜头

选择观众在镜头结束时应该发现的内容。检查静态图像的边缘前景、可供通行的空间以及不同深度下的地标。在前景物体旁进行偏移运动可以使尺度更易读。反向角度需要证据来证明主体后方存在什么。

使用已认证的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

在完整渲染前,按路径顺序检查支持视图。跟踪相邻角度中的同一地标。为了在零帧时与输入精确匹配,请在那里使用原始定位摄像机。

为困难运动选择锚点

对于通道、环绕或反向揭示,侦察障碍物两侧以及转弯中间的位置。使用Developer API获取Viewfinder风格的静态图像。运行带有稀疏targetCameras、returnDepth: true和enhancePrompt: true参数的atlasGenerate。一个覆盖良好的简单运动可以使用第一次支持生成的结果。

当第一次生成结果不一致时,在相同的相机姿态下生成替代方案。保持稀疏目标数组和场景提示词不变。改变你在contextFrames中提供的可靠之前定位视图,例如在一次生成中偏向入口侧的视图,在另一次生成中偏向出口侧的视图。将所有相机和深度图保持在同一个世界坐标中。

将候选布局为一个表格,每列对应一个相机时间,每行对应一次生成。将每个候选与相邻两侧的视图进行比较。寻找连续的开口、稳定的地标轮廓、合理的前景深度以及清晰的视线。检查相机经过的表面上的深度。选择在整个序列中一致的视图。跳过冗余或损坏的姿势,或者在提交密集渲染之前侦察缺失的角度。

要使用混合选择,将每个选择记录为其保存操作中的从零开始的帧索引。例如,在下载并检查两个六视图生成结果后,使用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个选择覆盖了入口、肋拱、开阔海浪以及海岸的反向视图。铜管是判断离岸转弯连续性时有用的地标。

相关技能