三日月館【別館】開発・制作Tips集

[NUKE] Pythonで3Dオブジェクトの頂点位置を取得する

最終更新:

fumiduki1985

- view
管理者のみ編集可
PythonGeoノードを利用することで、Pythonスクリプトからも3Dオブジェクトの頂点位置の情報を取得することが可能。
PythonGeoノードはNUKEのノードリファレンスにも説明が無く、使い方はウェブのコミュニティの記述と経験則に基づく。

[2017/07/12追記]
PythonGeoNodeのsetInput()は、接続したいノードが3Dオブジェクトを出力しないノード(例えばCameraノードやScanlineRendererノード、Transformノード等)だった場合は、Falseを返す。
接続ノードが不特定の場合は、戻り値を確認すべき。

また、PythonGeoノードのinputに繋ぐノードがSceneノードやMergeGeoノードの効果で複数のジオメトリを持っていた場合、PythonGeoノードの'geo'KnobのgetGeometry()が返すリストの各要素にそれぞれのジオメトリの情報が格納される。

記述例も上記を反映するよう修正した。

[2017/08/09追記]
PythonGeoノードのinputに繋ぐノードが無効状態(disableパラメータがオフ)だった場合、'geo'KnobのgetGeometry()実行時にNUKEがクラッシュする現象を確認した。
inputに繋ぐノードが有効状態である保障が無い場合、有効状態チェックを入れるべき。

記述例:
import nuke

targetNode = nuke.toNode('Card1')  # 頂点位置を取得したい3Dオブジェクトのノードを取得

pythonGeoNode = nuke.nodes.PythonGeo()  # PythonGeoノードの作成

# 処理対象のノードをPythonGeoノードに接続
# (targetNodeが3Dオブジェクトを出力しないノードの場合はFalseを返す。
# targetNodeが不特定の場合は、戻り値を確認すべき。
# また、targetNodeが無効状態の場合、後述のgetGeomtry()でNUKEがクラッシュするため、
# 状態を確認すべき。)
pythonGeoNode.setInput(0, targetNode)  

# ジオメトリのリストを取得する
# SceneノードやMergeGeoノードの効果でtargetNodeが複数のジオメトリを持っていた場合、
# リストの各要素にそれぞれのジオメトリの情報が格納されている。
geometryList = pythonGeoNode['geo'].getGeometry()

for geometry in geometryList:
  positionList = geometry.points()  # 頂点位置リストを取得 [x0,y0,z0,x1,y1,z1,x2,...]というリストを取得できる
  print positionList


このページのタグ一覧
NUKE Python プログラミング

記事メニュー
ウィキ募集バナー