【集中講座】Grasshopperでパフォーマンス改善!プレビューメッシュ設定を理解する

Grasshopperで複雑な3Dモデルを扱う際、「動作が重いな」「操作がカクカクするな」と感じることはありませんか?このパフォーマンス低下の主な原因としては、二つ考えられます。一つはコンポーネント内での計算に時間がかかる場合、そしてもう一つは作成された形状のプレビュー表示が重い場合です。

 このページでは、後者の「プレビュー表示が重い」という問題に焦点を当て、その原因の一端となるプレビューのメッシュの設定について解説します。特に、Grasshopperのプレビューメッシュ設定を理解し、パフォーマンス改善のための「Custom Quality」の活用方法をご紹介します。


RhinoやGrasshopperにおけるプレビュー表示とメッシュの関係

 RhinoやGrasshopper上で作成される曲線やサーフェスといったジオメトリは、基本的には数学的に定義されたNURBSという形式になります。Rhinoのビューポート上にNURBSサーフェスを表示する際、NURBSのままでは表示できないため、表示用のポリゴンメッシュを作成して描画することになります。

上図では、サーフェスからメッシュが作成されているのが分かるようにあえて粗くメッシュを表示しています。

このリアルタイムに生成され、ビューポートに表示されるメッシュがプレビューメッシュです。ただし形状が複雑であったり、表示するオブジェクト数が多かったりする場合には、このプレビューメッシュの生成と描画に大きな負荷がかかり、RhinoやGrasshopperの全体の動作が重くなることがあります。

またプレビューメッシュはRhinoとGrasshopperで共に形状を表示する際に作成されます。

Rhinoは、シェーディング表示モードなどにしている場合は、形状が画面に表示されたときにメッシュが作成されます。

Grasshopperのプレビューメッシュを表示する条件については、下記リンクを参照ください。

メッシュの分割の設定

 次に、Rhinocerosにおけるメッシュの分割設定について見ていきます。
RhinoはCGソフトではなくCADソフトとしての側面が強く、レンダリング用途だけでなく、他のメッシュベースのCGソフトウェアとの連携、3Dプリンターでの出力、メッシュデータを利用した切削加工など、様々な目的でNURBS形状からポリゴンメッシュを生成できます。
そのため、メッシュ作成に関する詳細な設定項目が用意されています。

Rhinoのメッシュ設定は、大きく分けて以下の2つの方法で行うことができます。

  • 簡易設定: 「粗くて高速」または「滑らかでやや遅い」のプリセットから選択します。
  • 詳細設定: 各種パラメータを手動で細かく設定します。

 Rhinoのデフォルトのメッシュ設定は、簡易設定の[粗くて高速]が適用されています。またこの設定はメニューの ツール > オプション を押した際に出る「メッシュ」の箇所から変更できます。

これらのメッシュ生成には内部的に、「密度」「最大縦横比」「最小エッジ長さ」「最大エッジ長さ」「最大角度」など、詳細な設定項目が用意されており、設定値によって生成されるメッシュの細かさ(品質)やデータ量が変化します。

メッシュ分割の各種設定項目の詳細については、下記ヘルプを参照ください。
https://docs.mcneel.com/rhino/8/help/ja-jp/index.htm#information/polygonmeshsettings.htm

Grasshopperのプレビューメッシュ設定

Grasshopper にも、プレビューメッシュの設定が複数用意されています。キャンバスの右上の[Preview Mesh Quality]ボタンから設定を変更できます。

Disable Meshing          : プレビューメッシュを作成しない

Low Quality                      : 簡易設定の「粗くて高速」

High Quality                     : 簡易設定の「滑らかでやや遅い」

Document Quality      : 現在開いているRhinoの3dmドキュメントのメッシュ設定を使用

Custom Quality             : Grasshopperで独自のメッシュ設定を使用

Edit Custom Quality : 独自のメッシュ設定を編集

標準では[Low Quality]に設定されており、Rhinoでいう簡易設定の「粗くて高速」の設定値でプレビューメッシュが作成されます。

パフォーマンスの課題:デフォルト設定での問題点

Grasshopperのデフォルトである[Low Quality]設定は、多くの場面で適切に機能します。しかし、以下のようなケースではパフォーマンスの問題を引き起こす可能性があります。

  • 非常に詳細で複雑なNURBSジオメトリを多数扱う場合
  • 多数の小さな形状が密集している
  • PCのグラフィック性能があまり高くない

このような場合、[Low Quality]設定であっても、生成されるメッシュのポリゴン数が膨大になったり、メッシュ生成処理そのものが複雑化したりすることで処理に時間がかかり、Grasshopper上での作業が著しく遅延することがあります。

Custom設定の活用:荒いメッシュ作成による解決策

ここで活用したいのが[Custom Quality]設定です。[Custom Quality]設定を使用すると、Rhinoのデフォルト設定や3dmでのドキュメントでの設定に縛られず、プレビューメッシュを生成するためのパラメータを細かく制御できます。

 パフォーマンス改善の観点からは、[Edit Custom Quality]ボタンをクリックして表示できる設定画面から、[Low Quality]よりも意図的に「粗い」プレビューメッシュを生成するようにパラメータを調整することが効果的です。

  [Edit Custom Quality]を押すと、[Mesh Parameters]ダイアログが表示されます。

それぞれの項目は、

[Angle]:最大角度
[Aspect]:最大縦横比
[Min Edge-Length]:最小エッジ長さ
[Max Edge-Length]:最大エッジ長さ
[Tolerance (relative)]:密度に関する設定

に相当します。
各項目の詳細は上記ヘルプを参照ください。

また、項目に0が設定されている場合は、「その項目は使用しない」という意味となります。

では例として 縦に30個、横に30個、計900個の球を配置するアルゴリズムで動作を比較してみます。[Low Quality]設定時のデフォルトAngle値(20度)よりも粗い25度に設定し、さらに[Refine Base-Grid]のチェックを外して、[Low Quality]と[Custom Quality]でのメッシュ生成時間を比較してみます。

 Grasshopperの標準の[Low Quality]の場合は、上図のように一度球の半径値を変更すると、10秒ほどメッシュの作成にかかっています。Grasshopperコンポーネント下部に表示される処理時間を見ると[Rectangle]に7ms、[Rectangular Array]は14msと併せても21ms(100分の2秒ほど)しか掛かっていないのに、プレビューメッシュ生成に多くの処理時間が割かれていることが分かります。

 粗めに設定した[Custom Quality]の場合は、上図のように球の半径値を変更してもタイムラグがほぼなく変更が反映されます。

 もちろんより粗い設定になっているため、プレビューメッシュも荒くなりますが形状確認の目的であれば十分と考えられます。


まとめ

Grasshopperでのモデリング作業を快適に行うためには、プレビューメッシュの理解が重要です。特に、複雑なモデルを扱う際には、デフォルト設定に任せるのではなく、[Custom Quality]設定を活用してプレビューメッシュを意図的に粗くすることも可能です。

もちろんメッシュを粗くしすぎると、作成しているNURBS形状から大きくかけ離れた表示になってしまい、正確な形状の確認が難しくなるというデメリットもあります。

しかし、Grasshopperの作業中はある程度の形状把握ができれば十分とし、最終的な形状確認は、Grasshopperから形状をBake(Rhinoに形状を作成する処理)し、Rhino側のより高品質なメッシュ設定で表示したり、レンダリングもできます。

適切なメッシュ設定は、作業効率の向上に直結します。もしGrasshopperで操作している際に表示の処理が遅くなったときは、まずは[Preview Mesh Quality]の設定を[Low Quality]から[Custom Quality]に変更し、意図的に粗く設定するのを試してみてください。

補足1:

このページのプレビューメッシュ作成の内容とは異なりますが、一番最初にあげたコンポーネント自体の計算に時間がかかる場合は、下記のリンクを参考に

  • 処理に時間がかかるコンポーネントの箇所を見直す
  • [Lock Solver]機能を使用して一時的に計算を止めて値を変更後に再計算する

という方法もあります。

補足2:

 Grasshopperで同一の形状を多数配置する場合には、Rhinoのブロック定義を活用するという方法もパフォーマンス改善に繋がります。
Rhino 8以降では、GrasshopperからRhinocerosのブロック定義を直接参照・配置できるコンポーネントが提供されており、これにより同一形状の複数配置を非常に効率的に行うことができます。

前述の例と同様に球を配置する場合、900個分のプレビューメッシュを個別に生成・描画する必要があります。しかし、ブロックインスタンスを利用すると、元となる1つのブロック定義のプレビューメッシュを生成し、それをインスタンスとしてコピーするため、計算負荷とメモリ使用量を大幅に削減でき、結果として処理速度が向上します。

上図では、[Sphere]で作成した形状をそのまま作成するのではなく、[Model Block Definition]でブロックを定義して、そのブロックを[Model Block Instance]で配置しています。ブロックを使用すれば上記の[Low Quality]でもほぼリアルタイムに変更できます。

またブロックを使用することで、パフォーマンス以外にも下記の利点があります。

  • Rhinoに[Bake]した後も、ブロックインスタンスとして保存できるため、保存した3dmファイルの容量を小さくできる
  • 後から元のブロック定義を1つ変更するだけで、配置されている他の全てのブロックインスタンスに変更を反映できる
  • ブロックとして作成することで、個数を数えることができる

 同じ形状の位置や角度、大きさのみ異なるものを多数扱う場合には、ぜひブロックの活用も検討してみてください。

▼ブロック機能について
https://www.applicraft.com/tips/rhinoceros/block/

▼Rhino8でのブロックの新機能について
https://www.applicraft.com/tips/rhinoceros/rhino8_block/

補足3:

ここまでの説明では、主にNURBS形状をGrasshopperで扱うことを前提としていましたが、NURBSでは形状を作成・修正するたびにプレビューメッシュの再計算と表示処理が発生します。詳細な形状確認の必要性が低い箇所には、以下のようなアプローチも考えられます。

  • 形状をNURBSではなく、あえてメッシュで作成する
  • NURBSとメッシュを切り替え可能なコンポーネントを作成し、必要に応じて切り替える

時間があれば上記のような処理もTipsとして公開できたらと思います。

補足4:  メッシュの分割の詳細

NURBSのような曲面形状を持つジオメトリーの形状は制御点の位置と座標・次数等で定義されますが、その形状は視覚的に表示するためには、Rhino(に限らずアプリ内で)、一度、ジオメトリーをメッシュ(3点または、4点で構成されるポリゴン・多角形)に変換します。そのときのメッシュの細分化が、表示に要する時間や、表示状態に影響します。

例えば、球はNURBS表現では、2次のNURBSサーフェスですが、その形を定義するのは、27個の制御点とその座標値及び、ウエイト値により定義します。この球を視覚化するためには、メッシュで球を近似しますが、その数によって表示時間が変わり品質が異なります。