複雑形状建築を構成する部材は3Dモデル上では直交座標系の座標軸方向から外れた様々な方向を向きながら適当な位置に浮遊しています。
Rhino+GHで部材単品図を作成する際などには部材に正対した視点を取得するために、部材を座標系の原点付近まで平行移動させ部材軸が座標軸に平行または垂直となるように回転させる、つまり行列計算によってローカル平面からワールド平面にオブジェクトを変換<トランスフォーム>する作業を行うことがあります。
Grasshopperで毎回オブジェクトの面を抽出してからローカル平面を取り出してもいいですが、フィジカルな処理が重かったり後々Brepの位相が変わって面のリストが変わるなど問題が発生するかもしれません。
そこで今回はローカル平面の情報を変換行列としてテキスト化してオブジェクトに保持させる方法、またそのテキスト情報を読み取って変換行列を復元しオブジェクトをワールド平面に変換させる方法を紹介したいと思います。
※本稿ではRhinoのワールド座標系における原点周りの平面をワールド平面、オブジェクト周りの材軸方向に沿った平面をローカル平面と呼んでいます。あるオブジェクトに対してどのようにローカル平面を設定するかは自由です。
ローカル平面の情報を変換行列としてテキスト化してオブジェクトに保持させる
まずは適当な方向を向いて浮遊するオブジェクトのローカル平面を作成します。
次にローカル平面をOrientコンポーネントのインプットBに接続してワールド平面→ローカル平面の変換行列を作成します。
作成した変換行列をFormatコンポーネントに通して実数表示のテキストに変換します。
実数表示などのFormatコンポーネントの便利な使い方は下記が参考になります。
最後にテキスト化した変換行列をユーザーテキストとしてオブジェクトに保持させます。
テキスト情報を読み取って変換行列を復元しオブジェクトをワールド平面に変換させる
オブジェクトが持つ変換行列のテキスト情報を読み取り、正規表現を利用した文字列処理によりトランスフォーム型に復元します。
復元した行列はワールド平面→ローカル平面の変換行列なので、変換を反転してローカル平面→ワールド平面の変換をオブジェクトに適用させます。
メモ
今回はワールド平面→ローカル平面の変換行列をユーザーテキストとして保持するためにFormatコンポーネントからのアウトプットをそのまま使用しましたが、4×4の成分の値をカンマで繋いだだけの情報に整理したりすることで視認性が改善されたりGrasshopperの適当なコンポーネントの組み合わせだけで誰でもすぐに処理できるようになるなど、工夫の余地があります。
また、変換行列ではなくローカル平面そのものの原点・Xベクトル・Yベクトルをそれぞれユーザーテキストとして保持するというやり方もあります。この方法はローカル平面の復元のために文字列処理の必要が無い、基底ベクトルの情報を直接参照できる、視認性が良いといったメリットがある一方、ユーザーテキストの組が増えてしまうという側面もあります。
※変換行列の成分の値やローカル平面の座標の値の桁数を不用意に丸めると復元の際の誤差が大きくなってしまうため気を付けてください。