本文へスキップ

スポーン位置選択ビジュアライザー

2026-08 ワークスペース(inf_nav_team_nearest 1)に対応:拡張がマルチソース逆方向 Dijkstra を一度実行し、各 Nav 領域に「最寄りの利用可能な生存者への経路距離 + 帰属 owner」を記録します。プラグインは 10 の固定距離レイヤーを近くから遠くへ探索し、レイヤー内は Flow の前方から消費します。灰色の壁は通行不可領域で、「経路距離 ≠ 直線距離」が直感的に分かります。生存者は直接ドラッグでき、ドラッグ後は現在の状態で距離場を再計算します。

ドロップしてブラウザで解析(VPK / ZIP / BSP / NAV)
壁 / 通行不可 除外圏 <250u 現在の探索レイヤー(半開区間) 評価中の候補 フィルターで除外(理由はログ参照) スコアプールに受理 最終スポーン地点 → 線は owner を指す スポーン不可エリア(セーフルーム/救出クローゼット/救出車両フラグ、グラフモードのみ) マップジオメトリの壁面(2D ワイヤーフレーム / 3D 半透明) 透明壁(playerclip) 静的プロップボックス(薄い色=推定サイズ) 銃器・弾薬の配置点 医療アイテムの配置点 投擲物の配置点 アップグレードの配置点 その他アイテムの配置点 遮蔽エンティティボックス(env_*_blocker) ドア / エレベーター / 可動エンティティボックス その他 solid エンティティボックス 警報車 ボタン / 救援 / 注ぎ口 / 据え付け銃

2D モード:左ドラッグで生存者を直接つかんで移動、空白をドラッグすると視点をパン、ホイールはカーソル中心にズーム、ダブルクリックでリセット。「壁を描く / 壁を消す」を選んで押しながらドラッグで描画(内蔵グリッドのみ)。

グラフモードの可視性:ジオメトリデータ読み込み後は 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 の出力を使ってください。

生存者の状態(クリックで切替、ドラッグで移動)

「上限」= SI_Target_limit の targetLimit((特殊感染者上限/行動可能人数)+1)。先頭(Flow 最高者)は容量判定時に上限 ×2。上限到達で参加集合から離脱し、残りメンバーで距離場を再計算します(プラグイン側のフィンガープリントリセット + スナップショット再構築に対応)。

今回の探索状態

レイヤー: - 検査数: 0 スコアプール: 0/12 スポーン数: 0

シーンセーブ(ブラウザローカル)

探索ログ([FIND]/[SpawnPerf] の口径に対応)

通常スポーン試行 1 回の完全なフロー(team-nearest ブランチ)

0. 参加集合生存者を走査:生存・拘束されていない・ダウンしていない・目標容量未満(先頭は上限×2)→ (client, navId) リスト。メンバーの移動や容量変化はフィンガープリントを変え、カーソルをリセットしてスナップショットを再構築します。
1. 拡張スナップショットworker スレッドがマルチソース逆方向 Dijkstra を一度実行(AnneBuildTeamNavCandidateSnapshot):各 Nav が「最小経路距離 + owner」を得ます。任意の生存者から直線 250u 未満の領域は除外し、全候補を Flow 降順で flowOrder に並べます。
2. 距離レイヤー固定境界 250/350/500/700/900/1150/1400/1700/2000/2400/3000 の 10 レイヤーを兵科の min/finalMax と交差させ半開区間で取得します。空レイヤーはスキップ(AdvanceToUsableBand)。
3. owner チェックレイヤー内は Flow の前方から候補を取得:owner が無効 → ownerInvalid++ でスキップ、owner が容量到達 → ownerCapacity++ でスキップ(カーソルはリセットしない)。その後、評価フレームを owner(目線/足元/進行バケット)に紐付けます。
4. ハードフィルターNav フラグ → 後方ハード拒否(cand−owner < −8、HJC は −4。owner≥90% で免除)→ クールダウン → 同バケット上限(既定オフ)→ ランダム点:硬分散 100u/距離/除外圏 → スタック → 可視性 → 経路到達性。
5. スコアリング距離帯の適合、Flow 前後勾配(後方はソフト減点、HJC ×2.5)、高さ、カーネル密度(接敵中の特感は除外し、核半径は特感上限に応じて縮小)→ 合計 ≤0 は淘汰。
6. 最良を選んでスポーンスコアプールが 12 個に達するか当該レイヤーを使い切ったら → 最高得点をスポーンし、commit を owner に記録。全レイヤー枯渇 → Director Range フォールバック(直線 2000u 上限)。

本ページと実実装の対応関係 / 簡略化の説明

実実装本ページのデモ
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 エクスポートデータのみ対応)
旧モード(inf_nav_team_nearest 0)との違い:旧モードは兵科ごとに単一の目標生存者を固定し、その目標からシングルソース距離場を構築、距離帯は兵科ごとに線形拡張、レイヤー内は近/中/遠の三分位交錯 + シャッフル。新モードはチームで 1 枚の距離場を共有し、owner は最短経路から自然に決まり、距離レイヤーは全兵科共通、レイヤー内は「前方優先」です。