HN 日本語サマリー

← 一覧へ戻る
プログラミング

Curveball

Curveball (mightyburger.net)

51 pointsby toilet11 コメント

要約

Curveballは、ゲームNeverballのレベルデザインに使用できる、Rust製の曲線生成ツールです。CADソフトウェアから着想を得た「押し出し」という抽象化により、2Dプロファイルを3D空間に押し出すことで複雑な形状を効率的に生成します。これにより、従来の手作業では困難だった多様な曲線を、プロファイルとパスの組み合わせで容易に作成できるようになりました。

全文翻訳

CurveballはNeverball用のカーブジェネレーターツールです。 CurveballはWeb上で使用できます! ソースコードはGithubで公開されています。そこでは、さらにいくつかのスクリーンショットを見つけることができます。 Curveballをデスクトップアプリとして実行したい場合は、Githubからリリースをダウンロードするか、自分でコンパイルすることもできます。心配しないでください - Curveballのコンパイルは簡単です、特にすでにRustを持っているなら。 ええ、そうです。このツールはRust 🦀で書かれています。それは良いに違いない、右? カーブの狂気 なぜCurveballなのか?私はオープンソースゲームNeverballのレベルセットに取り組んでおり、いくつかの派手な形状が必要でした。 Neverballにはすでにcurve.cというカーブ生成ツールがあります。それは既存のNeverballレベルセット(Nevermaniaを除く - fwpはおそらく独自のスクリプトをいくつか書いたはずです)には十分でした。しかし、curve.cは1種類のカーブしか生成できません:円弧です。確かに、それは多くのノブを提供します。 curve.cでは作れないカーブが必要だったので、ギャップを埋めるためのスクリプトを書きました。 その後、これらのランダムなスクリプトを1つのツールに統合し、curve.jsのようなビジュアライザーを持つというアイデアを思いつきました。それを開発し始め、少し夢中になりました。最終的な結果がCurveballです! どうやって機能するのか? 私の初期のスクリプトは非常に基本的でしたが、徐々にそれをより良く、より手間のかからないものにするための巧妙な抽象化を見つけました。 宇宙を求める Neverballのレベルは多くの「ブラシ」で構成されています。各ブラシは小さなジオメトリ片です。 ブラシは奇妙な方法で定義されます:各ブラシは半空間の交差です。これは、以前に聞いたことがない場合、威圧的に聞こえるかもしれませんが、説明させてください。 ブラシをこのように形成すると想像してください:まず、ブラシが宇宙全体を占めるようにします。次に、宇宙を繰り返し半分にカットしていき、小さな部分だけが残るようにします。 これは奇妙ですが、衝突コードを容易にするなど、技術的な理由があります。 次に、これらの形状をテキストファイルで記述する方法が必要です。NeverballはQuakeマップ形式を解析します。ここで各「カット」は平面上の3つの点で定義されます。これらの点は特定の順序である必要があります。間違えると、宇宙の誤った半分を誤ってカットしてしまう可能性があります! 興味があるなら、立方体のデータ例を以下に示します: { "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 } } 括弧内の点が座標です。それ以降はテクスチャに関連しています。 凸性 残念ながら、ブラシの仕組みにより、すべてのブラシは凸でなければなりません。しかし、ほとんどの曲線は凸ではありません。そのため、曲線は一般的に小さなブラシの集まりで構成する必要があります。 より簡単な方法 curve.cと私の初期のスクリプトは、単に慎重に点を手動で選択していました。これは非常にエラーが発生しやすく、少し面倒でした。私たちの問題は、凸包アルゴリズムが解決できる種類のものであることがわかりました。私はRustで凸包アルゴリズムを実装するchullクレートを見つけました。これで、たくさんの点をchullに与えて、それから形状を作らせることができます。クール! これにより、新しいカーブジェネレーターをすばやく簡単に作成できるようになりました。しかし、各面にテクスチャを割り当てる作業も依然として苦痛でした。Trenchbroomは多くの面にテクスチャをペイントするのに役立つので、私はこのことを心配しないことを選択しました。 chullを使用すると、頂点を定義するだけでこれらの曲線を作成するのが簡単になりました。しかし、まだ改善の余地がありました。 鍵となるアイデア:押し出し これらの曲線を作成するための非常に巧妙な抽象化を発見しました。これはSolidworksのような機械CADソフトウェアに触発されました。そのアイデアは、2Dプロファイルを定義し、それを3D空間に押し出すというものです。 Curveballでは、2Dプロファイルはパスに沿って複数回コピーされます。Curveballは、2つの隣接する面のすべての頂点を取得し、それをchullに通してブラシを生成します。パスの終わりに達するまで繰り返すと、曲線が作成されます。 これは形状を生成するための非常に自然な方法であり、多くのオプションが開かれます。プロファイルとパスのすべての組み合わせが新しい曲線を作成します。いくつかは非常に奇妙で、おそらく役に立たないでしょうが、作成できる興味深く有用な曲線がたくさんあります。もし私がm個の異なるプロファイルとn個の異なるパスをコード化した場合、今ではm・n個の異なる曲線を作成できます!すべての順列を手動でコード化するには時間がかかったでしょう。 向き付け 解決すべき興味深い問題は、パスに沿ってプロファイルを回転させることです。これは、リボルブパスにとって特に自然ですが、他のパスにも役立つ可能性があります。 これをプログラムする際に問題に直面しました。私の最初の試みはすべて同じ誤解をしていたために失敗しました。パスの点と進行方向だけでは、どのように回転すべきかを知るには十分な情報ではないことが判明しました!私が欠けていた自由度がありました:ねじれです。 最終的にフレネフレームにたどり着きました。曲線の任意の点にT、N、Bベクトルを定義できれば、[T, N, B]行列を点に掛けるだけでその点を回転させることができます。 フレネ・セレッ算や回転最小フレームを見つけるなどの興味深い技術を使用してこれらのベクトルを見つけることができますが、Curveballのパスはすべて単純なので、3つのベクトルを直接定義するだけで十分です。そのため、私はそうしました。 パスに沿ってプロファイルを回転させることが常に望ましい動作とは限らないため、Curveballではオプションにしました。 これは関数シグネチャです: pub fn extrude<PRF, PTH>( n: u32, profile: &PRF, path: &PTH, profile_orientation: ProfileOrientation, ) -> CurveResult<Vec<Brush>> where PRF: Profile, PTH: Path, 悪くないですね!Profileは平面上の点のベクトルを生成するもので、パスに沿って変化する可能性があります。Pathは点とパスを生成するために変化するフレネフレームを生成するものです。 ルールの例外 押し出しに加えて、CurveballはCurve Classic、Curve Slope、Raytoと呼ばれる他の3つの曲線も生成できます。 Curve Classicは実際には押し出しとして生成できます。これは、extrude()がパスに沿って変化する2Dプロファイルを受け入れることができるためです。インターフェースをcurve.cと同じにするために、別々に実装することを選択しました。 Raytoも押し出しとして生成できます。上記の機能の非常に巧妙な使い方をする必要があります。それは面倒でしょう、代わりに直接実装しました。 Curve Slopeはextrude()では生成できない唯一の曲線です。その理由は、ブラシを生成する仕組みが異なるからです。Curveballでこの曲線を作成すると、ブラシは三角形のピースのように見えることに気づくでしょう。 次は何? このツールを使う時が来ました!特定の曲線形状が必要だったため、一時停止していたレベルがいくつかあります。これで先に進み、楽しいレベルを作成できます。 このツールを使ってNeverballコミュニティがどのようなものを作るか楽しみにしています。 注:技術的な詳細を修正するために、この投稿にいくつかの小さな編集を加えました。