Tsplat –ターミナルでガウススプラットを実行

2026/05/28 21:15

Tsplat –ターミナルでガウススプラットを実行

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

tsplat は、Rust で実装された高機能かつ CPU 専用のターミナル描画ツールであり、SSH セッション内かローカルマシン上で直接 3D ガウシアンスプラッティングシーンを表示することを可能にし、高価な GPU やディスプレイサーバーを必要とせず設計されています。本ソフトウェアは、位置、スケール(対数空間)、回転(単位四元数)、色(球面調和関数)、不透明度で定義される 3D データを最適化されたアルゴリズムによって 2D スクリーンにプロジェクションし、深度順の並び付けには 2 パスラジックスオーティング、アルファ合成にはペインターズのアルゴリズムに基づく手法を採用しています。tsplat は

.ply
ファイル経由で INRIA ガーデンシーンのような事前学習済みデータセットをネイティブに描画でき、対応する最新のユニコードグラフィックプロトコルをサポートし、非対応の場合にはハーフブロック(マインクラフト風)レンダリングへのフォールバックも可能です。パフォーマンスは非常に細かくチューニング可能で、ユーザーは描画制限(デフォルト 200k スプラット)、Rayon を用いた並列処理向けのスレッド数を調整するか、フェードアウトした視覚を修正するための生不透明度モードを有効化できます。本ツールはキーボード入力を介したインタラクティブなナビゲーションをサポートし(例:WASD でパニング、矢印キーで回転)、異なるデータセットサイズにおけるパフォーマンスベンチマークを実行するための専用バイナリ実行可能ファイルも提供します。動的な不透明度に基づくバウンディングボックスのカットオフ、キャッシュフレンドリーなタイルビンニング、ヘープ配当回避のためにフレーム単位でのスカラーバッファ再利用といった最適化を採用することで、tsplat はリソース制限のあるハードウェアにおいても複雑な 3D モデルの効率的な可視化を実現します。

本文

tsplat: Rust を使ったターミナル 3D ガウス Splatting

tsplat は、Rust で書かれたツールであり、ターミナル内で 3D ガウス splatting シーンを直接レンダリングします。

  • プロトコル: Unicode ハーフブロックまたは対応するグラフィックプロトコルを使用。
  • アーキテクチャ: CPU 専用(GPU や表示サーバー不要)。SSH 接続でも動作します。

インストール

Rust と

cargo
がインストールされている必要があります。

リポジトリからの直接インストール

cargo install --git https://github.com/darshanmakwana412/tsplat

ローカルでの構築(クローン)

git clone https://github.com/darshanmakwana412/tsplat
cd tsplat
cargo build --release

クイックスタート

INRIA 3DGS 形式の

.ply
シーンファイルが必要です。まずは提供されている事前学習済みの庭のシーンで動作を確認してください。

ベースの実行例

tsplat path/to/scene.ply

オプションコマンド

  • スプラット数の上限変更 (デフォルト 20 万)

    tsplat path/to/scene.ply --max-splats 500000
    # または無制限
    tsplat path/to/scene.ply --no-cap
    
  • 暗すぎるシーンへの対応 (Whitening)

    tsplat path/to/scene.ply --raw-opacity
    

注意: ターミナルがグラフィックプロトコルに対応していない場合は、半角ブロックレンダリングにフォールバックします(マインクラフトのような見た目になります)。


操作キー

キー動作
W A S D
カメラを移動(パン)
J / K
または 左右の矢印
イエロー軸:回転(横方向)
H / L
または 上下の矢印
ピッチ:傾斜(縦方向)
+ / -
または マウススクロール
ズームイン/アウト
O
オート・オービット切り替え(滑らかなループ動作、録画推奨)
Tab
HUD の切り替えと値調整
q
,
Esc
,
Ctrl-C
終了

ベンチマークテスト

前方パスの処理速度を測定します。スレッド数を指定できます。

cargo run --release --bin bench_forward \
    -- --threads 4,8 \
    --splats 200000 \
    --ply path/to/scene.ply

ガウス Splatting リンケージチュートリアル

ガウス splat の構造と、Rust を用いた前方パスレンダリングの実装について解説します。

ガウス Splat とは何か?

3D ガウス splat は、方向を持つ楕円体であり、色と不透明度(opacity)を持ちます。 シーン内の数百万のこれらの塊が、視点に重なり合って画像を形成します。

各スプラットは以下の構造で表現されます:

pub struct Splat {
    pub pos: Vec3,      // ワールド空間における中心位置
    pub scale: Vec3,    // ローカル軸に沿うサイズ(対数空間保存)
    pub rot: Quat,      // 方向(単位四元数)
    pub color: Vec3,    // RGB 色(球調和関数からデコード済み)
    pub opacity: f32,   // 不透明度 [0, 1](ロジット保存)
}

球調和関数(SH)の係数

SH 係数は、観測方向に依存する色の周波数領域表現です。INRIA 3DGS フォーマットでは最大バンド 3 をサポートしています(RGB あたり 48 係数)。

バンド 0 デコード例: 基底関数 $Y_0^0 \approx 0.282$ を用いて、ファイルの DC 係数から RGB に変換します。

pub const SH_C0: f32 = 0.28209479177387814;

pub fn sh_band0_to_rgb(f_dc: Vec3) -> Vec3 {
    (Vec3::splat(0.5) + SH_C0 * f_dc).clamp(Vec3::ZERO, Vec3::ONE)
}

前方パスパイプライン

ステップ 1: Splats の射影

1.1. 3D コバリアンス行列の構築 各スプラットに対して、3×3 のコバリアンス行列 $\Sigma$ を計算します。再パラメータ化により、常に正半定な行列が保証されます($M \cdot M^T$)。

let r_mat = Mat3::from_quat(s.rot);
let s_mat = Mat3::from_diagonal(s.scale);
let m = r_mat * s_mat;
let cov3d = m * m.transpose();

1.2. ビュー空間への変換 カメラ中心に移動し、ビュー行列で変換します。

let w_mat = Mat3::from_mat4(view);
let w_mat_t = w_mat.transpose();
let cov3d_view = w_mat * cov3d * w_mat_t;
// ポジションも同様に变换
let p_view = Vec3::new(p_view4.x, p_view4.y, p_view4.z);

1.3. 2D への射影とヤコビアン 視点投影は非線形ですが、局所的には線型化されます。ヤコビアン $J$ を用いて 2D コバリアンスを計算します。数値安定性を高めるために対角成分に

eps2d
を加えます。

let c = &cov3d_view;
let inv_zc = 1.0 / zc;
let inv_zc2 = inv_zc * inv_zc;

let j00 = fx * inv_zc;
let j02 = fx * xv * inv_zc2;
let j11 = fy * inv_zc;
let j12 = fy * yv * inv_zc2;

// ... 行列計算と逆行列の生成 (det <= 0 チェックあり) ...

ステップ 2: バウンディングボックスの計算

スプラットのサポート無限大のため、効率的に処理するために領域を絞り込みます。

  • 3$\sigma$則: ガウスの 99.7% をカバーする半径 $r = 3\sqrt{\max(\lambda_1, \lambda_2)}$。
  • 透明さに基づく最適化: 不透明度が低いスプラットは、可視閾値 $\tau$ の下で急速に減少するため、領域を狭めます(カットオフ距離 $k$ を調整)。
if s.opacity <= alpha_threshold { return None; }

let k2 = (2.0 * (s.opacity / alpha_threshold).ln()).min(max_k2);
// ... 範囲計算と画面座標へのクリップ ...

ステップ 3: 深さソート

画家のアルゴリズム(逆順合成)のため、スプラットを深度でソートします。浮動小数点数のビットパターン順序を利用し、16 ビット×2 パスのヒストグラムソートを使用することで高速化を図ります。

pub fn sort_by_depth(projected: &mut [Projected], scratch: &mut ScratchBuffers) {
    // 2パスラジックスート(低位・高位ビット)
    // ヒストグラムカウントとオフセット計算
}
// パラレル版も実装あり(50,000 エレメント以上推奨)

ステップ 4: タイルビンニング

画像を 16×16 ピクセルのタイルに分割し、各スプラットがどのタイルと重複するかを管理します。

  • パス 1: カウント(各タイルへの接触数)。
  • パス 2: 分散(カウント累積和を用いてインデックス配置)。

これにより、ソート済みの順序で自動的に処理でき、キャッシュヒット率が向上します。

pub fn bin_splats(projected: &[Projected], width, height, bins) {
    // カウント段階 -> 前積和 -> インデックス分散
}

ステップ 5: アルファ合成

深さソートされた順にスプラットを合成します。

  • 透過率 T:
    1 - alpha_accum
    を用いて、透過光と現行のスプラットの色を掛け算し累積します。
  • 飽和判定: 不透明度が 0.999 に達したらそのピクセル以降はスキップ。

性能最適化:

  • 行定数の引き上げ:
    py
    ループの外に係数を計算し、内部ループを高速な一次/二次式計算にする。
  • 早期終了: 行の最大値(ピーク)が閾値より低ければその行全体をスキップ。
fn composite_splat(...) {
    // ... 係数事前計算 ...
    for py in y0..=y1 {
        // row_peak チェックで早期終了判断
        let dx = px - sx; 
        // ... ガウス関数評価と累積合成 ...
    }
}

タイル並列合成

各タイルの領域が独立しているため、ロックなしで並列処理が可能です。Rust の Borrow Checker を回避するために

unsafe
ブロック内で生ポインタ(
FbPtr
)を使用します。

pub fn composite_tiled(...) {
    // タイルごとに並列処理 (rayon)
    // 各タイルは独自のピクセル矩形を書き込み、競合なし
}

おまとめの最適化テクニック

高速近似 Exp

標準の

exp()
は重いですが、64 ビット精度が必要ない場合は以下の近似を使います(Schraudolph のトリック)。

fn fast_exp(x: f32) -> f32 {
    let x = x.max(-87.0); // 範囲制限
    let v = (12102203.0 * x + 1065353216.0) as i32;
    f32::from_bits(v as u32)
}

スcratch バッファのリユース

ソートなどの作業用バッファを毎フレーム再割り当てるのを避け、構造体に保持してリユースします。

pub struct ScratchBuffers {
    pub sort_aux: Vec<Projected>, // 最初のみ拡張し、以後縮小しない
}

リンケージとライセンス

  • 論文: Kerbl et al. "3D Gaussian Splatting for Real-Time Radiance Field Rendering"
  • 参照実装: LichtFeld-Studio (C++ Reference)

本プロジェクトは MIT ライセンス で公開されています。

同じ日のほかのニュース

一覧に戻る →

2026/05/31 8:26

マイクロソフトが永続ライセンス付きのオフライン製品の機能制限を実施

## Japanese Translation: 2026 年 7 月 13 日、Microsoft は macOS および iOS 向けに永続ライセンス付きの Office アプリに対して重要な制限を施行し、Word、Excel、PowerPoint、Outlook、OneDrive のライセンス証明書が期限切れになった時点でユーザーを閲覧専用モードにロックします。これにより、これらの特定のデバイスでの完全な編集機能は事実上終了し、2023 年のサポート終了日以降もデータ安全性が恒久的に維持されるとの以前のアシuranse と大きな決別を示します。Windows や Android バージョンはこの証明書問題の影響を受けない一方、この機能劣化は Apple ハードウェア上の古い永続ライセンスを特定して対象としています。ユーザーは現在のソフトウェアを再インストールしても問題を修復することはできず、代わりに無料の Web アプリへ移行するか、新しいサブスクリプションベースのライセンスを購入する(または Office Home 2024 永続ライセンスの可能性もある)、あるいは LibreOffice、OnlyOffice、Pages のような代替スイートへ切り替える必要があります。Microsoft は Office 2021 ユーザーに対して限られた解決策を提供しており、バージョン 16.83 以降へのアップグレードが可能で、これは 2026 年 10 月までの新たな証明書を含んでいます。しかし、サポート終了済み Office 2019 を実行している場合に必要な閾値未満のハードキャップのため、有効なアップデートパスは存在しません。Microsoft は 2026 年 5 月中旬から影響を受ける顧客へ電子メールを送信し、代替策として無料の Microsoft 365 Personal トライアルを提供しています。この動きは、業界全体の広範な傾向を浮き彫りにしており、永続ライセンスは継続的な有料サポートや特定の技術パッチなしに長期的な機能維持のためにはますます信頼性が低いという事実を示しています。

2026/05/31 5:40

専門分野の知見こそが、本物の護城河であった。

## Japanese Translation: ソフトウェア開発における核心的な変化は、システム構築と検証を分離する「エージェント型 AI」の台頭であり、これにより深いドメイン知識が生のコーディングスキルよりも新たな最重要資産となっています。従来のエンジニアは、失敗を観察したり専門家の影を追うことによりドメインを習得しましたが、この育成型の道筋は現在、多くの場合に封殺されています。今日のエージェントは、物流スケジュールや給与計算規則といった複雑な業界データを調和させることで得られる暗黙的理解を再現するのが困難です。そのため、特定のバックグラウンドを持たない一般向けエンジニアは、AI が生成したコードを効果的に検証することができず、コーディングを行わない者もこれらの強力なツールを効果的に活用できません。未来の景観では、機械的なコーディング能力と深い業界専門知識を併せ持ち、「二重判断」を行う専門家—すなわちコードの健全性と事実の正確性の両方を保証する人材—が優位に立つでしょう。AI による抽象モデルの機械的翻訳がもはや独占的ではなくなる中、現実世界の法規制の実証済みモデルこそが決定的な資産となります。この移行は物流配車オペレーターなどの役割を再定義し、清らかなコードの生成が主たる制約ではなくなった時代において、ドメインの複雑性に対する人間の洞察が不可欠であることを証明しています。 ## Text to translate: No significant improvements are needed as the original summary is concise, accurate, and comprehensive. ## Summary: The central shift in software development is the emergence of Agentic AI, which separates building systems from verifying them, making deep domain knowledge the new most valuable asset rather than raw coding skills. Unlike traditional engineers who learned domains by observing failures and shadowing experts—a developmental path now blocked for many—today's agents struggle to replicate the tacit understanding gained from reconciling complex industry data like logistics schedules or payroll rules. Consequently, generalist engineers cannot effectively verify AI-generated code without this specific background, while non-coders remain unable to leverage these powerful tools effectively. The future landscape favors professionals who combine mechanical coding proficiency with profound industry expertise to perform "double judgment," ensuring both code soundness and factual accuracy. As mechanical translation of abstract models becomes less exclusive due to AI, verified models of real-world regulations become the critical asset. This transition elevates roles like logistics dispatchers, proving that human insight into domain complexities is irreplaceable in an age where generating clean code is no longer the primary constraint.

2026/05/29 11:49

砂漠の真ん中に貝殻を見つけた

## Japanese Translation: サウジアラビアのアルガット砂漠の崖基部で発見された目立つ岩石は、海岸線近くにはなく、地質学的証拠によるとジュラ紀(約 1500 万年前)には海洋の底だった場所で、貝殻のように見える。地域のパレオントロジー専門家がいなかったため、著者は DIY データ分析を用いてその系統を同定した。ほぼ 8,000 の貝殻種を含むデータセット(Zhang et al.)において、著者は各輪郭を 256x2 マトリクスとして表現し、輪郭間の二乗ユークリッド距離を計算し、主成分分析(PCA)を適用した。得られた 2 次元潜在空間では、負の PC1 値は丸みを、正の値は尖り具合を示し、PC2 は対称性または質量分布を捕捉していた。化石は最も近似的に*Sphincterochila candidissima*に類似しており、これは約 3800 万年前にのみ出現した種であり、ジュラ紀にはいなかった。PCA に基づくと形状はほぼ同一だが、時間的ギャップにより直接的な祖先関係は否定され、代わりに収斂進化が示唆される:無縁の生物が同様の環境圧力の影響を受けて類似の形態を発達させた。このプロジェクトでは、また shell.hawzen.me というインタラクティブなツールを提供しており、これは遠隔地の非専門家でも専門的な科学ツールにアクセスできるようにし、研究の民主化と地球の歴史に関する深遠な事実の解明を実現することを示している。

Tsplat –ターミナルでガウススプラットを実行 | そっか~ニュース