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个选择覆盖了入口、肋拱、开阔海浪以及海岸的反向视图。铜管是判断离岸转弯连续性时有用的地标。