2014年6月26日木曜日

[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の値を変える事で、オーバーラップの位置を変える事が出来ます。

2014年6月12日木曜日

Grasshopperによるシミュレーション

NBBJのコンピュータースペシァリスト、Andrew Heumann氏が、Grashopperの使用例をビデオで公開しています。
このビデオでは、シアトルに新しいビルを建てた場合、特定の場所から(例えば、スペースニードル)どのようにそのビルが見えるかをシミュレーションするもの。
Grasshopperを日常のツールとして使用する様子が見て取れます。




2014年6月6日金曜日

[t]と[U]と[V]と[Reparameterize]とは

Q1.3次元カーブで言われる、[t]パラメーターとは何ですか?

A.3次元カーブの始点から終点までの間の任意の地点を表す変数です。
NURBS等の数学的な曲面表現による3次元カーブは、一つの変数[t]パラメーターの次数と、3次元カーブを構成する制御点の数と位置、制御点におけるウェイトの値で、カーブの形状が定義されます。つまり、その形状は、3次元カーブのパラメーター[t]の変化の軌跡と考えることができます。
[t]パラメーターは、始点から終点に対して、増加する変数で、増加する値であればどのような範囲を持っても良いですが、始点を[0]、終点を[1]と決めてしまう事により全てのカーブに対して同一の範囲を適用することができます。
この操作を、後述する[Reparameterize:リパラメタライズ](正規化)と呼びます。

[Reparameterize]を行なった場合、ある3次元カーブ上の点の座標を指定したい場合は、その3次元カーブを表す方程式の[t]の部分に[0]を代入すると始点が、[1]を代入すれば終点が、[0.5]を代入すれば3次元カーブの中間地点(長さの中間値点ではない)の座標が得られます。
[Reparameterize]を行なった例
[0]で始点の、[1]で終点の座標を示しています。

[Reparameterize]を行なっていない例
[0]で始点の座標を示してはいますが、[1]ではバラバラの座標を示しています。


3次元カーブが持つ始点から終点に向かう曲線方向は、Rhino上で[Dir]コマンドを使用する事で、確認と変更を行なえます。
[Dir]コマンドで3次元カーブの方向を表示させた図


Q2.3次元サーフェスで言われる、[U]パラメーター[V]パラメーターとは何ですか? 

A. どちらも3次元サーフェス上の任意の地点を表す変数です。
3次元カーブが[t]パラメーターという一つの変数で表現される様に、3次元サーフェスは、同じ性質をもつ[U]パラメーターと[V]パラメーターという2つの変数で表現されます。
3次元サーフェスは内部に、[UVパラメーター曲線]という2次元の矩形領域を持ちますが、このとき、U方向とV方向は直交していれば良く、これらの方向がどの方向を向いているかは問題とはされません。
これらの方向は、[Dir]コマンドによって制御できます。
[Dir]コマンドでサーフェスの方向を表示した図
操作上、理解しやすくするためには、Rhino上の座標で、X方向にU方向、
Y方向にV方向を指定しておくと良いでしょう。

3次元カーブは、[t]の値の軌跡が3次元カーブとなりますが、3次元サーフェスの場合は、U方向とV方向の2つの3次元カーブの軌跡が、サーフェスを表現していると考えると良いでしょう。
3次元サーフェスの持つUV方向と3次元サーフェスのイメージ

Q.1で [t]に[0~1]を代入すると3次元カーブ上の任意の地点の座標が得られた様に、3次元サーフェスは[U]と[V]に[0~1]をそれぞれ代入する事でサーフェス上の任意の地点の座標が得られます。
[Reparameterize]を行なったサーフェスの任意の地点の座標を求めた図


Q3.[Reparameterize](正規化)とは何ですか?

A.[Reparameterize]とは「再定義する」という意味。この再定義を行なう事で、サイズや形状の異なるカーブやサーフェスを同一規格で扱える様になります。Grasshopperではこの[Reparameterize](正規化とも言う)を行なうと、どの様なカーブのパラメーター[t]も、始点を[0]、終点を[1]として再定義します。サーフェスの場合も、サーフェスは[U]方向と[V]方向にそれぞれ伸びたカーブが格子状に配置された物という認識が出来る為、[U]方向と[V]方向のカーブそれぞれのパラメーター[t]について、始点を[0]、終点を[1]として再定義する事で、カーブと同様に扱える様にしています。