SurfaceNormalでサーフェスの法線ベクトルを取得する方法|Grasshopper Python × RhinoScriptSyntax入門

RhinoScriptSyntax GHPython
SurfaceNormal

SurfaceNormal関数で、サーフェスの法線ベクトルを取得することができます。

本記事の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

Translate »