8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Houdiniの中のPython

Houdini Apprentice Advent Calendar 2023が空きまくってるので書いてみました。

HoudiniもめでたくさっくりPython3系に移行出来ましたし
今回はHoudiniの中のどの辺りでPythonが使えるのか見てみましょう。

シェルフのボタンのPython

画面左上にシェルフがあってボタンがずらっと並んでますよね。
あそこのボタンは実は中身がPythonなんです。
CreateタブのBoxを右クリックしてEdit Tool...を選んでみると
image.png
image.png
こんな風にPythonがボタンに仕込まれています。

自分のシェルフを作りたかったら+ボタンを押してNew Shelf Tabで新しくシェルフタブを追加できます。
image.png
適当に名前を付けてシェルフタブを作ります。
image.png

image.png

このシェルフタブにいろいろ登録出来ます。
例えばこういう手で組むと微妙に時間がかかるけどHDAにするほどでもないしhipとして保存して
Houdiniを同時に開いておいてコピー&ペーストするのめんどくさいけどそこそこ頻繁に似たようなの組んじゃうなんていう中途半端なノードネットワークがあったとします。

image.png

これらのノードをまとめてドラッグすると
image.png
こんなダイアログが出るのでボタンの名前を決めてAcceptを押すと
image.png

こんなボタンが出来ます。
image.png

押すとドラッグしたノードネットワークと同じものが生成されます。
image.png

ボタンの中身を見てみると
image.png
Pythonが記述されています。
厳密にはHScriptが下の方で文字列として表記してあってそれが実行されている感じなんですけどね。

他にもシェルフ上の何もない所で右クリックして先にボタンだけ作っておいて
image.png

MantraのレンダリングのボタンをドラッグするとそのUIを表すPythonが記述されるので
image.png

そこに .pressButton() を追加しておくと順々に実行してくれるボタンが作れます。
image.png

PythonSOP

次はジオメトリコンテキスト内で呼び出せるPythonSOPです。
最初は何を書いたら良いか分からないどういう風に書いたらいいか分からないという方も
いらっしゃると思いますが右上の下向きの三角を押すといくつかのスニペットが用意されていますので
まずはそれを見てどんな風に書けるのか確認してみると良いでしょう。
image.png

例えば Move Points Up ではどんな風に各ポイントや座標にアクセスすればいいかの例が見れます。
image.png

wrangleと違って処理の速度はそんなに速くはないですが様々なモジュール群を活用できるので
やれることの幅が広がります。

PythonSOPではわざわざimportしなくても使える houモジュールのドキュメント も参考に
いろいろ書いてみると面白いでしょう。
例えばgridSOPのpointのCdアトリビュートを画像として吐き出す様なコードも簡単に書けます。

import hou
from PIL import Image
node = hou.pwd()

ySize = hou.evalParm('../baseGrid/rows')
xSize = hou.evalParm('../baseGrid/cols')
colorBaseR = hou.evalParm('../initRGB/basecolr')
colorBaseG = hou.evalParm('../initRGB/basecolg')
colorBaseB = hou.evalParm('../initRGB/basecolb')
baseR = int( 255*colorBaseR )
baseG = int( 255*colorBaseG )
baseB = int( 255*colorBaseB )
base = (baseR,baseG,baseB)
img = Image.new("RGB",(xSize,ySize),base)
pixels = img.load()

geo = node.geometry()

for num,point in enumerate( geo.points() ):
    col = point.attribValue("Cd")
    colR = int( col[0]*255 )
    colG = int( col[1]*255 )
    colB = int( col[2]*255 )
    
    pixels[ num%xSize, int(num/xSize) ] = (colR,colG,colB)
rimg = img.rotate(180)
rimg.save(hou.evalParm('./outputimage'))

ただPythonSOPでこれ書いちゃうとSOPをクリックしたタイミングで実行されたりするので
HDAのコールバック関数とかで書いた方が無難ですね。

Pythonでエクスプレッション

よくbboxやcentroidなどパラメータのところに使う関数がありますがあれが
エクスプレッション関数 とよばれるやつです。
image.png
普通はこの緑色のエクスプレッションになります。
(※パラメータの所をクリックすると数値とエクスプレッションの表記がトグルされます。)
これがHScriptエクスプレッションと呼ばれるものです。
ここのエクスプレッションの表記方法をPythonに切り替えることも出来ます。
詳しくは ここ を見て頂くとして

19.5まではあったコレ
image.png
が20.0.533ではなくなってますね
image.png
じゃーPythonでエクスプレッション書けないのか?っていったらそんなことはなくてですね。
image.png
一応これでPythonに切り替えることが出来ます。
エクスプレッションのデフォルト言語を切り替えるっていう概念があまり
うまくいってなかったからボタンを取っ払ったんじゃないかなーなどと想像しちゃいますが
デフォルトはHScriptで部分的にPythonで書きたきゃ書けば?みたいなスタンスなんじゃないかと思います。
image.png
Pythonにエクスプレッションを切り替えるとパラメータの色がこんな風に紫色になります。
「え?こんなの初めて見た!気持ち悪い!」と思う人もいるかもしれませんが
ちょいちょいデフォルト値で設定されてるパラメータで見かけますよ。
image.png
こういうのとか。
image.png
こういうのみたいに複数行にまたがって書くようなやつとか。
ドキュメントには

複数行のパラメータエクスプレッションを作成した場合、それは 関数ボディ として評価されるので、 returnを使用しなければなりません 。

と書かれてるのでreturnで返り値をちゃんと指定しましょうね。
HScriptだと
if( ch("ty") > 0, ch("tz"), if(ch("ty") == 0, 0, ch('tx')) )

if ch("ty") == 0:
    return 0
if ch("ty") < 0:
    return ch("tx")
return ch("tz")

HScriptだと1行に長く書くので可読性が低いですがPythonだと分かりやすいですね。

Pythonシェル

WindowメニューのPython Shellから呼び出せます。(Alt+Shift+P)
image.png
例えばこんな風に
image.png
選択しているものの名前とかHDAとか定義とかを表示したり

for i in dir( hou.selectedNodes()[0] ):
    print(i)

どんなメソッドがあるか調べたりprintでいろんな情報を表示したり

import hou				
import re				
				
oldPath = 'D:/maya/projects/hogehoge/data/'				
newPath = '$HIP/fbx/'				
fileNodes = hou.sopNodeTypeCategory().nodeType("file").instances()				
				
for i in fileNodes:				
	targetParm = i.parm("file")			
	currentPath = i.evalParm("file")			
	newFullPath = re.sub( oldPath, newPath, currentPath )			
	print( currentPath )		# 最初は現状把握	
	#print( newFullPath )			
	#targetParm.set(newFullPath)		#保険で最初はオフ	

リソースのパスを書き換えたりいろいろ出来ると思います。
こういうのは普段の作業でよくやるのでシェルフのボタンでもいいですかね。

HDAのコールバックスクリプト

HDAのボタンを押した時に実行されたりHDAが呼ばれたタイミングで実行されたり
インプットをまるっと何らかのプリミティブグループにしてしまったり出来るアレです。
ここ を見て下さい。
あと一番有名なHDAのコールバックの資料がポリフォニー山部さんのこの資料なので
これを見ておくと良いと思います。

まとめ

Houdiniの中でPythonを使える場所は多岐に渡りますね。
驚く程多いです。
ぶっちゃけ公式ドキュメントのPythonスクリプトの場所に全部まとまってると思うんですが
こうやって俯瞰してみると改めて実感しました。
HoudiniをやるならwrangleもそうなんですがPythonもしっかり扱えた方が良さそうですね。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?