この文書は、現在の camera-frames ブランチのコードを正として、
CAMERA_FRAMES の「あるべき現在地」を固定するための実装基点です。
- 対象バージョン:
cameraFramesVersion = v2.21.14 - 対象ブランチ:
camera-frames - 主な参照実装:
src/camera-frames.tssrc/ui/camera-frames-panel.tssrc/ui/main-camera-props-panel.tssrc/reference-images-controller.tssrc/camera-save.tssrc/camera-frames-render-backend.tssrc/camera-frames-render-bridge.tssrc/scene-config.tssrc/main.ts
この文書は、今後の保守と Spark 2.0 上での再現の両方に使う。 そのため、理想論ではなく「現行 stable 実装が保証していること」と「まだ保証していないこと」を明示する。
CAMERA_FRAMES は、SuperSplat 上で以下を成立させるための拡張である。
- A4 相当の基準紙上に複数の撮影フレームを配置できること
- 撮影カメラと編集カメラを分離して運用できること
- Render Box のアンカー付き off-axis フラスタムで構図を保てること
- 下絵・ガイド・GLB・3DGS を合わせて layout 用の PNG / PSD を出せること
.ssprojと.sscamにより、作業単位とカメラ単位の保存 / 引き継ぎができること
CAMERA_FRAMES の価値は、単なる viewport overlay ではなく、
render box + capture camera + presets + export + reference images
を一貫した作業系として持っている点にある。
- Graphics API は
WebGL2固定src/main.tsのcreateGraphicsDevice(..., { deviceTypes: ['webgl2'] })
- 既定の render backend は
unified-displaysrc/scene-config.ts
unified-cullingの既定値はfalsesrc/scene-config.ts
supportsStreamLodはfalsesrc/splat-render-backend.ts
- つまり現行 stable は
WebGL2 + unified-display- culling は opt-in
- streaming LoD は未導入 という状態である
- アプリ起動後、最初の安全な
postrenderでcamera.setNavMode('fpv')cameraFrames.setEnabled(true)が発火する
- したがって通常起動時の初期状態は
- CAMERA_FRAMES ON
- FPV ナビゲーション である
現行 stable の性能 / 安定性議論は、WebGPU や LoD を前提にしてはならない。
評価対象はあくまで WebGL2 + unified-display の到達点である。
現在の主要状態は以下を含む。
enabledrenderBoxframesmaskmainCameraPosenearClipexportNameexportFormatexportGridOverlayexportModelLayersexportSplatLayerscameraPresetsexportTargetexportPresetIdsselectedPresetId
baseSize = 1754 x 1240scalePct = 100 / 100anchor = centerviewZoomPct = 100projection.type = 'perspective'projection.baseFov = 60
- 基準サイズ
1536 x 864 - 位置
0.5, 0.5 - scale
100% - 回転
0 - 最大数
20
enabled = falseopacity = 0.8scope = 'all'
exportName = 'cf-%cam'exportFormat = 'psd'exportGridOverlay = trueexportModelLayers = trueexportSplatLayers = falseexportTarget = 'current'exportPresetIds = []
- camera preset は空で始まる
- CAMERA_FRAMES 有効化時に frame が 0 枚なら 1 枚自動生成する
- A4 相当の基準紙を viewport 上の logical space として扱う
- 幅 / 高さは別々に拡縮できる
- アンカー 3x3 で「どこを構図固定点にするか」を指定する
Canvas Zoomは preview 専用で 25〜100%- 書き出し時は常に
viewZoom = 100%
- CAMERA_FRAMES 有効時は水平 FOV 基準を維持する
- Render Box の幅 / 高さ / アンカーに応じて off-axis フラスタムを都度再計算する
- preview と export は同じ基準フラスタムから作られる
- export 時は
targetSizeを使って一時的に export 専用フラスタムへ同期し、完了後に preview へ戻す
enabled = trueの時が撮影表示enabled = falseの時が編集表示mainCameraPoseは撮影カメラの基準 pose として保持される- 編集表示中でも、撮影カメラ操作パネル経由で
mainCameraPoseを編集できる - 撮影カメラ操作パネルは OFF 中のみ開ける
- 起動直後の既定は FPV
- 左ドラッグによる FPV look は pointer lock を使わない
- そのためブラウザの pointer-lock トーストは出ない
- 一方で、長いドラッグは画面端で止まる
pngpsd
currentallselected
selected の場合は camera preset 一覧から export 対象を選ぶ。
以下は camera preset ごとに保持される。
exportFormatexportGridOverlayexportModelLayersexportSplatLayersexportName
一方で、exportTarget と exportPresetIds は「今回どの preset を書き出すか」の操作状態であり、
camera preset の意味そのものとは別に扱う。
- base render
- 必要に応じて Grid / Eye-level
- front / back reference images
- frame overlay
- 150dpi の
pHYsを付与
- residual
Renderlayer- 個別レイヤー化していない残りだけを持つ
- 残りが空なら PSD へ出さない
ガイドグループ- Grid
- Eye-level
- Grid は multiply
- visible GLB model layers
- visible PLY / SOG object layers
exportSplatLayers = trueの時だけexportModelLayers = trueが前提
下絵グループ- frame overlays
exportSplatLayersはexportModelLayersに従属し、単独では有効化しない- 3DGS object layer の積み順は Scene Manager の並び順を正とする
- 最下段の 3DGS は背景扱いで mask を持たない
- 上位 3DGS は
単独 / 自身+下位 / 下位のみの 3 枚から mask を導出する - GLB mask は従来どおり「自分以外の GLB + splat occlusion」を相手にする
現行 stable では、全カメラ書き出しや target size 切り替え直後に 3DGS がまだ出そろっていないフレームを取らないよう、 offscreen capture 前に splat sorter と追加 render を待つ。
要件としては次を守る。
- unified-display でも「3DGS が消えた Render レイヤー」を極力出さない
- preset 切り替え直後でも export の見た目が preview と乖離しない
ReferenceImageState の既定値:
enabled = falsevisible = falselayer = 'front'opacity = 0.7scalePct = 100offset = 0, 0includeInRender = false
画像を読み込むと preview 用には enabled = true / visible = true になる。
ただし export には自動で入れない。
下絵は以下を全て満たした時だけ書き出しに入る。
enabledvisibleincludeInRender
- 下絵は reference image preset 単位で管理する
- 初期 preset は
(blank) (blank)は名称変更不可- camera preset が選択されているとき、
- 表示
- 出力
- 並び順
- 位置
- スケール
- 不透明度 などは camera ごとの override を持てる
- override がある項目は reset で shared 状態に戻せる
- 最初の画像読込時、必要に応じてファイル名ベースの preset を自動作成する
- 以後は自動で名前を追従させない
.ssproj は full working project であり、以下を含む。
- splats
- models
- camera state
- timeline / pose sets
- CAMERA_FRAMES state
- reference images state
- reference image assets
- lighting
.sscam は camera preset 交換用であり、以下を含む。
- camera presets
- reference image preset の ID / name
cameraFramesVersion
以下は含まない。
- 3D assets
- reference image の実画像データ
- per-camera reference image overrides
したがって .sscam は「shot preset の受け渡し」用であり、
完全な再現は .ssproj に委ねる。
数値入力中に Enter や blur を強制しないまま、 app 側の Undo / Redo を自然に使えること。
Ctrl+Z / Ctrl+Shift+Z 時に未確定入力を自動 commit する対象:
- CAMERA_FRAMES パネル
- 撮影カメラ操作ポップアップ
- 下絵パネル
- Scene Manager の light / ambient
- Transform パネル
app 全体の全 NumericInput を統一挙動にしているわけではない。 CAMERA_FRAMES 非対象のダイアログは base app の挙動を取ることがある。
- Scene Manager で splat / model / light rig を一覧管理できる
- Scene Manager の splat / model 一覧は上下ボタンで並び替えできる
- この並び順は PSD の object layer 重ね順へ反映される
- Transform パネルで選択要素の位置・回転・スケールを数値編集できる
- Lighting で model light の表示、選択、方向リセット、強度、ambient を扱える
- これらの主要 numeric input も CAMERA_FRAMES の undo 改善対象に含める
現行 stable は次を目標にしていない。
- WebGPU 起動
- streaming LoD
lod-meta.json資産の runtime 利用unified-culling=trueを既定性能レバーとして運用すること
補足:
- Engine 側には WebGPU や LoD の仕組みがあっても、 現行 app はそこへまだ接続していない
- したがって Spark 2.0 との差は「まだ未導入の層」として扱うべきであり、 現行 stable の不具合とは分けて考える
今後 Spark 2.0 上で CAMERA_FRAMES を再現する際は、最低でも次を維持すること。
- Render Box のアンカー付き off-axis 構図維持
- 撮影表示 / 編集表示の二層カメラ運用
- camera preset ごとの main camera / render box / export 設定保持
- frame 配置・回転・アンカー編集の操作感
- reference image preset と camera override の連動
.ssprojと.sscamの意味の違い- preview と export の一致
- 全カメラ export 時の splat 安定待ち
- numeric input 編集中でも自然に undo / redo できること
この 9 項目を満たさない移植は、見た目が似ていても現行 CAMERA_FRAMES の再現とは見なさない。