👻

Arcol のパラメトリックジオメトリエンジンについて

2024/07/18に公開

以下の記事を読んだメモです
英語の勉強目的に自分で翻訳しているので間違いがあればすみません
https://blog.arcol.io/parametric-geometry-engine

はじめに

Arcolでは、大規模なアセットをウェブ上で高速に動かすためにジオメトリの効率的な生成と高速なレンダリングの設計に時間を費やしてきた。まだ、道なかばだが、パフォーマンステストでは有望な結果を示している。

パラメトリックモデリング

Arcolのジオメトリエンジンはパラメトリックモデリングができるように設計されている。ユーザーが最終的な形のみを直接モデリングする方法とは異なり、パラメトリックモデリングでは、一連の離散的な操作で各ジオメトリ要素を構成する。このような非破壊的な操作をすることでモデリングの履歴を保存していくことができる。

有向非巡回グラフ (Directed Acyclic Graph, DAG)

Arcolのジオメトリエンジンでは、モデリングの履歴は単純なUndoスタックではなく編集可能なグラフによって内部的に表現される。各モデリング操作がノードであり、メッシュやスケッチデータがエッジにノード間を渡る。このエッジのデータは各ノードが実行されたら即座に削除される。ウェブアプリのメモリ容量は限られているため、Arcolのジオメトリエンジンでは特に注意している。

依存関係の実行順序

ユーザーがパラメータを編集したり、モデリング操作を加えるたびにエンジンはグラフを実行し、ジオメトリを生成し、キャンバスを更新する。高速なパフォーマンスのためにグラフの最小限必要な部分のみ実行する。

ユーザーがパラメータを編集した場合、エンジンのレスポンスは以下のようになる。

  1. パラメータを編集して影響を受けるレンダリングされているメッシュのセットを特定する
  2. 修正されたパラメータと影響を受けたメッシュ間の全てのノードを集める
  3. ノードのトポロジカルソートを実行する(依存関係順にリスト化する)
  4. ノードリストをイテレートし、各ノードを実行する
  5. グラフによって生成されたポリゴンメッシュを三角形分割する
  6. 計算結果をWebGLに送る

上記の3つの手順は、MakeやESbuildなどのビルドツールの動作に似てる。

マルチスレッディング

Webワーカーは大規模なアセットを処理する際にパフォーマンス向上に役立つ。そのため、計算負荷が「フレームの容量」である16ミリ秒(60fps)を超えてもUIスレッドはスムーズに動作し続ける。
エンジンのWebワーカーはAPI設計に影響があるので早期に導入する必要があり、ワーカーとの通信はメッセージのやり取りによってのみ行われる。ユーザーがパラメータを変更したり、モデリング操作をした際にUIスレッドはJSONスニペットをエンジンのワーカーに送信する。

エンジンがグラフを実行し終えると新しく生成されたメッシュデータをメッセージとして送信する。大量のデータを送信しているように見えるが、全てのメッシュデータはtyped arraysを使用して連続したメモリ領域に保存される。また、データを不要にコピーしないためにTransferable objects
を使用している。

まとめ

Arcolは、共同編集可能なウェブファーストなBIMツールを作っていて、ジオメトリカーネルにBIMの概念を組み込みたいと考えている。

Discussion