
2026/07/05 1:15
カーヴボール
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
Curveball は、Neverball ゲーム向けの新しいオープンソースのウェブおよびデスクトップ用カーブ生成ツールであり、Rust で記述されています。これは、単純な円弧のみを生成出来た古い
curve.c ユーティリティに代わり、2D プロフィールを定義された経路に沿って自動で圧縮(extrusion)することで複合的な 3D シェイプの作成を可能にし、凸包アルゴリズムを用いています。このためには chull クレイを使用します。経路沿いの回転はフレネ標系(接線 T、法線 N、副法線 B)によって処理されます。コア関数 extrude<PRF, PTH> はセグメント、プロフィール、経路、およびオプションのプロフィール方向を受け取ります。圧縮機能に加え、Curveball は「Curve Classic」、「Curve Slope」(三角形のブラシを生成するもの)、そして「Rayto」をサポートしています。ソースコード、スクリーンショット、バイナリは GitHub で入手可能です。著者は以前休止していたレベルデザインにもこのツールを使用し、ワークフローを手動での調整から自動化された高忠実度の幾何形状作成へと移行することを期待しており、より広範なコミュニティへの採用を予定しています。本文
Curveball: Neverball 向けカーブ生成ツールの紹介
Curveball はオープンソースゲーム Neverball 向けの洗練されたステージセットを作成するための、カーブ生成ツールです。
🌐 利用方法と環境
- Web ブラウザでの利用: インストール不要でブラウザ上から動作します。
- ソースコード: GitHub で公開されており、スクリーンショットも確認可能です。
- デスクトップアプリとしての動作:
- GitHub リリース版のダウンロード
- Rust 環境があれば独自コンパイル(初心者でも難易度は低いです)
- 言語: ソフトウェア全体は完全な Rust 🦀 で記述されています。
⚙️ なぜ Curveball を使うのか?
Neverball の既存ツール
curve.c は円弧のみをサポートし、多様な形状の要望には対応できませんでした。開発者は「ランダムなスクリプト」から着想を得て、可視化機能を備えた統合ツールとして Curveball を開発しました。
🧱 仕組み:ブラシ(Brush)の構成
Neverball のステージは「ブラシ(brush)」で構成され、その定義には以下の制約があります。
- 半空間の交わり: ブラシは平面の交差領域として定義されます(宇宙を順次半分ずつ切り落とし、最終的に残す領域)。
- これにより衝突検出コードが簡素化されます。
- テクスチャ記述フォーマット: Quake マップフォーマットを採用。
- 平面上の 3 点で「切り取り」操作を定義。
- ⚠️ 注意: 3 点の順序が誤っていると、意図せず宇宙全体を切除する危険性があります。
📦 直方体のデータ例(JSON)
座標は括弧
() 内、以降はテクスチャ関連情報です。
{ "classname" "worldspawn", // brush 0 { ( 0 0 64 ) ( 0 64 64 ) ( 64 0 64 ) mtrl/invisible 0 0 0 0.5 0.5 0 0 0 ( 0 0 0 ) ( 0 0 64 ) ( 64 0 64 ) mtrl/invisible 0 0 0 0.5 0.5 0 0 0 ( 0 0 64 ) ( 0 0 0 ) ( 0 64 64 ) mtrl/invisible 0 0 0 0.5 0.5 0 0 0 ( 64 0 64 ) ( 64 64 64 ) ( 64 64 0 ) mtrl/invisible 0 0 0 0.5 0.5 0 0 0 ( 64 64 0 ) ( 64 64 64 ) ( 0 64 64 ) mtrl/invisible 0 0 0 0.5 0.5 0 0 0 ( 0 0 0 ) ( 64 0 0 ) ( 64 64 0 ) mtrl/invisible 0 0 0 0.5 0.5 0 0 0 } }
🔺 凸性の問題と解決策
- 制約: ブラシはすべて凸形状である必要があります。多くのカーブは非凸であり、通常は多数の小さなブラシに分割して表現する必要があります。
- 従来手法の問題: 点を手動で慎重に選択する方法はミスが起きやすく手間がかかりました。
- 解決策: 凸包アルゴリズムの活用。
- Rust ライブラリ
を使用することで、多数の点を入力するだけで形状を自動的に構築できます。chull
- Rust ライブラリ
🚀 鍵となるアイデア:押し出し(Extrusion)
機械設計 CAD ソフトウェア(Solidworks など)に触発された、洗練された抽象化手法を導入しました。
- 2 次元プロフィール形状を定義します。
- この形状を3 次元空間に押し出す操作を行います。
- Curveball では、この 2D プロフィールを経路方向に複数コピー配置し、隣り合う面の頂点を抽出して
に渡すことでブラシを作成します。chull
メリット
- 組み合わせの爆発力: $m$ 種類のプロフィール × $n$ 種類の経路 = 理論上 $m \cdot n$ 種類の異なるカーブを生成可能です。
- 全組み合わせを手動コーディングするよりはるかに効率的です。
🌀 オリエンテーション(回転)に関する問題
経路上でプロフィールをどのように回転させるかは重要な課題です。特に
_REVOLVE_ 経路や特殊な形状に有効です。
- 技術的課題: 経路の位置と進行方向だけでは、回転軸や角度が確定しません。欠落していた自由度は**「ねじり(torsion)」**でした。
- 解決策: **フレンネ標架(Frenet frame)**の活用。
- 曲線上の任意の点で接線ベクトル $\mathbf{T}$、法線ベクトル $\mathbf{N}$、副法線ベクトル $\mathbf{B}$ を定義します。
- これら 3 つのベクトルからなる回転行列 $[\mathbf{T}, \mathbf{N}, \mathbf{B}]$ に点を掛けることで簡単かつ正確に回転可能です。
Rust API サンプル
pub fn extrude<PRF, PTH>( n: u32, profile: &PRF, path: &PTH, profile_orientation: ProfileOrientation, ) -> CurveResult<Vec<Brush>> where PRF: Profile, PTH: Path,
: 経路に沿って変化可能な、平面上の点ベクトル列を生成するトレイト。Profile
: 点を一つおよびフレンネ標架($\mathbf{T}, \mathbf{N}, \mathbf{B}$)を返し、経路の変化を定義するトレイト。Path
⚠️ ルールの例外:その他のカーブタイプ
Extrusion の他にも以下のカーブがサポートされています。
- Curve Classic:
で表現可能だが、互換性のために別途実装。extrude() - Rayto: Extrusion の工夫で実現可能だが、巧妙な活用が必要のため直接実装。
- Curve Slope: 唯一、
だけでは生成できないカーブ。extrude()- ブラシ構成方法が異なり、結果としてブラシが「三角形のスライス」のように見えます。
🚀 今後の予定
- 特定形状が必要なステージ開発を再開し、新しいコンテンツを作成中です。
- Neverball コミュニティの皆様による創意工夫に期待しています。