CADのバックグラウンドには計算処理が当然あるわけですが、みなさんはその計算処理をどこまで信頼していますか?
ソフトウェアの開発者は、ユーザーを混乱させないために細かい処理を隠蔽します。この隠蔽されたものを一般にブラックボックスと呼びます。デザイナーは、扉モデルを回転させるときにアフィン変換という計算処理を知らなくとも良いわけです。
しかし、この処理が期待通りのものか分からないときに、冗長なワークフローを組んでしまうことがあると思います。
単純な建築モデリングを含めて、コンピュテーションにおいて、エレガントな方法というのはいくつか存在しますが、ブラックボックスの中にある計算処理に直接アクセスして簡潔にまとめるという方法がそのうちの一つだと考えます。この記事はそういった方法の実践のひとつにあたります。
今回、Grasshopperのコンポーネントをブラックボックスとして扱い、内部の計算処理をソースコードから確認し、アルゴリズムを改善する具体例を示すことで、ブラックボックスの中身を見る有用性を確認します。
ソースコードはC#で書かれていますが、初歩的なプログラミングの知識さえあれば十分記事を理解できるかと思います。
問題:正確な仕事のために冗長なモデリングになる
問題の設定
まず問題の設定です。適当なアルゴリズムでBrepをパラメトリックにモデリングします。一個一個の形状は少しずつ異なります。
ファイルは以下からダウンロード可能です。
パラメトリックにモデリングされたBrep
モデリングのためのアルゴリズム
次に、少しずつ形状が異なるBrepから、指定の場所にあるエッジを取り出します(下図)。
エッジを取り出すアルゴリズム(冗長)
ブラックボックスの中身をまったく考慮せずに取り出すとき、以下のようなアルゴリズムが想定されます。方法はほかにもあろうかと思いますが、エッジに関係する点のXYZ成分に関するアルゴリズムに落ち着くのでしょうか。
解決:ブラックボックスの中身を見ることでコンピュータを信頼し、簡潔にまとめる
アルゴリズムで作られるBrepはBrepJoinコンポーネントで作られているので*1、関係する以下のソースコードを確認しましょう。
確認しましたか?Forループで順番にJoinされていることが汲み取れると思います。
つまり、すべてのBrepに共通でフェイスが同じように繋げられることがわかるので、Brepのトポロジー*2もまた共通していることがわかります。
したがって、指定のエッジを取り出すには以下のコンポーネントの並びだけで十分だと考えます。
さきほど確認したアルゴリズムと比較してもかなり短くなったことがわかると思います。
いずれも幾何学的な着想に基づきますが、簡潔な方はトポロジーを、冗長な方は3D空間を見ています。
建築モデリングにおいて3D空間を見ることが多いので、必ずしも簡潔な方が役立つというわけではありませんが、ぜひここぞというときにこの知識を引き出していただくと良いと思います。
おわりに
今回は普段利用している計算処理に対して一歩踏み込んでみました。
ヴィックでは、さまざまなアプローチで問題解決に取り組んでいます。何か直面している問題があれば、ぜひ一度お問い合わせください。