mcpField
S
scenario-walkable-room

scenario-walkable-room

github.com/scenario-labs创意与媒体1.2k201 次安装1 天前更新
代码仓库

关于 scenario-walkable-room

将房间照片转换为可行走的 3D 场景和可交互物件,适合制作可探索房间体验的创作者。它结合 Gaussian splat 环境、3D 道具、物理效果和碰撞音效,也可基于原图生成不同风格的房间。

主要功能

  1. 01从单张照片生成房间环境
  2. 02带 PBR 纹理的 3D 道具
  3. 03可拾取和投掷的物理交互
  4. 04物件碰撞音效
  5. 05同一房间的多种风格

适用场景

  1. 01将房间照片制作成可探索场景
  2. 02创建访客可拾取和投掷的交互道具
  3. 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.md
objects.md
viewer.md

详细介绍

Scenario 可漫步房间

概述

一张房间照片,变成一个可以走进去、触碰其中物品的空间:一个完整的 3D Gaussian splat 世界(包括摄像机后方的墙面),房间里的小物件也会重建为真实的 3D 模型,访客可以拿起、投掷,还能听到它们落地的声音。先为照片换一种风格,同一个房间便能呈现多种样貌。整个流程遵循开源项目 image-blaster 的管线,并通过 MCP 在 Scenario 上完成所有生成:

  1. 识别:如实描述照片,并列出其中可移动的单个物体及其边界框、所在表面、尺寸估算和材质。每个房间挑选两到三个。
  2. 清除:只编辑一次图像,仅擦除这些物体,不改动其他任何内容。
  3. 抠图:针对每个物体,基于原始照片各编辑一次图像,将物体单独绘制在白色背景上。
  4. 世界:基于底图生成单图世界模型。
  5. 物体:为每张抠图生成一个图像转 3D 模型,并添加 PBR 纹理。
  6. 声音:为每个物体生成若干段简短的撞击音效。
  7. 组装:根据世界自身的 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。

示例:用户的客厅,可供行走,且有可投掷物品

  1. 照片。 按照 scenario 技能中的流程,对用户的照片调用 upload_asset(file_size、PUT 各个分块,再调用 upload_asset_complete),并重复使用资产 ID。若没有照片,则调用 recommend,设置 capability="txt2img",生成写实室内图:从门口视角拍摄,机位约与胸部齐平,水平居中,使用广角镜头,桌子和沙发上摆放少量小物件。若要呈现多种风格,则每种风格分别编辑一次照片;提示词先固定建筑结构(窗户、门、平面布局、相机、镜头),再描述新的饰面、家具和光线。

  2. 归档。 首次生成前,先为本次运行创建集合(通过目录写入通道调用 collection_create,参数放在 parameters 下),之后每生成一件要保留的资产,就调用 collection_add_assets 将其添加到集合。

  3. 识别。 对每张照片调用 asset_display,按实描述照片,并列出物件清单。每个房间选两到三件物品:物品彼此分开、无遮挡,仅由一两种材料制成,放在地面、桌面或座位上。

  4. 底图。 调用 recommend 并设置 capability="img2img",提示词为“从房间照片中移除物品,其他内容保持不变”;调用 model_schema_get 获取参考图字段,执行 dry_run,然后以照片为参考图运行:

    从图像中移除以下物品:{支撑物}上的{物品},{位置};{位置}的{物品}

    将底图与照片并排调用 asset_display 查看。移除编辑有时会将物品改色而不是擦除,或连同邻近物品一起移除(例如长椅上的所有靠垫、灯旁的雕花屏风):重新运行并缩小物品清单,或舍弃该物品。

  5. 抠图。 每件物品都基于原始照片编辑一次,绝不使用底图,并使用 references/objects.md 中的隔离提示词。注明任何放在物品上的东西,以免它们被一并移除。

  6. 场景。 按照 scenario-3d-worlds 查找单图世界成员,调用 model_schema_get 和 dry_run,然后对每张底图分别运行,设置 wait=false、使用全分辨率 splat,并为每个房间固定使用同一个 seed;提示词描述房间移除物品后的实际状态。使用 jobs_wait 收集 ID(通过 pending_job_ids 再次调用;生成一个世界需要几分钟),然后对每个 .spz 调用 asset_download。

  7. 物品。 调用 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。

  8. 声音。 调用 recommend,设置 capability="txt2audio",提示词为“短促撞击音效”,然后为每件物品生成一个音频片段:

    连续四次独立的单次撞击,每次之后留出整整一秒的静音:{物品及其材料} {被撞倒/掉落}到{房间地面}上,{声音特点}。 近距离收音,干燥的房间,无音乐,无人声。

  9. 组装。 按照 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 多级细节构建):每次只运行一到两个。

评论

支持 Markdown