vicc blog

株式会社ヴィックの技術ブログです。

実プロジェクトでの Grasshopper 反省会 #4 _ RhinoCommon ともっと仲良くなりたい

ヴィックの吉岡です。相も変わらず、反省会シリーズです。

blog.vicc.jp

今回の記事では、最近のプロジェクトの中でちまちま調べながら触っていた RhinoCommon について書いてみます。

はじめに

ExtendSrf や BlendSrf、OffsetSrf のソリッド作成など、Rhinoceros ではコマンドひとつで簡単に実行できるが Grasshopper では純正のコンポーネントとして存在しないという機能がいくつかあります。

純正のコンポーネントに存在しないものの、Pufferfish や Sasqutch といったプラグインでサポートされている機能もありますし、もっと探せばどこかにはあるかもしれません。が、コマンドひとつで出来る機能に対して、プラグイン探しの旅に出るのは少し馬鹿らしいかもしれません。

www.food4rhino.com

www.food4rhino.com

適切なコンポーネントがないので Grasshopper での実行を諦め、一度 Bake してその操作だけを Rhino で操作をするというのも選択肢の一つです。もう一つの選択肢として RhinoCommon を呼び出して Grasshopper 上で実行しようというのが今回の記事のテーマとなります。

RhinoCommon を触らないと出来ない処理というのにあまり直面する機会はあまり多くありませんでした。リファレンスを読むだけではぱっと見で意味がよくわからない引数があったり、フォーラムには似たようなことで代替できるかも?という少々的外れなデータもあったり、リファレンスやフォーラムを読んでは試してで書いていたので少し時間がかかってしまいました。。。

RhinoCommon とは

完璧に正しい説明ができる気がしないので、まずは下記の公式の情報を見てください。。。

RhinoCommon Guides developer.rhino3d.com

今回の記事を読む上では、C# コンポーネントや GhPython コンポーネントから、Rhino のほぼすべての機能にアクセスできる RhinoCommon を呼び出せるというざっくりな認識でも構いません(GH 内のスクリプトコンポーネント経由ではアクセスできない操作もあります)。

RhinoCommon Guides の中の What’s RhinoCommon を読むと、2011年に Grasshopper が RhinoCommon で書き直されたと書かれていますが、RhinoCommon の中で頻繁に利用?されそうな機能が、ノンプログラマにも使いやすい VPL の形で Grasshopper として実装されているという状態なのではと僕は認識しています(間違っていたらごめんなさい)。

Rhino にはあるが Grasshopper のコンポーネントには存在しない機能であっても、RhinoCommon を呼び出すことでそれに準ずる機能を使うことができる(場合もある)という雑な説明で次に進ませてください。

また、GhPython では、rhinoscriptsyntax を書いているサンプルもありますが、rhinoscriptsyntax では古の RhinoScript と同じような構文をサポートしながら、内部の処理としては RhinoCommon を呼び出しています。より低レベルで様々なことにアクセスできる RhinoCommon の方が本当に痒いところに手が届くので、今回のような「あの機能が見当たらないので自分で書くか」というシーンでは RhinoCommon を探すのが安パイかなと思います。

最近書いたものをいくつか紹介

直近いくつかのプロジェクトで、この操作は Grasshopper で出来ないので諦めて Rhino でやるか → やっぱりそれは面倒なので RhinoCommon 調べる、ということが何度もありました。その中で作成した RhinoCommon 呼び出し例を紹介します。

動作環境は下記の通りです。
Windows10
Rhinoceros 7
Grasshopper 1.0.0007
(筆者が使い慣れているという理由でここでは GhPython で書いていますが、C# でも同様のことができます)

Reference はこちら

RhinoCommon API
https://developer.rhino3d.com/api/rhinocommon/

Extend Surface

オブジェクトを切ったり交差の位置を求めたりする際に、面を少し広げたいなというときがあります。

Surface.Extend method
https://developer.rhino3d.com/api/rhinocommon/rhino.geometry.surface/extend

※ ExtendSrf は、元々定義された形状を復元(Untrim)しているわけではなく元々は存在しないものを作っているので、延長によって作りたい形状を正確に作れるのかという点に関しては注意が必要です。

Blend Surface

頻度としては少ないですが、ライノの BlendSrf のように連続性を指定した補間で隙間を埋めたいというときがあります。

Brep.CreateBlendSurface method
https://developer.rhino3d.com/api/rhinocommon/rhino.geometry.brep/createblendsurface

※ サーフェスとサーフェスの間に補間で新たなサーフェスを作成するので、モデリングの意図としてこれが最適かどうかは確認が必要です。Chamfer や Fillet で作る方が寸法を押さえることができるのでそちらを使うことが多いです。

OffsetSrf のソリッド作成

モデリングの作業の中で(ポリ)サーフェスをオフセットしてソリッドを作りたいというときがあります。

(ポリ)サーフェスのオフセットでは下記のような観点があります。

  • サーフェスのみ or ポリサーフェスも対応
  • ソリッドにする or ソリッドにしない
  • ソリッドにした時に一体でソリッド化する or 一体ではソリッド化しない

最近のプロジェクトでは、ポリサーフェスをソリッドにする、一体でソリッド化したいというシーンがありました。

純正コンポーネント OffsetSurface では、ソリッド化が出来ません。 Pufferfish の OffsetSurface コンポーネントでは、図の下のようにそれぞれの面がそれぞれオフセットされ、これでは不十分でした。

有りものでなんとかできないと見切りをつけて、RhinoCommon を調べてみるとこんな感じのものがありました。

CreateOffsetBrep method https://developer.rhino3d.com/api/rhinocommon/rhino.geometry.brep/createoffsetbrep

RhinoCommon を呼び出して実行してみると、ポリサーフェスを一体でソリッド化することができました。

ちなみに、後で他のスタッフに聞いたところ、Sasqutch の OffsetBrep コンポーネントも同じことができるようです。こちらではコーナーの形状を決めることができるので Rhino の OffsetSrf の挙動に近いです。

これらのデータは Github にあげておきます。API 呼び出しを1行書いただけなのでライセンスはつけていません。どうぞご自由に。(これって適切でしょうか? <<< 有識者の人いたらコメントで教えてください)。 ライセンス無しという状態はよろしくないですという指摘を頂いたので MIT としています(H 様、ご指摘ありがとう誤差いました)。

github.com

まとめ

今回の記事では、最近書いた RhinoCommon 呼び出しの例を紹介しました。API のリファレンスを検索するとそれっぽいものが実装されていることが多いですし(Rhino で出来る処理を探せばそれはそうです)、フォーラムで検索をするとリファレンスへのリンクや実装済みの GH ファイルも落ちています。汎用の機能っぽいもので自分が欲しいものは、同様に他の人も欲しいものなのだと感じます。また、この手のものは貯まっていくと便利な資産となるのであきらめずにちゃんと動くものを書いていきたいなと思います。

ということで、吉岡手元のデータからいくつか紹介しましたが、同業の皆さんもおすすめ RhinoCommon があれば教えていただけると嬉しいです。

さて、Value の1つとして We are cheerful explorer. を掲げている vicc では、多量な情報があるリファレンスや玉石混交な情報が飛び交うフォーラムにて、自分の欲しい情報を諦めずに探すことも楽しめるエンジニアを募集しています。興味を持たれた方は下記よりお問い合わせください。

vicc.jp

終わり