HN 日本語サマリー

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

Halfspace: 距離場を用いたソリッドモデリングのための実験的IDE

Halfspace experimental IDE for solid modeling with distance fields (mattkeeter.com)

192 pointsby luu11 コメント

要約

Matt Keeter氏は、距離場を用いたソリッドモデリングのための実験的なIDE「Halfspace」を発表しました。このIDEは、Fidgetカーネルを基盤とし、リアルタイムでのラスタライズやメッシュのエクスポート機能を備えています。低レベルな距離場操作の煩雑さを軽減するため、標準ライブラリと段階的なモデル構築を組み合わせ、開発者はより直感的に複雑な形状を作成できます。

全文翻訳

Matt Keeter // Halfspace プロジェクト リサーチブログ リンクについて 導入 Halfspaceは、距離場を用いたソリッドモデリングのための実験的なIDEです。 デモを試してみてください(デモはコンピューターでの体験が最適です。モバイルSafariにはいくつかのWebGPUの問題があり、パン/チルト/ズーム操作はまだマルチタッチ向けに設計されていません)。 Halfspaceは、ラスタライズとメッシュ生成に使用されるFidgetカーネルのショーケースアプリケーションです。GUI内では、画像はリアルタイム(に近い速度)でラスタライズされ、モデルは画像または三角形メッシュとしてエクスポートできます。 2026年なので、これはバイブスでコーディングされたものではないことを最初に述べておきます。私は2025年4月からこれに取り組んでおり、人間の脳を使ってコードを書いています(Fidgetは2022年から存在します)。さて、この後の説明では、暗黙的サーフェスに関するある程度の知識を前提とします。詳細については、以前の多くの説明を参照してください(または読み進めてください、大丈夫です)。 なぜか? 私は暗黙的カーネルを書くのにかなりの時間を費やし、それらのカーネル上にGUIを書くのにそれより少し少ない時間、そして実際にそれらのツールでモデリングするのにさらに少ない時間を費やしました。実際、私は日常生活であまりソリッドモデリングを必要としません。そのため、私が作成するもののほとんどはデモや特定のカーネルの使用例です。 それでも、暗黙的サーフェスを扱う際に、特定の緊張関係に気づきました。低レベルの暗黙的サーフェスを扱うことは、アセンブリ言語を書くようなものです。低レベルで強力ですが、面倒です。もし与えられるのがx、y、z変数だけで、それらを夢のすべての形状に組み合わせる責任がある場合、それは苦痛な経験になり得ます。アセンブリを書く苦痛に直面したとき、ほとんどの人はその上に抽象化を構築します。つまり、低レベル表現にコンパイルされる高レベル言語やライブラリです。ここでの同等物は、形状と変換の標準ライブラリです:球、箱、平行移動、スケーリングなど。 アセンブリの苦痛に対するあまり一般的でないアプローチもあります。それは、アセンブリ自体を書くのをより簡単にすることです。その線での私のお気に入りのプロジェクトは、Kartik AgaramのMuです。これは、x86アセンブリ言語のサブセットの周りにエミュレーション、トレーシング、タイムトラベルデバッグをラップします。 Halfspaceは両方のパスを取ります。それは(小さくても成長中の)標準ライブラリを含みますが、モデルを段階的に構築することも容易にします。複雑なモデルは小さな部分に分割でき、それらは個別にパラメータ化して視覚化できます。 この正当化を踏まえて、説明をさらに詳しく見ていきましょう。 ソリッドモデリング まず、「ソリッドモデリング」とは、明確な内部と外部を持つオブジェクトに焦点を当てることを意味します。空間内の任意の点を選んで、それがモデルの内部にあるか外部にあるかを言うことができるはずです。これは明白に思えますが、そのプロパティを気にしないモデリングはたくさんあります。ビデオゲームのモデルビューアを起動すれば、単一の三角形のファンから構築された、無限に薄いテクスチャ付きの壁がたくさん見えるでしょう。 私のバックグラウンドはCAD/CAMソフトウェア(特に3Dプリンティングに重点を置いて)にあるため、物理的に実現可能なモデルが欲しいのです。 ソリッドモデリングには多くの方法があります。ほとんどのCADソフトウェアでは、境界表現ジオメトリカーネルが、個々のサーフェスをソリッドボディにまとめる責任を負います。これは非常に難しい問題です。例えば、2つのNURBSサーフェスの交差は閉形式解を持たないかもしれません! 私の修士論文に遡ると、私は暗黙的サーフェスに基づいたジオメトリカーネルに取り組んできました。これらは、単一の個人または小規模チームが書いたり完全に理解したりできる可能性があるという利点があります。そのため、個人スケールの製造ソフトウェアに適しています。 Halfspaceでもこれは続いています。これはFidgetジオメトリカーネルの周りにラップされたGUIです。モデルは、定義済みのプリミティブと手書きのスクリプトの組み合わせを使用して設計でき、画像または三角形メッシュとしてエクスポートできます。 距離場のIDE Fidgetカーネルを構成的ソリッドジオメトリ(CSG)レイヤーで純粋に使用し、形状(球、立方体、円柱など)を構築し、論理演算(和集合、共通部分、差分)でそれらを組み合わせることができます。Halfspaceは代わりに、基盤となる距離場を前面に押し出すという決定を下しました。 これがなぜ重要なのかを示す例を挙げましょう。ここに、のこぎり歯波形の2つの距離場があります。これらは空間内のすべての点で同じ符号を持ちますが、値は異なります。 この視覚化では、符号(内部と外部を定義する)は色(青とオレンジ)で示され、形状の境界は白(値0に対応)で示されています。フィールド値は、より薄い線で示されており、等間隔(等高線図のように)です。 どこでも同じ符号を持っているにもかかわらず、最初のフィールドは非常に挙動が悪いです。のこぎり歯の垂直エッジを見てください。ゼロを通過せずに、内部(青)から外部(オレンジ)への遷移があります。これはC0または「ジャンプ」不連続性であり、悪い兆候です!Fidgetは自動微分を使用して法線を計算するため、この境界を横切る法線は正しい方向を向いていません(上下の画像のフィールド線を比較してください)。3Dでは、シェーディングに法線を使用するため、これはキャビンの屋根材で不正確なシェーディングを生成します(これが馴染み深く見えるなら、それは以前のブログ投稿から抽出されたためです)。 距離場を前面に置くことで、このような問題を簡単に診断できます。実際、それはのこぎり歯フィールドのさらなる改善を示唆しています。勾配を、対角線に集中するのではなく、どこでも1になるように調整できます。ここに、変更前と変更後の比較があります。 均一な勾配は、さまざまなアルゴリズムの挙動を改善します。Fidgetは正確性のためにそれを必要としませんが、例えばメッシュ品質を向上させる可能性があります。 Halfspaceは実験的でクロスプラットフォームです 現在、Halfspaceを負荷のかかる容量で使用することは非常に大胆な決定となるでしょう。Fidgetの説明では、プロジェクトの目標の1つがこれでした:暗黙的カーネルの「正しい」APIを見つけること、そして互換性を大幅に壊す可能性。 Halfspaceも同様です。エンドユーザーにAPIを提示しませんが、大規模なクロスプラットフォームアプリケーションを構築することでソフトウェアアーキテクチャのスキルを flexing しており、積極的に反復して物事を壊すことを厭いません。 クロスプラットフォームと言えば、Webとネイティブプラットフォームの両方をターゲットにすることで、自分の人生を難しくしています。サプライチェーン攻撃の時代において、誰かにコードをコンパイルして実行してもらうのではなく、Webリンクを共有できることは、オンボーディングとカジュアルな使用に最適です。 そのために、私は「Halfspaceスタック」を収集してきました。これは、最小限の労力でネイティブ+Webアプリケーションを配布できるライブラリとパターンのセットです。現在、コアコンポーネントは次のとおりです。 Rust(アプリケーションおよびすべての依存関係用) wasm-bindgenなどを手動で呼び出してWeb用にビルド egui(GUI用) egui_dock(コアのウィンドウとタブの抽象化用) wgpu(UIのレンダリングとGPUコンピューティングの両方用!) Rhai(スクリプティング用) Rayonとwasm-bindgen-rayon(2つの目的で使用): 多数のワーカーに作業を分散させることで、並列アルゴリズムを高速化する。「典型的な」使用法です。 短命のバックグラウンドタスク用のスレッドプール。これはより珍しい使用法ですが、Webではスレッドを生成できません。 ...その他多数のライブラリやトリック web-time(クロスプラットフォームの時間サポート用) オフスレッド(非同期)GPUレンダリング用の自作ワーカープール これらすべては専用の説明に値するものであり、スタックのすべてのレイヤーについて不満がありますが、全体として、すべてが「うまくいく」ことは信じられないほどです。 Fidgetの改善を推進する Halfspaceのもう1つの目標は、非自明なアプリケーションで使用することにより、Fidgetカーネルの改善を推進することです。このフロントでの最大の勝利は、fidget-wgpuに関する継続的な作業でした。これはWebでのパフォーマンスによって動機付けられました。ネイティブビルドは快適に高速でしたが、CPUでのラスタライズは非常に遅く(「非対話的な速度」)、