关于 scenario-walkable-room
将房间照片转换为可行走的 3D 场景和可交互物件,适合制作可探索房间体验的创作者。它结合 Gaussian splat 环境、3D 道具、物理效果和碰撞音效,也可基于原图生成不同风格的房间。
主要功能
- 01从单张照片生成房间环境
- 02带 PBR 纹理的 3D 道具
- 03可拾取和投掷的物理交互
- 04物件碰撞音效
- 05同一房间的多种风格
适用场景
- 01将房间照片制作成可探索场景
- 02创建访客可拾取和投掷的交互道具
- 03以多种视觉风格呈现同一房间
MCP 相关
所有生成阶段都通过 Scenario MCP 调用完成,包括图像编辑、世界生成、3D 资产制作和声音生成。本地步骤将生成的文件组装到查看器中。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-walkable-room安装后在 Claude Code 中输入/scenario-walkable-room确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/calibration.mdobjects.mdviewer.md详细介绍
Scenario 可漫步房间
概述
一张房间照片,变成一个可以走进去、触碰其中物品的空间:一个完整的 3D Gaussian splat 世界(包括摄像机后方的墙面),房间里的小物件也会重建为真实的 3D 模型,访客可以拿起、投掷,还能听到它们落地的声音。先为照片换一种风格,同一个房间便能呈现多种样貌。整个流程遵循开源项目 image-blaster 的管线,并通过 MCP 在 Scenario 上完成所有生成:
- 识别:如实描述照片,并列出其中可移动的单个物体及其边界框、所在表面、尺寸估算和材质。每个房间挑选两到三个。
- 清除:只编辑一次图像,仅擦除这些物体,不改动其他任何内容。
- 抠图:针对每个物体,基于原始照片各编辑一次图像,将物体单独绘制在白色背景上。
- 世界:基于底图生成单图世界模型。
- 物体:为每张抠图生成一个图像转 3D 模型,并添加 PBR 纹理。
- 声音:为每个物体生成若干段简短的撞击音效。
- 组装:根据世界自身的 splat 为其校准水平和比例,匹配其假定的镜头,生成碰撞高度场,将每个物体放回照片中的原位,并通过流式 splat 渲染器和物理引擎呈现整个场景。
步骤 1 和 7 是 Agent 在下载的文件上自行完成的工作;中间的所有生成步骤均通过 MCP 调用完成。连接、上传和核心循环:请参阅 scenario 技能。图像编辑:scenario-image 或 scenario-gemini-image。世界:scenario-3d-worlds。3D 模型:scenario-3d。声音:scenario-audio 或 scenario-sonilo。如果当前可用技能中缺少此处提到的同级技能,请让用户安装(npx skills add scenario-labs/skills --skill <name>);在无人值守的情况下,请根据工具架构继续操作并标明缺失项。
快速参考
按照 scenario 技能中的说明,使用 recommend 并传入能力和用户自己的措辞,查找每个付费阶段的成员;选择之前先阅读 next_step。recommend 不支持世界场景,因此请按照 scenario-3d-worlds 的说明,通过 search 查找单图世界场景成员。切勿将生成模型的 ID 当作常量。读取每个候选项的 model_schema_get,并在运行前使用 model_run dry_run=true 为确切的载荷估价。
| 步骤 | 查找方式 | 发送和检查的内容 |
|---|---|---|
| 发现 | 无,自己查看照片 | 仅包含单个可移动物品,提供归一化边界框、支撑面、以米为单位的尺寸和材质(references/objects.md) |
| 清理底图 | img2img,使用参考图 | 只写 remove the following from the image: ...;与照片对比,检查是否移除过多或颜色被改变 |
| 抠图 | img2img,使用同一成员 | 每个物体在原始照片上单独编辑一次,正方形,约 1K,白色背景(references/objects.md) |
| 世界场景 | search,单图世界场景 | 底图、全分辨率 splat、固定的 seed,以及描述无物体房间的提示词 |
| 物体 | 使用 PBR 的 img23d | 每个任务使用一张抠图,启用 PBR,面数适中(约 50,000);根据类型选择 GLB(asset_get mimeType model/gltf-binary),切勿按输出顺序选择 |
| 声音 | txt2audio,音效 | 每个物体生成一段约 6 s 的音频,其中包含多次撞击声,撞击之间留有静音 |
| 校准 | 无,本地处理 | 地面、水平、比例、镜头、高度场、放置(references/calibration.md) |
| 查看器 | 无,本地处理 | 分页 splat 流式传输、高度场行走器、凸包道具、抓取和投掷、声像控制的声音(references/viewer.md) |
每批任务都使用 wait=false 启动,并在团队的并发上限内分波次执行(scenario 技能中的 parallel-custom-jobs 行:如果启动请求因 429 被拒绝,则不会创建任务,因此请在下一波重新启动),然后对任务 ID 调用 jobs_wait;若超时,则使用 pending_job_ids 再次调用。世界场景需要几分钟;超时不代表失败,绝不能因此再次调用 model_run。
示例:用户的客厅,可供行走,且有可投掷物品
-
照片。 按照
scenario技能中的流程,对用户的照片调用upload_asset(file_size、PUT 各个分块,再调用upload_asset_complete),并重复使用资产 ID。若没有照片,则调用recommend,设置capability="txt2img",生成写实室内图:从门口视角拍摄,机位约与胸部齐平,水平居中,使用广角镜头,桌子和沙发上摆放少量小物件。若要呈现多种风格,则每种风格分别编辑一次照片;提示词先固定建筑结构(窗户、门、平面布局、相机、镜头),再描述新的饰面、家具和光线。 -
归档。 首次生成前,先为本次运行创建集合(通过目录写入通道调用
collection_create,参数放在parameters下),之后每生成一件要保留的资产,就调用collection_add_assets将其添加到集合。 -
识别。 对每张照片调用
asset_display,按实描述照片,并列出物件清单。每个房间选两到三件物品:物品彼此分开、无遮挡,仅由一两种材料制成,放在地面、桌面或座位上。 -
底图。 调用
recommend并设置capability="img2img",提示词为“从房间照片中移除物品,其他内容保持不变”;调用model_schema_get获取参考图字段,执行dry_run,然后以照片为参考图运行:从图像中移除以下物品:{支撑物}上的{物品},{位置};{位置}的{物品}
将底图与照片并排调用
asset_display查看。移除编辑有时会将物品改色而不是擦除,或连同邻近物品一起移除(例如长椅上的所有靠垫、灯旁的雕花屏风):重新运行并缩小物品清单,或舍弃该物品。 -
抠图。 每件物品都基于原始照片编辑一次,绝不使用底图,并使用 references/objects.md 中的隔离提示词。注明任何放在物品上的东西,以免它们被一并移除。
-
场景。 按照
scenario-3d-worlds查找单图世界成员,调用model_schema_get和dry_run,然后对每张底图分别运行,设置wait=false、使用全分辨率 splat,并为每个房间固定使用同一个seed;提示词描述房间移除物品后的实际状态。使用jobs_wait收集 ID(通过pending_job_ids再次调用;生成一个世界需要几分钟),然后对每个.spz调用asset_download。 -
物品。 调用
recommend,设置capability="img23d",提示词为“从产品抠图生成带纹理的 PBR 道具”;从model_schema_get中读取面数、纹理和 PBR 字段,执行dry_run,然后为每张抠图分别创建一个任务,设置wait=false,并对这些 ID 调用jobs_wait。每个任务会返回多个资产(网格及其纹理和预览):通过asset_get检查mimeType,选择model/gltf-binary的资产,在查看器中检查(scenario-3d),然后调用asset_download。 -
声音。 调用
recommend,设置capability="txt2audio",提示词为“短促撞击音效”,然后为每件物品生成一个音频片段:连续四次独立的单次撞击,每次之后留出整整一秒的静音:{物品及其材料} {被撞倒/掉落}到{房间地面}上,{声音特点}。 近距离收音,干燥的房间,无音乐,无人声。
-
组装。 按照 references/calibration.md 校准每个世界并放置物品,然后按照 references/viewer.md 构建页面。为网页简化 GLB(约 15,000 至 20,000 个三角形、1K WebP 纹理、Meshopt),并在房间显示后再加载物理效果。
常见错误
- 把世界当作公制空间:事实并非如此。测量相机距拟合地面的高度,并将物体投影后的高度与估算尺寸进行比较;在创作时,这让每个房间中的照片相机都位于距地面约 1 m 的高度。
- 假设所有世界都与照片使用相同的镜头:同一张照片的不同重绘版本,使用同一个世界模型,却得到约 50 至 76 度的视野。投影盒体前,应针对每个世界拟合镜头。
- 从底图中抠出物体:物体就不在原处了。抠图应来自原始照片。
- 揭露植物、玻璃或承载其他物体的物件:图像转 3D 会把枝叶封成实心外壳,并在表面绘上叶片。跳过它们,或注明并移除它们承载的物体。
- 只根据盒体底部将物体放置在地面上:放在桌面或座椅上的物体会悬浮或下沉。每个物体实际所在的位置,是盒体底部正后方的表面。
- 页面加载时就把道具放进物理模拟:不稳定的支撑面会让它们翻滚。让刚体道具从一开始就保持静止,放在照片中对应的位置;只让软质物体(坐垫)沉降。
- 每次接触力触发时都播放声音:静止物体每一步都会报告自身重量。只有物体正朝接触面运动时才播放声音。
- 信任图像转 3D 得到的 PBR 金属度:漆面和釉面会被识别为金属,渲染成铬。金属度只保留给真正的金属。
- 3D 任务报告
failure并出现结果下载错误后更改负载:这是平台错误,不是输入有误。重试前,先用job_get确认任务状态为failure且没有资源(并通过jobs_list确认同一输入后续没有成功的任务);然后用相同负载重试一次;jobs_wait超时不代表失败,绝不能因此再次运行。 - 并行运行开销较大的本地任务(校准、网格转换、splat 多级细节构建):每次只运行一到两个。