On this page |
概要
Drawableオブジェクトでは、ジオメトリをビューアに取り付けることができるので、そのジオメトリが実際にはシーンの一部でなかったとしてもビューア内でそのジオメトリが表示されます。 これは、カスタムPythonステートで ガイドジオメトリ を表示するのに役立ちます。
import hou # 空っぽのジオメトリオブジェクトを作成します。 geo = hou.Geometry() # BoxノードからVerb(動詞)を取得します。 box_verb = hou.sopNodeTypeCategory().nodeVerb("box") # そのVerbのパラメータを設定します。 box_verb.setParms({ "t": hou.Vector3(0.5, 0.5, -0.5), "scale": 0.5, }) # そのVerbを実行して、その出力をジオメトリオブジェクトに格納します。 box_verb.execute(geo, []) # ビューアの参照を取得します。 scene_viewer = hou.ui.paneTabOfType(hou.paneTabType.SceneViewer) # Drawableオブジェクトを作成します。 drawable = hou.Drawable(scene_viewer, geo, "my_guide") # Drawableの表示モードをワイヤーフレームに設定します(これがデフォルトです)。 drawable.setDisplayMode(hou.drawableDisplayMode.WireframeMode) # Drawableジオメトリを有効にして表示します。 drawable.enable(True) drawable.show(True) # ビューをタンブルしてジオメトリを確認します。
import hou # Sphereノードからジオメトリを作成します。 sphere_verb = hou.sopNodeTypeCategory().nodeVerb("sphere") geo = hou.Geometry() sphere_verb.execute(geo, []) # その球にカラーとアルファのアトリビュートを追加します。 color_attrib = geo.addAttrib(hou.attribType.Prim, "Cd", (1.0, 1.0, 1.0)) alpha_attrib = geo.addAttrib(hou.attribType.Prim, "Alpha", 1.0) color = hou.Color(1.0, 0.0, 0.0) for prim in geo.prims(): prim.setAttribValue(color_attrib, color.rgb()) prim.setAttribValue(alpha_attrib, 0.7) # Drawableオブジェクトを作成します。 scene_viewer = hou.ui.paneTabOfType(hou.paneTabType.SceneViewer) drawable = hou.Drawable(scene_viewer, geo, "my_sphere") # 現在のビューポートのシェーディングモードでDrawableの表示モードを設定します。 drawable.setDisplayMode(hou.drawableDisplayMode.CurrentViewportMode) # 球のサイズを設定します。 drawable.setTransform(hou.hmath.buildScale(0.5, 0.5, 0.5)) drawable.enable(True) drawable.show(True)
Tipsとメモ
-
Drawableオブジェクトは、渡したジオメトリオブジェクトの参照を維持します。そのジオメトリオブジェクトの内容を変更することで、次回でビューアが再描画されると、その新しい内容で描画することができます。
-
Drawableオブジェクトを作成すると、そのオブジェクトが無効化されて非表示になります。ジオメトリを表示させるには、
enable(True)
をコールしてから、show(True)
をコールする必要があります。 -
Drawableオブジェクトを有効化して表示させた後でも、Drawableジオメトリは次回で再描画するまで(例えば、ユーザーがビューを変更するまで)ビューア内に表示されません。
hou.GeometryViewport.draw()を使用することで、個々にビューポートを強制的に再描画させることができます。
scene_viewer.curViewport().draw()
-
Verbを使用すればゼロからジオメトリオブジェクトの内容を生成することができます。または、hou.SopNode.geometry()を使用することでSOPノードの出力のコピーを取得することができます。
-
hou.drawablePrimitiveを使って
ビルトイン
形状を指定する方法でも、Drawableオブジェクトの内容を生成することができます。 -
Drawableオブジェクトの
enable
/disable
はパフォーマンスに影響します。特に大きなジオメトリがそうです。Drawableオブジェクトの表示/非表示はenalbe
ではなくshow
を使用するのが良いでしょう。 -
Drawableオブジェクトをビューア内でアクティブに使用しない時には
disable
にするのも良いでしょう。 -
Drawableオブジェクトは、それを
disable
にしない限り、または、削除しない限りビューア内で表示されます。このオブジェクトの参照がない場合、Pythonはガーベジコレクション中に自動的にそれを削除するので、そのガイドジオメトリが消えます。つまり、表示を続けるにはオブジェクトのライブ参照を維持する必要があります。カスタムステートでDrawableオブジェクトを使ってガイドジオメトリを描画する場合、一般的には、ステート実装オブジェクトに対してそのDrawableオブジェクトの参照を保存します。
メソッド
__init__(scene_viewer, geometry, name)
ビューポート内でジオメトリを描画するためのDrawableオブジェクトを作成します。 この新しいDrawableオブジェクトはデフォルトでは非表示で無効化されています。
scene_viewer
ガイドジオメトリを表示するビューアのhou.SceneViewer参照。
geometry
描画するジオメトリを含んだhou.Geometryオブジェクト、または、描画する形状を指定したhou.drawablePrimitive値。
name
このDrawableオブジェクトを識別するための文字列。ここには、現行セッション内のすべてのDrawableオブジェクトに対して固有の文字列を指定してください。
カスタムステートでは、Drawableオブジェクトの名前とステート名に基づいて固有性を担保することができます。例:
class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer geo = hou.Geometry() verb = hou.sopNodeTypeCategory().nodeVerb("box") verb.execute(geo, []) self._box = hou.Drawable( self.scene_viewer, geo, # Drawableオブジェクトの名前のベースとしてステート名を使用します。 self.state_name + "_box" )
name()
このDrawableオブジェクトの名前。
enable(self,value)
ジオメトリの描画を有効化または無効化します。
value
描画を有効化するならTrue
、無効化するならFalse
。
show(value)
ビューポート内にジオメトリを表示または非表示にします。まず最初にオブジェクトを有効化しなければなりません。ビューアが再描画された時にそのオブジェクトが表示されます。
value
ジオメトリを表示するにはTrue
、非表示にするにはFalse
。
setTransform(xform)
ジオメトリのトランスフォーム行列を設定します。この変更はビューアが再描画された時に反映されます。
xform
ジオメトリの移動、回転、スケールを設定するためのhou.Matrix4トランスフォーム行列。
setWireframeColor(color)
Drawableオブジェクトの表示モードがhou.drawableDisplayMode.WireframeModeに設定されている時のそのジオメトリのカラーを更新します。この変更はビューアが再描画された時に反映されます。
color
原色を指定するためのhou.Color値。