XformChangeBasisとTransformObjectで作業平面を置き換える方法|Grasshopper Python × RhinoScriptSyntax入門

RhinoScriptSyntax GHPython
XformChangeBasis
TransformObject

XformChangeBasis関数とTransformObject関数で、作業平面を置き換えることができます。

本記事のGrasshopperファイルのダウンロードはこちら

斜めにスケール変更

例としてScaleObject関数では、作業平面ではなく、座標をスケール変更の中心とするため、X軸、Y軸、Z軸方向にしかスケール変更ができません。

斜めの方向にスケールを変えたりしたい場合、通常の方法ではできません。

そのような場合に、作業平面を置き換えることで、上の画像のように、自由な方向にスケールを変えたりすることができるようになります。

コード

使用コンポーネント 1: Python 3 Script 2: Brep 3: Plane

import rhinoscriptsyntax as rs
# RhinoをPythonから操作するためのライブラリを読み込む

corner_pts = [(0,0,0),(10,0,0),(10,10,0),(0,10,0),(0,0,10),(10,0,10),(10,10,10),(0,10,10)]
# 直方体を構成する8つの頂点座標を定義

box = rs.AddBox(corner_pts)
# 8つの頂点を使って直方体を作成する

box_copy = rs.CopyObject(box)
# 元のボックスをコピーする

origin = (0,0,0)
# 平面の基準となる原点を定義

xaxis = (1,0,1)
# 平面のX方向を表すベクトルを定義
yaxis = (0,1,0)
# 平面のY方向を表すベクトルを定義

plane = rs.PlaneFromFrame(origin, xaxis, yaxis)
# 原点とX・Y方向ベクトルを使って基準平面を作成する

to_world = rs.XformChangeBasis(rs.WorldXYPlane(), plane)
# WorldXY平面から、作成した平面への変換情報を作成する

rs.TransformObject(box_copy, to_world)
# コピーしたボックスを、作成した平面基準へ変換する

rs.ScaleObject(box_copy, origin, (2,1,1))
# 平面基準の状態で、X方向のみ2倍にスケールする

from_world = rs.XformChangeBasis(plane, rs.WorldXYPlane())
# 作成した平面から、WorldXY平面へ戻すための変換情報を作成する

scaled_box = rs.TransformObject(box_copy, from_world)
# スケール後のボックスを元の座標系へ戻す

Python 3 Script」には、上記のコードが記載されています。

順番に、コードの解説をしていきます。

corner_pts = [(0,0,0),(10,0,0),(10,10,0),(0,10,0),(0,0,10),(10,0,10),(10,10,10),(0,10,10)]

corner_pts = […] では、ボックスを構成する8つの頂点座標を、リストで定義しています。

リストに関してはこちら

下側4点と上側4点を指定することで、ボックスの形状を決めています。

box = rs.AddBox(corner_pts)

AddBox 関数で、定義した8つの頂点を使って、ボックスを作成します。

box_copy = rs.CopyObject(box)

CopyObject 関数で、元のボックスをコピーしています。

今回は、元の形状を残したまま変形を行うため、コピーしたオブジェクトを使用しています。

origin = (0,0,0)

origin = (0,0,0) では、基準となる原点座標を定義しています。

平面作成やスケールの基準点として使用します。

xaxis = (1,0,1)
yaxis = (0,1,0)

xaxis = (1,0,1) は、平面のX方向を表すベクトル、yaxis = (0,1,0) は、平面のY方向を表すベクトルを定義しています。

(1,0,1) とZ方向にも値を持たせることで、傾いた方向を設定しています。

plane = rs.PlaneFromFrame(origin, xaxis, yaxis)

PlaneFromFrame 関数で、原点とX・Y方向ベクトルを使って、基準となる作業平面を作成します。

今回の場合は、傾いた作業平面を作成することができます。

to_world = rs.XformChangeBasis(rs.WorldXYPlane(), plane)

XformChangeBasis 関数で、現在のデフォルトのWorldXY平面から、作成した平面へ変換するための変換情報を作成しています。

第一引数には、現在の作業平面の情報、第二引数には、変換先の作業平面を指定します。

第一引数の rs.WorldXYPlane() 関数は、デフォルトのXY作業平面を作成しています。

rs.TransformObject(box_copy, to_world)

TransformObject 関数で、コピーしたボックスに変換した作業平面を適用しています。

これにより、コピーしたボックスが、作成した平面基準の座標系へ移動・変換されます。

rs.ScaleObject(box_copy, origin, (2,1,1))

ScaleObject 関数で、変換後の作業平面の座標系を基準に、ボックスのスケールを変換しています。

(2,1,1) は、X方向のみ2倍に拡大し、Y・Z方向はそのままにする設定です。

from_world = rs.XformChangeBasis(plane, rs.WorldXYPlane())

もう一度 XformChangeBasis 関数を使い、作成した平面から、元のWorldXY平面へ戻すための変換情報を作成しています。

元に戻すため、1回目と第一引数と第二引数を入れ替えています。

scaled_box = rs.TransformObject(box_copy, from_world)

もう一度 TransformObject 関数で、スケール後のボックスを、元の座標系へ戻しています。

これにより、傾いた平面を基準に変形した形状を配置できます。

Python 3 Script」の右側の端子名を「box」に設定するとスケール変更前のボックスデータ、「plane」に設定すると変更後の作業平面のデータ、「scaled_box」に設定するとスケール変更後のボックスデータがGH上に出力されます。

Comment

Translate »