scenario-walkable-room について
部屋の写真を歩き回れる 3D シーンと操作可能なオブジェクトに変換する、探索型の部屋体験を作るクリエイター向けワークフローです。Gaussian splat の環境に 3D 小道具、物理挙動、衝突音を組み合わせ、元写真から別のスタイルの部屋も作れます。
主な機能
- 011 枚の写真から部屋の環境を生成
- 02PBR テクスチャ付き 3D 小道具
- 03持ち上げや投げに対応する物理挙動
- 04オブジェクトの衝突音
- 05同じ部屋の複数スタイル
活用シーン
- 01部屋の写真を探索可能なシーンにする
- 02訪問者が持ち上げたり投げたりできる小道具の作成
- 03同じ部屋を複数のビジュアルスタイルで提示
MCP 対応
画像編集、ワールド生成、3D アセット作成、音声生成など、すべての生成工程で Scenario MCP を呼び出します。ローカル工程で生成ファイルをビューアーに組み立てます。
インストール
コマンドをコピーしてターミナルで実行します。
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詳細
シナリオ:歩き回れる部屋
概要
部屋の写真が、歩き回って触れられる場所になります。壁の後ろ側も含む完全な 3D ガウシアンスプラットの世界に加え、部屋にある小物は、訪問者が拾ったり、投げたり、着地音を聞いたりできる、本物の 3D モデルとして再構築されます。まず写真のスタイルを変更すれば、同じ部屋を複数の見た目で表示できます。処理はオープンソースの image-blaster パイプラインに沿っており、生成はすべて MCP 経由で Scenario 上で行います。
- 特定:写真を文字どおりに説明し、動かせる単体の物体をリストアップします。それぞれについて、バウンディングボックス、置かれている面、サイズの推定値、素材を記載します。部屋ごとに 2~3 個選びます。
- 背景画像:それらの物体だけを消し、それ以外は何も変更しない画像編集を 1 回行います。
- 切り抜き:元の写真を使い、物体ごとに 1 回ずつ画像編集を行って、物体だけを白地に描き出します。
- ワールド:背景画像から、単一画像のワールドモデルを生成します。
- オブジェクト:各切り抜き画像を使って、PBR テクスチャ付きの 3D モデルを生成します。
- サウンド:各物体について、短い衝突音をいくつか生成します。
- 組み立て:ワールド自体のスプラットを基に、ワールドの水平とスケールを調整し、想定されていたレンズに合わせます。衝突用の高さマップを作成し、写真に写っていた位置へ各オブジェクトを戻したうえで、ストリーミング対応のスプラットレンダラーと物理エンジンを使ってすべてを表示します。
ステップ 1 と 7 は、ダウンロードしたファイルを使ったエージェント独自の作業です。その間の生成はすべて 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、同じメンバー | 元の写真を使ってオブジェクトごとに編集を1回行います。正方形で、約1K、白い背景にします(references/objects.md) |
| ワールド | search、単一画像のワールド | プレート、フル解像度のスプラット、固定の seed、オブジェクトのない部屋を説明するプロンプトを指定します |
| オブジェクト | PBR 対応の img23d | ジョブごとに切り抜きを1つ指定し、PBR を有効にして、適度な面数(約50,000)にします。GLB は出力順ではなく、型(asset_get の mimeType が model/gltf-binary)で選びます |
| サウンド | txt2audio、効果音 | オブジェクトごとに約6秒のクリップを1つ作成し、複数の衝撃音を無音部分で区切って入れます |
| 調整 | なし。ローカルで実行 | 床、水平度、縮尺、レンズ、高さマップ、配置を設定します(references/calibration.md) |
| ビューアー | なし。ローカルで実行 | ページ単位のスプラットストリーミング、高さマップのウォーカー、凸包プロップ、つかんで投げる操作、パンニングされたサウンドを設定します(references/viewer.md) |
すべてのバッチは wait=false で起動し、チームの同時実行上限の範囲内でウェーブごとに実行します(scenario スキルの parallel-custom-jobs 行を参照してください。429で起動が拒否された場合、ジョブは作成されていないため、次のウェーブで再起動します)。その後、IDを指定して jobs_wait を呼び出します。タイムアウトした場合は、pending_job_ids を指定して再度呼び出します。ワールドの処理には数分かかります。タイムアウトは失敗ではなく、2回目の model_run を正当化する理由には決してなりません。
作業例:歩いて回れて、投げられるものがあるユーザーのリビングルーム
-
写真。
scenarioスキルに従って、ユーザーの写真をupload_assetします(file_size、パーツの PUT、upload_asset_complete)。アセット ID は再利用します。写真がない場合は、capability="txt2img"でrecommendし、フォトリアルな室内画像を生成します。胸の高さほどの視点から出入り口を見た構図で、水平かつ中央に配置し、広角レンズを使い、テーブルやソファの上に小物をいくつか置きます。複数のスタイルを試す場合は、スタイルごとに写真を一度編集し、プロンプトの冒頭に固定する建築要素(窓、ドア、間取り、カメラ、レンズ)を記述してから、新しい仕上げ、家具、照明を指定します。 -
整理。 最初の生成前に、その実行用のコレクションを作成します(カタログの書き込みレーンから
collection_createを実行し、引数はparametersの下に指定)。採用するアセットができたら、それぞれcollection_add_assetsで追加します。 -
洗い出し。 写真ごとに
asset_displayを実行し、文字どおりに説明して、オブジェクトのリストを作成します。部屋ごとにオブジェクトを 2〜3 個選びます。互いに離れていて、遮られておらず、素材が 1〜2 種類で、床、テーブル、または座席の上に置かれているものにします。 -
プレート。
capability="img2img"でrecommendし、「部屋の写真から物を取り除き、それ以外はすべてそのままにする」と指定します。参照画像フィールドをmodel_schema_getで確認し、dry_runを実行してから、写真を参照画像として次のプロンプトで実行します。画像から次のものを取り除く:{支持面}の上の{オブジェクト}、{場所};{オブジェクト}、{場所}
写真の横にプレートを
asset_displayで表示します。削除編集では、オブジェクトを消さずに色だけ変えたり、周囲の物まで一緒に削除したりすることがあります(ベンチのクッションすべてや、ランプの横にある彫刻入りのスクリーンなど)。その場合は、より対象を絞ったリストで再実行するか、そのオブジェクトを除外します。 -
切り抜き。 プレートではなく元の写真を使い、オブジェクトごとに 1 回編集します。プロンプトには references/objects.md の分離用プロンプトを使います。オブジェクトの上に載っているものも指定し、それらが切り抜きに含まれないようにします。
-
ワールド。
scenario-3d-worldsに従って単一画像ワールドのメンバーを探し、model_schema_get、dry_runの順に実行してから、各プレートでwait=false、フル解像度のスプラットを指定し、すべての部屋で固定のseedを使って、取り除いたオブジェクトがない状態の部屋を説明するプロンプトで実行します。jobs_waitにpending_job_idsを指定して再度呼び出し、ID を収集します(ワールドの生成には数分かかります)。その後、それぞれの.spzをasset_downloadします。 -
オブジェクト。
capability="img23d"でrecommendし、「製品の切り抜き画像からテクスチャ付き PBR プロップを生成」と指定します。model_schema_getから面数、テクスチャ、PBR の各フィールドを確認し、dry_runを実行してから、切り抜きごとに 1 つのジョブをwait=falseで実行し、ID を指定してjobs_waitします。各ジョブは複数のアセット(テクスチャやプレビュー付きのメッシュ)を返します。asset_getのmimeTypeがmodel/gltf-binaryのものを選び、ビューアー(scenario-3d)で確認してからasset_downloadします。 -
サウンド。
capability="txt2audio"でrecommendし、「短い衝撃音の効果音」と指定してから、オブジェクトごとに 1 つのクリップを生成します。次の 4 つの独立したワンショット衝撃音を、それぞれの後に 1 秒間の完全な無音を挟んで生成する:{オブジェクトとその素材}が{倒れる/落ちる}音、{部屋の床}に当たる音、{音の特徴}。近接マイクで収録した、響きのない室内音。音楽なし、声なし。
-
組み立て。 references/calibration.md に従って各ワールドをキャリブレーションし、オブジェクトを配置してから、references/viewer.md に従ってページを構築します。GLB をウェブ向けに簡略化し(三角形は約 15,000〜20,000 個、テクスチャは 1K WebP、Meshopt)、部屋が画面に表示されてから物理演算を読み込みます。
よくある間違い
- 世界をメートル法だと思い込むこと:実際はそうではありません。床としてフィッティングした面からのカメラの高さを測り、オブジェクトの投影された高さを推定サイズと比較してください。制作時には、すべての部屋で写真を撮影したカメラの高さを床から約1 mに設定しました。
- どのワールドも写真と同じレンズを使っていると思い込むこと:1枚の写真を異なるスタイルにした結果、同じワールドモデルでも画角は約50~76度になりました。ボックスを投影する前に、ワールドごとにレンズをフィッティングしてください。
- プレートから切り抜くこと:オブジェクトはそこにはもうありません。切り抜きには元の写真を使ってください。
- 植物、ガラス、ほかのオブジェクトを載せている物体の後ろを見せること:画像から3Dへの変換では、葉が描かれた中実の殻として葉が再現されます。これらは省くか、何を載せているかを指定して、それを取り除いてください。
- ボックスの底だけを基準に、床面にオブジェクトを配置すること:テーブルや座席の上にあるオブジェクトは、浮いたり沈んだりします。各オブジェクトが置かれていたのは、ボックスの底のすぐ後ろにある面です。
- ページ読み込み時にプロップを物理演算に投入すること:不安定な支持面によって、プロップが転がり落ちます。剛体のプロップは写真に写っていた位置でスリープ状態にしておき、柔らかいもの(クッション)だけを落ち着かせてください。
- 接触力が発生するたびにサウンドを再生すること:静止しているオブジェクトは、毎ステップ自重を報告します。オブジェクトが接触に向かって動いていた場合だけサウンドを再生してください。
- 画像から3Dへの変換によるPBRの金属度をそのまま信頼すること:ラッカーや釉薬が金属として再現され、クロームのようにレンダリングされます。金属度は実際に金属のものだけに設定してください。
- 3Dジョブが
failureと結果のダウンロードエラーを報告した後に、ペイロードを変更すること:これはプラットフォームのエラーであり、入力の問題ではありません。job_getでジョブのステータスがfailureであり、アセットがないこと(また、同じ入力で後続のジョブが成功していないことをjobs_listで確認してください)を確認してから、同じペイロードで一度だけ再試行してください。jobs_waitのタイムアウトは失敗ではないため、再実行の理由にはなりません。 - 負荷の高いローカルジョブ(キャリブレーション、メッシュ変換、スプラットの詳細度レベルのビルド)を並列実行すること:一度に1つか2つだけ実行してください。