Grasshopper: [Orient]コンポーネントを用いた、サーフェス法線方向にオブジェクトを配置する方法

Rhinoには[OrientOnSrf]という、オブジェクトをサーフェスの法線方向に沿って配置するコマンドがあります。これをGrasshopperで行なうにはどの様なコンポーネントを使用してどの様に配置すれば良いのか、今回はその一例を紹介します。

まず、配置するオブジェクトを作成し、[Brep]コンポーネントに割り当てます。

オブジェクトを作成する際は、配置するオブジェクトのどの部分を、オブジェクトの中心とするかを意識してモデリングします。

一番、簡単な方法は、下図の様にXY平面の原点に中心が来るように配置するオブジェクトを作成します。こうすれば、配置基準となる元の作業平面は、XY平面となります。

作成するオブジェクトがXY平面の原点にない場合、あるいは、任意の空間上に作成する場合は、次の手順で作成したオブジェクトの中心点を作業平面の原点として定義します。
・配置するオブジェクトのバウンディングボックスを取得するために[Bounding Box]コンポーネントに[Brep]を接続します。
・取得したバウンディングボックスの、どの地点を作業平面の原点とするかを指定する為に、[Evaluate Box]コンポーネントに[Bounding Box]を接続します。

※[Evaluate Box]コンポーネントは指定したBoxオブジェクトのUVW値に相当する点とその点を原点とした作業平面を出力します。
(U,V,W)が
(0.5,0.5,0.5)で、ボックスの中心:Default
(0.5,0.5,0.0)で、底面の中心
(0.5,0.5,1.0)で、上面の中心
の点を出力。

これでオブジェクトの中心点を原点とした作業平面を取得出来ました。
この作業平面が、オブジェクトを配置する際の方向や、位置の基準となります。

次にオブジェクトを配置するターゲットとなるサーフェスを作成し、[Srf]コンポーネントに割り当てます。
[Srf]コンポーネントはReparameterizeし、[Evaluate Surface]コンポーネントに接続して、配置したい位置の作業平面を、UV値を指定して取得します。

※[EvalSrf]コンポーネントは、サーフェスの指定したUV値の点と、法線ベクトル、そして指定した点でサーフェスに接する作業平面を出力します。

この[EvalSrf]で作成した作業平面のZ方向が、そのままその点における法線方向となります。

これで配置したいオブジェクト、配置する際の基準となる作業平面、配置先サーフェス上の作業平面の3つを用意出来ましたので、これらを[Orient]コンポーネントに以下の通りにそれぞれを接続する事で、オブジェクトをサーフェスの法線方向に沿って配置出来ます。
・[Orient]コンポーネントのG入力に、配置するオブジェクトを接続
・[Evaluate Box]コンポーネントのPl出力を、[Orient]のA入力へ接続
・[EvalSrf]コンポーネントの、F出力を、[Orient]のB入力へ接続

※[Orient]コンポーネントは、G入力に割り当てたオブジェクトを、B入力に割り当てた作業平面を基点として、A入力に割り当てた作業平面に再配置を行ないます。

[Orient]は再配置したいオブジェクトと基点となる作業平面との距離や角度を参照します。
その為、上記の例では、基点となる作業平面を、バウンディングボックスの中心点に設定しておりましたが、例えばバウンディングボックスのU,V,Wの値を0.5,0.5,0.0に設定した場合、下図の様に配置位置が変化します。

原点が中心点の位置の場合、配置したオブジェクトはサーフェスに半分程埋まっていますが、原点がバウンディングボックスの底面の中心の位置の場合、配置オブジェクトはサーフェスに埋まっていません。この様にWの値を変える事で、オーバーラップの位置を変える事が出来ます。