Houdini回。今回はこういうヤツ。
パーティクルに板を貼り付けたもので、マテリアルとテクスチャ連番画像は共通。
テクスチャのシーケンス番号に対する値をパーティクルごと個別に設定しています。
簡単にできるとおもってたら思いの外手間取ってしまって。
いくつか試して、最終的にinline Code(VOP)を使う方法に落ち着きました。
inline Code(VEX)はVOP内でVEXが書けるノードです。
このノードの詳しい解説はまたの機会に回すとして、やってる事はシェーダー側でのテクスチャパスの作成です。
シェーダー側で使うテクスチャのフレーム番号は、事前にPrimitive Attributeとして作成し、それを用いています。
さて、inline Code(VOP)の記述等を詳しく見てみます。
inline Code(VOP)の入力は2つ。
テクスチャパスを記述したパラメータ”mainPath”と、参照するシーケンス番号のパラメータ”f”。
この2つの入力された値を使って、inline Code(VOP)で次のようなコードを書いています。
string offset = sprintf("%04d", $f); string str[] = split($mainPath, "."); $colormap = concat(str[0], "." , $offset, ".tif");
一行目で、シーケンス番号を4桁のstring型に変換。
二行目で入力したテクスチャパスを”.”で配列に分割。これにより、文字列を[出力パス][シーケンス番号][ファイルフォーマット]の3つに分解。
三行目で、文字列を結合してパスを生成。
このパスは、シーケンス番号のパラメータ”f”を使って生成されているので、各プリミティブ毎に使用されるテクスチャもそれに応じたものが適用される。
アトリビュートにシーケンス番号ではなく、テクスチャパスそのものを持たせても良かったのですが、データ量が大きくなるだけだと思い直しやめました。
シーンファイルはこちら TexOffs_Sample.hip
この方法の難点は、シーンビュー上では全て同じテクスチャが適用されて見えること。
レンダリングしてみなければ、結果が確認できない。
シーンビューで確認するためには、おそらく、それ用にOpenCL(シェーダー?)をカスタマイズしなければいけないが、やりかたが分からない)
もっと楽で画期的な方法が存在する予感はあるんだけどなぁ。
SpliteSheet作るのも同じくらい面倒に感じてしまうし、CVEXも同様。
誰か知ってたら教えてください。
以上!
2018/07/10追記
コメントにて、別解を教えていただきましたので追記です。
Material(SOP)のパラメータ「Overrides use local variables」を使うと、同様の機能が簡単に実装できるようです。
このパラメータ、視界には入っているのに、何に使うのかよく分かってなかったです。
マニュアル曰く、「ローカルパラメータ(例えば$PRと$PT)を使って、マテリアルのパラメータを上書き」出来るそうな。
いまいち、マニュアルが何を言っているか分からないので、使って試してみました。
次のようにして使うようです。
1:Material(SOP)のパラメータ”Local Overrides”の数を増やす。
今回はテクスチャの色と透明度、この2つの要素を上書きしたいので2に設定しています。
2:上書きするパラメータを設定
増えたパラメータで、”Choose Parameter”になってるところを変更すると、上書きしたいパラメータを選べます。
(マテリアルが設定されてないと何もでてこないけど)
ここではマテリアルのカラーテクスチャを上書きしたいので、”Color Map”を選択しています。
すると、パラメータ欄は次のように設定されます。
ここで設定された文字列は、このMaterial(SOP)に割り当てられたマテリアルの該当パラメータ名とその値になります。
ここでは、マテリアルとして”Constant”を割り当てているので、そのパラメータColor Mapのパラメータ名”dif_map”と、その値”testure”という文字列が記述されています。
3;上書きする値を設定
パラメータ”String”を変更して、上書きしたいパラメータの内容に書き換えます。
ここでは次のように書き換えました。
$HIP/render/font/font.`padzero(4,$F+$PR)`.tif
ここで設定した文字列が、割り当てられたマテリアルの該当パラメータの値として用いられます。
さらに、いくつかのローカル変数が利用可能とのことなので、ここでは$Fと$PRを使ってパスを指定しています。
これで、始めに示したinline Code(VOP)を用いた場合と同様に、各プリミティブ毎に枚フレーム異なるテクスチャが割り当てられるようになります。
同様にして、アルファマップでもテクスチャパスをオーバーライドすれば完成!
このくらいのシンプルさを求めていたのです。
教えていただき有難うございましたm(_ _)m
いつも拝見しています。
Houdiniの書籍、素晴らしかったです。
人から教えていただいたやり方ですが、Material SOPの
“Overrides use local variables”を使う方法ではダメでしょうか?
Material SOPの“Overrides use local variables”初めて知りました。
これで上手くいきますね。こういうのを探してたんです!
Material SOPはよく使うノードなのに、このパラメータは知りませんでした。
情報ありがとうございます。
本の方もありがとうございます。励みになりますm(_ _)m