スポーン位置選択ビジュアライザー
2026-08 ワークスペース(inf_nav_team_nearest 1)に対応:拡張がマルチソース逆方向 Dijkstra を一度実行し、各 Nav 領域に「最寄りの利用可能な生存者への経路距離 + 帰属 owner」を記録します。プラグインは 10 の固定距離レイヤーを近くから遠くへ探索し、レイヤー内は Flow の前方から消費します。灰色の壁は通行不可領域で、「経路距離 ≠ 直線距離」が直感的に分かります。生存者は直接ドラッグでき、ドラッグ後は現在の状態で距離場を再計算します。
2D モード:左ドラッグで生存者を直接つかんで移動、空白をドラッグすると視点をパン、ホイールはカーソル中心にズーム、ダブルクリックでリセット。「壁を描く / 壁を消す」を選んで押しながらドラッグで描画(内蔵グリッドのみ)。
3D モード:左ドラッグで回転(スムージング付き)、右ドラッグまたは Shift+左ドラッグでパン、ホイールはカーソル方向へズーム、ダブルクリックで視点リセット。生存者の配置は 2D で行ってください(ホバー時のハイライトは有効)。
グラフモード 2D:生存者をドラッグすると最寄りの Nav エリア中心にスナップ、空白のドラッグでパン。「エリア封鎖」はクリック/ドラッグで動的ブロック(エレベーター/ドア/nav_block を模擬)を切り替え、封鎖エリアは距離場と候補から除外されます。
グラフモードの可視性:ジオメトリデータ読み込み後は BSP 三角形への実レイキャストで判定します(world+disp の全三角形が遮蔽に参加、床/天井を含む。透明壁は視線を遮りません。直線距離 ≤1800 のペアのみ検査)。ジオメトリ未読み込み時は「直線 ≤1500、|Δz| ≤120、迂回比 ≤1.6」のヒューリスティックにフォールバックします。エクスポートデータには地上接続のみ含まれます(はしごエッジなし)。実マップデータはサーバー上で sm_navgraph_export コマンドでエクスポートし、「マップ JSON 読込」で読み込みます。
サードパーティマップはサーバー不要:.vpk / .zip / 素の .bsp+.nav を画面にドロップするか「ローカルマップを解析」をクリック。解析はブラウザ内のみでアップロードしません。.7z/.rar は非対応(先に vpk へ解凍)。結果はマップファイルのプリセット集合で、Anne stripper の blocker も Director のラウンドアイテムもなく、flow は自前の近似です。公式マップやランタイムの真値が必要なときは、従来どおりドロップダウン / 「マップ JSON を読み込む」で sm_navgraph_export の出力を使ってください。
生存者の状態(クリックで切替、ドラッグで移動)
今回の探索状態
シーンセーブ(ブラウザローカル)
探索ログ([FIND]/[SpawnPerf] の口径に対応)
通常スポーン試行 1 回の完全なフロー(team-nearest ブランチ)
本ページと実実装の対応関係 / 簡略化の説明
| 実実装 | 本ページのデモ |
|---|---|
| AnneSpawn_NavCandidatesPrepareTeam / CollectTeam(マルチソース Dijkstra、owner=最短経路を実現した生存者、同距離は小さい番号) | 8 方向グリッド Dijkstra で各セルに dist+owner を記録、同距離は小さい番号。1 セル = 50u |
| TEAM_NAV_LAYER_EDGES の 10 レイヤー ∩ 兵科 [classMin, min(finalMax, inf_SpawnDistanceMax×2)]、半開区間・最終レイヤーは閉区間 | 完全一致(選択兵科で切り詰め、空レイヤーはスキップ) |
| レイヤー内 flowOrder:Flow 降順(前方優先)。team モードは三分位の交錯もシャッフルもしない | 一致(Flow=横方向の進行度) |
| 任意の生存者から直線 <max(250, inf_SpawnDistanceMin) を除外。可視性 trace、スタック、経路再検証 | 除外圏 + グリッド視線(Bresenham の壁判定)。スタック/経路再検証は省略 |
| inf_score_behind_reject_gap 8 / _hjc 4。owner 進行度 ≥90 は減点のみでハード拒否しない | 一致 |
| SpawnScore_BuildCandidate の多因子スコアリング + 候補予算 12 から最良を選択 | 前方ボーナス − 後方勾配 − 距離逸脱 − カーネル密度。硬分散 100u はハード拒否。予算 12 から最良を選択 |
| SI_Target_limit: limit=(上限/行動可能人数)+1、先頭は×2(スポーン容量の口径のみ) | 一致。1 体スポーンごとに owner のカウント +1、上限到達で参加集合から離脱し距離場を再計算 |
| レイヤー枯渇 → Director Range(DIRECTOR_FALLBACK_MAX_TEAM_DISTANCE=2000 直線)フォールバック | 示唆的なマーカー(ランダムな実行可能遠点) |
| カーネル密度(接敵中は除外、核半径は上限に応じて縮小) / 硬分散(固定 100u) / Nav クールダウン / テレポート監督 | クールダウン、硬分散 100u、カーネル密度(半径は上限に応じて縮小)を実装。テレポート監督は省略 |
| 実マップ Nav グラフ(sm_navgraph_export で出力:エリア中心/コーナー/flow/属性ビット/有向エッジ) | グラフモード:同じステートマシンをインポートした隣接リスト上で実行。ジオメトリデータ読み込み後の可視性は実三角形レイキャスト(エンジンの trace とは僅かに差異あり:動的 prop なし、ガラス材質のセマンティクスなし)、未読み込み時はヒューリスティック(直線 ≤1500、|Δz| ≤120、迂回比 ≤1.6)にフォールバック。はしごエッジなし、IsValidFlags の終盤分岐は未再現 |
| blocked スナップショットは拡張がエンジンから毎フレームリアルタイムに読み取る(エレベーター/ドア/nav_block などの動的ブロック) | グラフモードでは「エリア封鎖」で手動マーキングし、Dijkstra と候補収集は封鎖ノードを単純にスキップ |
| アイテム/遮蔽エンティティ層はマップ読み込み後のランタイムスナップショット(stripper の追加・削除・変更を自然に含む)。ラウンド開始時に Director がアイテム密度に応じて一部の配置点を間引く場合があります | ビジュアライザはスナップショットのままアイテムアイコンと遮蔽ボックスを描画し、Director の間引きは模擬しません(v2 エクスポートデータのみ対応) |