[Houdini]スクリプト周りなど

Pythonはhouだけ覚えればOKっぽそうなので除く。

前提として、HScriptとExpressionの違いがいまいちよくわかってないので
ごちゃごちゃになるかも知れませんが、その場合はごめんなさい:P


とりあえずExpressionのページを眺めてみたまとめから。


float, vector, matrix, stringがある。
まぁ、MELと大体一緒ですねこの辺は。

関数
以下のように記述可能。

[return_type] functionName([[arg_type1] arg_name1 [, [arg_type2] arg_name2] ...])
{
...
}

ここもまたMELと似てますね。
ところでマニュアルには、Pythonで書いたほうが良いよ的なメッセージとか、君が探してる関数はきっとビルトイン関数にあるよとか、関数を書かせたくない理由でもあるような書き方がされています。
なんででせう。

クオート
ダブルクオート内は変数が展開され、シングルクオート内では文字列とみなされる。
バッククオートは受け取った文字列をExpression(HScript?)構文として実行する。

echo `strlen("$foo")`

バッククオートを入れ子にしたい場合は、\でエスケープしてやる。

echo `system('echo \`ls\`')`

MELだとバッククオートで囲む方法と関数的に呼ぶ方法があって、
バッククオートを入れ子にする方法とかは考えたことなかったので、なるほど、と思いました。
MELもバッククオート内を文字列として受け取って実行してんのかな?
となるとすげぇevalっぽいんですが、もしややってることは一緒?
でもバッククオートとシングルクオートの意味合いが違うあたりからしても、MELより強力なんじゃねーの、と思いました。

Expressionのページに、変数周りとかに関して特に記述がないので、やっぱりHScriptと同一もしくはHScriptの方言的なものだと思えばいいのかも。
まさにMELとMayaのExpressionみたいな感じ?

違う。ここに関しては一番下のまとめにて。
 

じゃあ次、HScript。

変数
変数のセット
set x = "hello"
グローバル変数のセット(どちらでもOK)
set -g x = "hello"
setenv x = "hello"

変数のアンセット(解放?)
set -u x

変数の値を取得
> set foo = "bar"
> echo $foo
bar

$なしで宣言して、使用時に$を付加する感じです。

また、以下のようにすることも可能です。
> echo ${foo}baz
barbaz

${…}を1つの変数と読み取ってくれるんですね。
これは便利かも。

モディファイヤ
変数のケツに:codeというのをつけると、うにゃもにゃしてくれるようです。
たとえばこんな感じ。

> set afile = /home/matt/bin/foo.bar
> echo $afile:e
bar
> echo ${afile}:e
bar

codeにあたる部分はいくつかあるようなので、詳しくはマニュアル参照。

制御構文
if
if condition1 [then]
commands to execute if condition is true
else if condition2
commands to execute if condition2 is true
else
commands to execute otherwise
endif

サンプル
if ( $F == 1 ) then
echo Frame One
else
echo Not Frame One
endif

for
for count_variable = start to end [step stepsize]
commands to loop
end

サンプル
for i = 1 to 3
echo $i
end

for i = 1 to 100 step 3
echo $i
end

foreach(つまりMELで言うfor in)
foreach iterator_variable (list_string)
commands to loop
end

サンプル
foreach i ( a b c )
echo $i
end

foreach object ( `run("opls -d")` )
echo Object $object
end

while
set i = 0
while ( $i < 10 ) set i = `$i+1` echo $i end

set i = `$i+1`
の下りが面倒に見えます。

breakcontinueも使える模様です。

コメント
# comment
文字列とかで#が使いたい場合は\でエスケープの必要あり。

構文の分割
基本的には行末までを1つのコマンドとして読むけど、;(セミコロン)を使うことで複数コマンドを同一行に記述可能。

alias
エイリアスが作成可能。こりゃ便利。
alias objs "opls /obj"
alias opcd opcf
alias cd opcd

hscript standalone application
そのままコピペしときます。

The hscript application is in $HFS/bin. Running it on the system command line will give you a console similar to the textport in which you can run HScript commands and see the results.

The hscript application lets you write batch scripts that exercise the full power of Houdini without having to start up the entire graphical interface.

Use hscript -q on the command line to suppress the version information the utility normally prints when it starts up. This is useful when you're redirecting the output of the hscript standalone process.

Mayabatch的なものだと思えばいいのでは。

コマンドライン引数(?)
$argnが使える。
$arg0はスクリプト名。
$arg1, $arg2, $arg3, etc...はスクリプトに渡された引数。
$argcはスクリプトに渡された引数の数。

これ以上詳しい内容は、各自マニュアル参照。
 
 

■まとめ
ExpressionとHScriptはどうやら、似て非なるものらしい。
やはりMELとExpressionの関係に似てはいるけど、それともまた若干違う。
というのもHScriptにはない機能がExpressionには搭載されていたりするから。
Houdiniでは数値計算などを行うためにVEXという言語がHScriptとは別に存在している。(これはRSLに似ている)
Houdiniの性質とVEXの存在から、HScriptでは数値計算をゴリゴリ行う必要がない。
それはsin, cosなどの関数が存在しない時点でも明らか。
一方Expressionの方は簡単な数値計算ぐらいは行いたいこともあるため、float型やvector型が用意されている。
なんとなく、cshとMELとの間ぐらいの言語、という印象。
HScriptはもっとcsh寄りな気が。

HScriptはシーンのノードを操作したり、情報をファイルに書き込んだり、システムコマンドを呼んで外部ツールにデータ渡したりなど、パイプラインというとちょっと大げさだけどその辺を行う為に使われるのだろうと思う。
なぜcshに似ているのかと言えば、ぱっと思いつくのは2つの理由。
CG屋さんにはcsh使いが多いのが1つ、Houdiniの構造がUnixに酷似している(というかそのまま?)のがもう1つ。

僕はあんまりcshには詳しくないんだけど、シェル系の言語は
Unixのシステムの操作に特化したつくりになっている。
そのためあまり数値計算などには重きをおかれていない。
そういう性質をHScriptは受け継いでいる模様。
HoudiniをUnixのディストリビューションとでも考えるとわかりやすいかも?ww

と、言ったものの、数値計算もやりやすいに越したことはないし、
圧倒的に言語力が違うから、ってことでPythonが搭載されたのかもねと思います。

と、言うわけで、とりあえず覚えるべきはExpressionかな。
覚えるといっても各ノードが持ってるローカル変数だとかそういうのを全部つぶさに覚えるわけにも行かないので、まぁ使っていく中でぽつぽつ覚えられたらいいのかも。

PythonのHoudini内での使い方覚えるにしても
覚えといて損はないので、一旦ざっくりなめてみます。

ってここまで書いて気づいた。
HScriptでは関数宣言できない??
だとしたらホントにざっくりやるだけでいいや、と思います。
なんとなく。
実際にはあまり必要ないかもしれんのでなんとも言えんのですが。

と、長々失礼しました。

(調べながら書いてたので文末がですます調だったりじゃなかったり、不安定ですね。。
若干気になるので後で直すかも知れないし、直さないかもしれない。)

------------------------------------------------------------------------追記
ExpressionのコマンドをHScript Textportから実行するとできるっぽいけど、
バッククオートで括らないとだめ。

なぜ?

この場合ExpressionはHScriptのサブセットといえるのかどうなのか。
もうちょい使ってみないことにはわからん。
今のところ、かなり似てるとしかいえない。

「[Houdini]スクリプト周りなど」への2件のフィードバック

  1. お久しぶりです。

    でもってHoudiniもお久しぶりなわけですが、
    Expression:パラメータの中で直接打って使えるHScript:パラメータの中で直接使えない。

    もしくは

    Expression:いろいろ評価する
    HScript:Houdiniの動作(オペレーション)

    っていう認識です。

    こんなざっくりした感じでどうでしょう?

  2. >abekiyoさん
    ども、お久しぶりです。
    コメントありがとうございます:)
    お元気ですか?

    > Expression:いろいろ評価する
    > HScript:Houdiniの動作(オペレーション)
    なるほど、確かにこれで何となく表せますね。

    結局HScriptの中でも`xxx`としてやればExpression評価出来るみたいなので、一応HScriptのサブセットと考えて良さそうですね。

    ありがとうございまーす:)

コメントを残す

メールアドレスが公開されることはありません。