On this page |
概要 ¶
このサンプルは、オブジェクトノードでトランスフォーメーションを取得して設定する方法を示しています。
トランスフォームの取得と設定 ¶
-
$HFS/houdini/help/files/obj_xform.hip
を開きます。ファイルには、トランスフォーメーションの階層にまとめてつながれた一連のボックスが含まれています。 チェーンの中間でボックスオブジェクトを移動して回転させ、そのボックスの出力がトランスフォーメーションを継承するかどうかを確認することができます。
-
Window ▸ Python Shell を選択して、以下のステートメントをタイプした時に、ビューアとネットワークエディタで
box_object4
に対して起こる影響を観察します:# /obj/box_object4に対するhou.ObjNodeをPythonの変数内に保存します。 >>> box_object4 = hou.node("/obj/box_object4") >>> box_object4 <hou.ObjNode of type geo at /obj/box_object4> # box_object4のワールドトランスフォーメーションを求めます。このトランスフォーメーションマトリックスには、 # (オブジェクトの移動、回転、スケールなどのパラメータにより決まる) # parmトランスフォーメーション, プリトランスフォーメーション, # 親トランスフォーメーション, 含まれているオブジェクトでのトランスフォーメーションなどが含まれます。 >>> xform = box_object4.worldTransform() >>> xform <hou.Matrix4 [[0.942106, -0.147233, -0.301261, 0], [0.134676, 0.988938, -0.062158, 0], [0.3070 8, 0.017987, 0.951514, 0], [-5.04816, -0.769449, -9.42593, 1]]> # box_object4の入力を切断します。box_object4は、 # もはやその入力のトランスフォーメーションを継承していないため、移動します。この新しいトランスフォーメーションマトリックスをプリントアウトすると、 # その差異がわかります。 >>> box_object4.inputs() (<hou.ObjNode of type geo at /obj/box_object3>,) >>> box_object4.setFirstInput(None) >>> box_object4.inputs() () >>> box_object4.worldTranform() <hou.Matrix4 [[0.966956, 0, 0.254942, 0], [0, 1, 0, 0], [-0.254942, 0, 0.966956, 0], [0.885497 , 0, -3.01977, 1]]> # box_object4のトランスフォーメーションをその以前の値に戻します。 # その入力を切断したままにしておくため、親子化を解除しておきますが、その位置は維持します。 # setWorldTransformは、オブジェクトパラメータを調整して、 # 入力やプリトランスフォームなどから構成された望ましい最終結果を取得します。 >>> box_object4.setWorldTransform(xform)
シェルフツールの作成 ¶
次に、ノードの親子化を解除して、その位置をシェルフツールの関数内へ維持するロジックを置きます。
-
$HFS/houdini/help/files/obj_xform.hip
をリロードして、シーンをリセットします。 -
シェルフの空白領域をで右クリックして、 New Tool を選び、そのツールに“Unparent”という名前をつけます。以下を Script タブにペーストします。
def unparentAndKeepPos(obj_node): """ オブジェクトノードの親子化を解除しますが、 親子化された時と同じ位置のままにします。 """ xform = obj_node.worldTransform() obj_node.setFirstInput(None) obj_node.setWorldTransform(xform) unparentAndKeepPos(hou.node("/obj/box_object4"))
-
シェルフのツールをクリックして、位置を変えずに
box_object4
の親子化を解除します。
シェルフツールの一般化 ¶
次に、シェルフツールを、box_object4
の親子化を解除するためにハードコード化するのではなく、一般化して、選択したノードで機能するようにします。
-
Unparentシェルフツールを右クリックして、 Edit Tool を選択します。
-
以下を Script タブにペーストします。
# Houdiniに含まれているtoolutilsモジュールにより、 # 共通のシェルフツールオペレーションを実行します。これは、$HFS/houdini/python2.7libsにあります。 import toolutils def unparentAndKeepPos(obj_node): """ オブジェクトノードの親子化を解除しますが、 親子化された時と同じ位置のままにします。 """ xform = obj_node.worldTransform() obj_node.setFirstInput(None) obj_node.setWorldTransform(xform) # オブジェクトが既に選択されている場合は、それを使用します。何も選択されていない場合は、 # 何かを選択するようにユーザを促します。複数のオブジェクトが選択されている場合、 # パラメータペインのコンテンツに対応する必要があるため、 # 最後のオブジェクトを使用します。 viewer = toolutils.sceneViewer() obj_node = viewer.selectObjects(quick_select=True)[-1] unparentAndKeepPos(obj_node)
選択ノードの再親子化 ¶
最後に、選択したノードを再親子化する別のシェルフツールを作成し、新しい親ノードとしてユーザに指示します。
-
シェルフの空白領域をで右クリックして、 New Tool を選び、そのツールに“Reparent”という名前をつけます。以下を Script タブにペーストします:
# Houdiniに含まれているtoolutilsモジュールにより、 # 共通のシェルフツールオペレーションを実行します。 import toolutils def parentAndKeepPos(obj_node, new_parent)にあります: """ オブジェクトノードをペアレント化しますが、 ペアレント化を解除した時と同じ位置のままにします。 """ xform = obj_node.worldTransform() obj_node.setFirstInput(new_parent) obj_node.setWorldTransform(xform) # オブジェクトを選択して、親子化解除ツールが働くのと同じ方法で再親子化します。 # ビューアで新しい親を選択するようにユーザを促します。 viewer = toolutils.sceneViewer() node_to_reparent = viewer.selectObjects(quick_select=True)[-1] new_parent = viewer.selectObjects(use_existing_selection=False, quick_select=True, prompt="Select new parent node")[-1] parentAndKeepPos(node_to_reparent, new_parent)