SurfaceNormalSurfaceNormal関数で、サーフェスの法線ベクトルを取得することができます。
本記事のGrasshopperファイルのダウンロードはこちら

今回は、上の画像のように、サーフェスの法線ベクトルを取得します。

使用コンポーネント 1: Python 3 Script 2: Surface 3: Vector 4: Point 5: Vector Display
import rhinoscriptsyntax as rs
# RhinoをPythonから操作するためのライブラリを読み込む
pts = [(0,0,0),(10,0,5),(10,10,0),(0,10,5)]
# サーフェスを作成するための4点座標を定義
surface = rs.AddSrfPt(pts)
# 4点を使ってサーフェス(面)を作成する
domainU = rs.SurfaceDomain(surface, 0)
# サーフェスのU方向のドメイン範囲を取得する
domainV = rs.SurfaceDomain(surface, 1)
# サーフェスのV方向のドメイン範囲を取得する
u_norm = 0.2
# U方向の正規化された位置を定義(0〜1の範囲)
v_norm = 0.2
# V方向の正規化された位置を定義(0〜1の範囲)
u = domainU[0] + u_norm * (domainU[1] - domainU[0])
# 正規化した値を、実際のU方向のパラメータ範囲へ変換する
v = domainV[0] + v_norm * (domainV[1] - domainV[0])
# 正規化した値を、実際のV方向のパラメータ範囲へ変換する
surface_normal = rs.SurfaceNormal(surface, (u, v))
# 指定したUV位置の法線ベクトルを取得する
point = rs.SurfaceEvaluate(surface, (u, v), 0)
# 指定したUV位置の点座標を取得する「Python 3 Script」には、上記のコードが記載されています。
import rhinoscriptsyntax as rs から v = domainV[0] + v_norm * (domainV[1] - domainV[0]) までは、前回記事と内容は一緒になります。
そのため、該当部分は、前回記事を参考にお願いします。
順番に、残りのコードの解説をしていきます。
surface_normal = rs.SurfaceNormal(surface, (u, v))SurfaceNormal 関数で、指定したUV位置の法線ベクトルを取得しています。
第1引数には、サーフェスデータを指定します。
第2引数では、U方向とV方向のパラメーターを指定します。
今回の場合、u = domainU[0] + u_norm * (domainU[1] - domainU[0]) と v = domainV[0] + v_norm * (domainV[1] - domainV[0]) で作成されるデータを指定しています。
point = rs.SurfaceEvaluate(surface, (u, v), 0)SurfaceEvaluate 関数では、指定したUV位置の点データを取得しています。
第1引数には、サーフェスデータを指定し、第2引数では、U方向とV方向のパラメーターを指定します。
第3引数に 0 を指定することで、点情報のみのデータを取得できます。
今回は、後程GH上でベクトルを可視化するために、この点を取得しています。
「Python 3 Script」の右側の端子名を「surface」に設定するとサーフェスデータ、「surface_normal」に設定すると法線のベクトルデータ、「point」に設定すると点データがGH上に出力されます。
Vector Displayコンポーネントを使うことで、ベクトルを可視化することができます。




Comment