tag:blogger.com,1999:blog-63504726082861467082024-02-08T01:51:58.478+09:00FX HACK気が向いたらHoudiniのTipsを紹介するBlogShoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-6350472608286146708.post-606482706016387262021-04-29T12:27:00.165+09:002021-05-12T14:36:03.222+09:00Houdini Workflowについて<p>
いままで何回もHoudini
Workflowをつくってきたので、どんなことをやっているか紹介したいと思います。
</p>
<p>
小規模な会社にいるからとか個人でやってるから、そんなの必要ないと考える人もいるかもしれませんが、そうは思いません。数人の会社で働いたことがありますが、確実にワークフローが少しでもないと良いパフォーマンスを出すことをできません。
</p>
<p>
大規模な会社には専任のTDがいてパイプラインがしっかりあり、色々便利なこともあります。反面、大きくなりすぎた会社ほど、やる気のない人や老害がたまり自由度がなくなり最新の流れにもついていけなくなったり、ワークフローを作るのに大工事したり、パイプラインにも手をいれなければいけないみたいなことも起こってしまいます。小規模だとパイプラインを作るのは難しいですが、ワークフローは自分たちの好きに作りやすいです。自分たちにあったものを構築できれば、小回りがきいて大きな所に負けないワークフローを構築しアドバンテージにすることも出来ます。
</p>
<p>
ワークフローは、TDの人やスクリプトをかける人が作るものだと考えるでしょうが、実際に作業するアーティスト主導で構築するべきです。なぜならそのワークフローを使うのは作業者であり、なにが必要なのかを知ってるのは作業者であるアーティストだからです。
</p>
<p><br /></p>
<p><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h1 style="text-align: left;">パイプライン? ワークフロー?</h1>
</div>
<p>そもそもパイプラインとワークフローの違いはなんなんでしょうか?</p>
<p>
<b><span style="color: #fcff01;">
パイプラインは、別部署へのデータを送る時、たとえばアセットデータやアニメーションデータやレンダーイメージのパブリッシュなど</span></b>です。決められた場所かつ安全な場所にパブリッシュしたり、決まったフォーマットに変換したりします。また、ファイルの命名規則やチェック方法やShotgunとの連携もこちらの役割です。
</p>
<p>
<b><span style="color: #fcff01;">
ワークフローは、アーティストがショット作業をする時に必要なルール・ツール</span></b>を用意しておくことです。
</p>
<p>
パイプラインはTDが担当しますが、ワークフローは出来る限りそのツールや流れを熟知した人が作るのに携わるのが良いと思います。そしてFXはPythonは書けて当たり前なので、TDにお前らどうせ自分たちで出来るからとか言われ、他の部署を先にやってからと後回しにされがちです。
</p>
<span><a name='more'></a></span><p><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h1 style="text-align: left;">目的</h1>
</div>
<p>まずは何のためにワークフローを作るかの目的をしかっり決めましょう。</p>
<p>
私はいつもアーティストが絵作りだけに集中できる環境を作ることを目的にし、できるかぎりのことをするようにしています。
</p>
<p>
何を基準にツールやルールを作るかというと、基本この2つをベースに考えます。
</p>
<ol style="text-align: left;">
<li>
<b><span style="color: #fcff01;">ヒューマンエラーをなくす</span></b>
</li>
<li>
<b><span style="color: #fcff01;">毎回同じことをしたくない</span></b>
</li>
</ol>
<p>
代表格は、キャッシュやレンダーの出力先を毎回入力することです。これはもはや人間のやることではありません。
</p>
<p>
チームで新しくワークフローを作る場合は、みんなの意見を聞いて不便なことや要望を洗い出してあげることも大事です。
</p>
<p>
チームにジュニアレベルの人やHoudiniに詳しくない人がいるとしたら、色んなレベルの人にもスムーズにいくルールを考える必要があるかもしれません。
</p>
<p><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h1 style="text-align: left;">環境変数</h1>
</div>
<p>
まずプロジェクト固有の変数について考えましょう。変数は、<span style="color: #fcff01;">プロジェクト全体に適用されるグローバル変数と、シーケンスやショットごとに値が変わるローカル変数</span>にわけられます。
</p>
<p><br /></p>
<p>
プロジェクト名やシーケンス名を定義しとくとフォルダの移動やアウトプット先を決めるのが楽になります。ただこの変数はパイプラインとして設定されてることが多いです。小規模な会社や個人では自身で設定してもいいと思います。これらを設定することによってどういうことが出来るかはあとで説明します。
</p>
<pre class="prettyprint"><code class="language-csh">PROJ = 'BurningProj'<br /></code></pre>
<p><br /></p>
<p>
他のソフトからAlembic等でデータを持ってきた時、シーンスケールを正しくしてあげる必要があります。なぜなら、Houdiniのシミュレーション系ノードのデフォルト値は、1Grid=1mを前提として値が設定されています。これにあわせてやるのが一番良いです。
</p>
<p>
大抵の場合はインポートしたものを0.1倍か0.01倍すればいいでしょうが、海外のクライアントからもらったデータはメートルでなくインチで作業してる場合があります。その場合は39.37で割る必要があります。覚えたくないですよね。なので、コレも変数にしておきましょう。
</p>
<pre class="prettyprint"><code class="language-csh">SCALE_FACTOR = 10</code></pre>
<p><br /></p>
<p>他には、レンダーサイズも変数にしてもいいかもしれません。</p>
<pre class="prettyprint"><code class="language-csh">RENDER_RES_X=1920
RENDER_RES_Y=960
</code></pre>
<p><br /></p>
<p>
また、WinodwsやLinuxのプラットフォームが混在してる場合、マウントするところを変数にしたとき、少し便利になります。どいうことかというとWindowsはZ:/proj/BuringProjがLinuxでは/proj/BuringProjの場合、$PROJ_ROOT/BuringProjという書き方に統一できます。協力会社によってはクライアントと同じドライブレターが使えないときは、協力会社に$PROJ_ROOTを'X:/good_client/A_Inc/proj'みたいに設定してもらえれば、フォルダ構造を維持したままシーンファイルを渡せば、別の環境でもシーンを容易に再現できる可能性が高まります。
</p>
<pre class="prettyprint"><code class="language-csh">PROJ_ROOT = '</code>Z:/proj'</pre>
<p><br /></p>
<p>
日本でもNetflixの仕事が増えてきたせいか、やっとColorMangementが浸透してきましたね。Houdiniも他のソフト同様、OCIOの環境変数を設定してあげる必要があります。ACTIVE_VIEWSはなくてもいいです。VFXではシーケンスやショットごとでLutが違う場合があるので、OCIO_ACTIVE_VIEWSを変動出来るようにしてもいいかと思います。
</p>
<pre class="prettyprint"><code class="language-csh">OCIO='/proj/BurninigProj/tools/OCIO/will_be_beautiful.ocio'
OCIO_ACTIVE_VIEWS='Rec.709'</code></pre>
<p><br /></p>
<p>
ローカル変数の代表は、シーケンスとショット番号、フレームレンジとかでしょうか。
</p>
<pre class="prettyprint"><code class="language-csh">SEQ = 'seq_01'
SHOT = 'shot_003'
P_START = 1001
P_END = 1032
</code></pre>
<p>
さて、これらをどうやって全員に行き渡せるかですが、大きい会社ならランチャーがあると思うので、そこで設定してもいいです。
</p>
<p>
小さい会社や個人の場合は、パッケージを使うといいでしょう。<a href="https://www.sidefx.com/ja/docs/houdini/ref/plugins.html">https://www.sidefx.com/ja/docs/houdini/ref/plugins.html
</a>
</p>
<p><br /></p>
<p>
たとえば/proj/BurningProj/tools/houdiniというフォルダの中にプロジェクトのHDAやスクリプトを置き変数を定義するとします。
</p>
<p>/proj/BurningProj</p>
<p>└── tools</p>
<p> └── houdini</p>
<p>
<span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── otls
</p>
<p>
<span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── packages
</p>
<p>
<span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── scripts
</p>
<p>
<span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── toolbar
</p>
<p> └── maya</p>
<p> └── nuke</p>
<p>
まずメインのパッケージを作ります。これをpackagesフォルダのBurningProj.jsonに保存します。
</p>
<pre class="prettyprint" style="height: 20em; overflow-x: scroll; overflow-y: scroll; overflow: scroll;"><code class="language-json">{ "env" :
[
{ "PROJ" : "BurninigProj"},
{"PROJ_ROOT":
[
{"houdini_os != 'windows'" : "/proj"},
{"houdini_os == 'windows'" : "Z:/proj"},
]
},
{"TEAM_FX":
[
{"houdini_os != 'windows'" : "/team/fx"},
{"houdini_os == 'windows'" : "T:/fx"},
]
},
{ "PROJ_TOOLS_HOU" : "$PROJ_ROOT/$PROJ/tools/houdini" },
{ "TEAM_TOOLS_HOU" : "$TEAM_FX/tools/houdini/houdini$HOUDINI_MAJOR_RELEASE.$HOUDINI_MINOR_RELEASE" },
{ "NAGAMOCHI" : "$TEAM_TOOLS_HOU/Nagamochi" },
{ "SIDEFXLABS" : "$TEAM_TOOLS_HOU/SideFXLabs" },
{ "RENDER_RES_X" : 1920 },
{ "RENDER_RES_Y" : 960 },
{ "SCALE_FACTOR" : 10 },
{ "OCIO" : "$PROJ_ROOT/$PROJ/tools/OCIO/will_be_beautiful.ocio" },
{ "OCIO_ACTIVE_VIEWS" : "Rec.709"},
{ "HOUDINI_BUFFEREDSAVE":
[
{"houdini_os != 'windows'" : 0},
{"houdini_os == 'windows'" : 1},
]
},
{ "HOUDINI_PATH" :
[
"PROJ_TOOLS_HOU",
"$NAGAMOCHI/common",
"$NAGAMOCHI/houdini$HOUDINI_MAJOR_RELEASE.$HOUDINI_MINOR_RELEASE",
"$SIDEFXLABS",
]
},
]
}</code></pre>
<p><br /></p>
<p>
つづいて、BurinungProj_User.json(名前はなんでもいい)というファイルを個人の$HOME/houdini18.5/packagesの中に入れてもらいます。このファイルの中身はこうです。1つ前で作ったJsonの置き場を参照してるだけです。
</p>
<pre class="prettyprint">{
"package_path": "/proj/BurningProj/tools/houdini/packages"
}</pre>
<p><br /></p>
<p>
こうすることによって、環境変数等を変更したい時にメインのひとつだけを編集すれば良いようになります。
</p>
<p>
大きい会社でも、融通が聞かないTDがいたり自由度のないランチャーを使用してる場合でも、このパッケージの仕組みを使えば、いちいちチケットを切らずに変数の管理が出来るようになります。
</p>
<p><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h2>HOUDINI_PATH</h2>
</div>
<p>
環境変数を設定する時、特に<span style="color: #fcff01;"><b>HOUDINI_PATHの読み込み順には気をつけなければいけません</b></span>。
</p>
<p>デフォルトは以下の順で読み込みます。</p>
<ol style="text-align: left;">
<li>$HIP</li>
<li>$HOUDINI_USER_PREF_DIR</li>
<li>$HFS/houdini</li>
<li>$HFS/bin</li>
</ol>
<div>
プライグインによってはHOUDINI_PATHの順番を指定してくるものがあります。例えばArnoldは、デフォルトより前に入れてとあります。たしかSOHOの関係だったかな?
</div>
<div>
<p>順番の確認はShellでhconfig
-apとタイプして確認しましょう。何を言ってるかわからない人は、以下のリンクをどれか見てください。</p>
</div>
<div>
<div>
<span face="Lato, sans-serif" style="color: #2b2b2b;"><a href="http://ikatnek.blogspot.com/p/houdini-environment-variables.html">hconfig(サルにもわかる)</a> </span><a href="https://houdinifx.jp/blog/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E3%83%91%E3%82%B9%E3%81%AE%E8%A8%98%E8%BF%B0%E3%81%AE%E4%BB%95%E6%96%B9/" style="font-family: Lato, sans-serif;" target="_blank">hconfig (Indyzone)</a> <a href="https://support.borndigital.co.jp/hc/ja/articles/900001589506-Houdini%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B" style="font-family: Lato, sans-serif;" target="_blank">hconfig (BornDigital)</a>
</div>
</div>
<p><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h2 style="text-align: left;">キャッシュの保存先</h2>
</div>
<p>
FXにとっての悩ましい大きな種の1つは、ストレージを簡単に圧迫させてしまうことです。ここの管理をいかに簡単にし、サイズを出来る限り小さくすることは非常に重要なことです。以下のことを目的として保存先とフォルダ構成を考えいています。
</p>
<ol style="text-align: left;">
<li>
<span style="color: #fcff01;">誰がどれくらい使用しいてるかを把握しやすくする</span>
</li>
<li>
<span style="color: #fcff01;">プロジェクト真っ只中でも終わった後でも消しやすくする</span>
</li>
<li><span style="color: #fcff01;">間違って上書きしないようにする</span></li>
<li>
<span style="color: #fcff01;">可能なかぎり、データのサイズを小さくする</span>
</li>
</ol>
<p><br /></p>
<p>
まず最初にどこにファイルを保存するかを決めましょう。ここで2つの例をだして考えてみます。
</p>
<p>
こういうフォルダ構造があったとします。ユーザの作業フォルダにキャッシュフォルダを作成する場合です。
</p>
<p style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></p>
<p style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></p>
<pre class="prettyprint" style="-webkit-text-stroke-width: 0px; color: black; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px;"><code class="language-default">/proj/$PROJ/work/$SEQ/$SHOT/$DEPT/$USER</code></pre>
<p>/proj/BurningProj</p>
<p>└── work</p>
<p> └── seq_01</p>
<p>
<span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── shot_003
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── fx
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> <span> </span><span> </span><span> </span></span>└── shohei
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> <span> </span><span> </span><span> </span></span>└── caches
</p>
<p>
<span> </span><span> </span><span> </span>└── comp
</p>
<p>
<span> </span><span> </span><span> </span>└── flipbook
</p>
<p>
<span> </span><span> </span><span> </span>└── houdini
</p>
<p>
<span> </span><span> </span><span> </span>└── nuke
</p>
<p>
<span> </span><span> </span><span> </span>└── render
</p>
<p>
こういう構造なら、Houdini内部では$HIP/../cachesと書くだけでいいです。'..'は一つ上の階層にいくという意味です。なんかプロシージャルっぽいですね。
</p>
<p>
ただDispatcherを使用している場合は、シーンファイルを別の場所に複製して、そのファイルを使用してサーバで回す場合があります。その際は、サーバでシーンファイルを開いた後に$HIPを上書きしてやる必要があります。
</p>
<p><br /></p>
<p>
次の例は作業フォルダではなくキャッシュ専用のフォルダを作る方法です。こんな感じです。
</p>
<pre class="prettyprint"><code class="language-default">/proj/$PROJ/caches/</code>$DEPT/$USER/$SEQ/$SHOT/</pre>
<p>/proj/BurningProj</p>
<p>└── caches</p><p> └── fx</p>
<p> └── shohei</p>
<p> └── seq_01</p>
<p> └── shot_003</p>
<p> └── bob</p>
<p> └── seq_05</p>
<p> └── shot_012</p>
<p>
これだと、まず各ユーザーがどれだけ使ってるのかを把握するのが簡単になります。ただ、作業フォルダとは別の所にあるので、ファイルブラウザでの移動は面倒になります。また、プロジェクトが終わった時に、/proj/$PROJ/cachesのフォルダを消すだけで一発ですべてのキャッシュが消えるメリットもあります。
</p>
<p>
ただどちらも、作業者が変わると$USERが変わってしまって他人のキャッシュが読み込めなくなる問題はあります。
</p>
<p>
どのフォルダ構造が最適解かというのはないと思います。ここはパイプラインやシステムチームのルールにのっとりつつ、管理のしやすさを考慮しながら考えるのがいいでしょう。
</p>
<p>
保存先が決まった場合、ここでは$HIP/../cachesにしたとします。ここより下はどうしたら良いか考えます。Houdiniのデフォルトから考察してみましょう。ファイルキャッシュ系のノードの書き出し先のデフォルトはこうなっています。
</p>
<pre class="prettyprint"><code class="language-default">$HIP/geo/$HIPNAME.$OS.$F.bgeo.sc</code></pre>
<p>まず保存先$HIP/../cachesに変更します。</p>
<pre class="prettyprint"><code class="language-default">$HIP/../caches/$HIPNAME.$OS.$F.bgeo.sc</code></pre>
<p>
$HIPNAMEがはいってるとシーファイル名が変わったらキャッシュの読み込みができなくなるので消します。
</p>
<pre class="prettyprint"><code class="language-default">$HIP/../caches/$OS.$F.bgeo.sc</code></pre>
<p>
書き出しノードが複数あったらcachesというフォルダ下にすべてが保存され管理しにくくなります。なのでノードごとでフォルダを分割します。</p>
<pre class="prettyprint"><code class="language-default">$HIP/../caches/$OS/$OS.$F.bgeo.sc</code></pre>
<p>
これでも問題があります。たとえばOBJに2つのノードがあって、中に同じ名前のキャッシュノードがあったら、書き出し先が同じ問題が発生してしまいます。( /obj/explosion/cache と /obj/water/cacheは一緒になる)</p>
<p>
回避方法の1つの案としては、親のノード名は異なっているので、フォルダ名に親の名前をいれてバッティングを避けます。( /obj/explosion/cacheは親の名前がexplosion、キャッシュ名はexplosion__cacheになる)</p>
<pre class="prettyprint"><code class="language-default">$HIP/../caches/`opname("..")`__$OS/`opname("..")`__$OS</code>.$F.bgeo.sc</pre>
<p>最後にバージョンでフォルダを分けたいのでバージョンもいれます</p>
<pre class="prettyprint"><code class="language-default">$HIP/../caches/`opname("..")`__$OS/`chs('version')`/`opname("..")`__$OS</code><code class="language-default">.</code>`chs('version')`.$F.bgeo.sc</pre>
<p>こういう結果になりました。</p>
<p>└── caches</p>
<p>
└── explosion__cache</p>
<p>
└── v001
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>└── explosion__cache.v001.1001.begeo.sc
</p>
<p>
└── v002
</p>
<p> └── water__cache</p>
<p>
└── v001
</p>
<p><br /></p>
<p><br /></p>
<p>
Pixarの例を見てみましょう。このビデオから彼らのキャッシュノードを見ることが出来ます。
</p>
<p>
<a href="https://vimeo.com/269027205#t=170s" target="_blank">https://vimeo.com/269027205#t=170s</a>
</p>
<p>彼らのパスはこうなっています。</p>
<pre class="prettyprint"><code class="language-default">$FXINSTDIR/caches`opfullpath(".")`/$FF.bgeo.sc</code></pre>
<p>
$FXINSTDIRはどうなっているかはわかりませんが。caches以下がcaches`opfullpath(".")`となっています。opfullpath(".")はそのノードのフルパスを返してくれます。/obj/geo1/rop_geometry1みたいな値が返ってきて、フォルダもこんな感じで作られます。
</p>
<p>└── caches</p>
<p> └── obj</p>
<p>
└── geo1
</p>
<p>
└── cache</p>
<p>
<span> </span><span> </span>
└── 1001.begeo.sc
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>1002.begeo.sc
</p>
<p>
└── dopnet1
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>└── objnet1
</p>
<p>
<span> </span><span> </span><span> </span><span> </span><span> </span>└── geo1
</p>
<p>
<span> </span><span> </span><span> </span><span> </span>└── cache</p>
<p>
<span> </span><span> </span><span> </span><span> </span>└──
1001.begeo.sc
</p>
<p>
<span> </span><span> </span><span> </span><span> </span>1002.begeo.sc
</p>
<p><br /></p>
<p>
私があげた例だとDopの中にObjnetつくって、同じ名前のノードたちを作ってしまったらキャッシュを上書きしてしまう可能性があります。Pixarの場合だと作られるフォルダの深さが一緒ではないので、スクリプト等で管理するのが面倒くさくなるかもしれません。
</p>
<p>
基本的にここまで書いてある内容は中間ファイルを想定しています。中間ファイルとは、レンダーや他のソフトに持ってく用のデータではありません。
</p>
<p>正解は無いと思うので、自分たちにあったものを見つけてください。</p>
<p><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h2>キャッシュのオプティマイズ</h2>
</div>
<p>
まーもうHoudiniもだいぶユーザー増えてきたし、知ってて当然のことなんで割愛してもいいかと思いましたが、一応さらっと触れときます。
</p>
<p><br /></p>
<p>まず、必要ないアトリビュートは消しましょう。例えば100万ポイントを保存したとします。</p>
<p>アトリビュートがPしかない場合、10.7MBのキャッシュが出来ました。そこに色を足すと21.6MBです。<b>PもCdもVector3なので、ほぼ2倍のサイズになります</b>。なので必要ないアトリビュートは消しましょう。</p>
<p>またAttributeCastというノードを使って、値を32bitから16bitにすればキャッシュサイズが小さくなります。ただこれは、浮動小数点演算の精度を下げていることを留意しないといけません。そして32から16にしたあとに32へ戻しても元の値に戻ることはありません。</p>
<google-sheets-html-origin><table border="1" cellpadding="0" cellspacing="0" dir="ltr" style="border-collapse: collapse; border: medium none; font-family: Calibri; font-size: 11pt; table-layout: fixed; width: 0px;" xmlns="http://www.w3.org/1999/xhtml"><colgroup><col width="400"></col><col width="100"></col><col width="100"></col></colgroup><tbody><tr style="height: 20px;"><td style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><br /></td><td data-sheets-value="{"1":2,"2":"Attrs"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">Attrs</td><td data-sheets-value="{"1":2,"2":"Size"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">Size</td></tr><tr style="height: 20px;"><td data-sheets-value="{"1":2,"2":"a"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMPr1ugVEpG-40n8OlYXHKkAN6wJq-DGYsPbsjt9VbLzcDZxwzxXHRHQ_13-VAWx7smmXVmjNBwGKKDJb7O17OmcDi4rD1EwircMnrgM7RXJfptE5XHOq3koG6qaeF3XpduIdlmGpdo5O0/s579/cache_optimize_001.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="228" data-original-width="579" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMPr1ugVEpG-40n8OlYXHKkAN6wJq-DGYsPbsjt9VbLzcDZxwzxXHRHQ_13-VAWx7smmXVmjNBwGKKDJb7O17OmcDi4rD1EwircMnrgM7RXJfptE5XHOq3koG6qaeF3XpduIdlmGpdo5O0/s320/cache_optimize_001.png" width="320" /></a><br /></td><td data-sheets-value="{"1":2,"2":"P"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">P(Vector3)</td><td data-sheets-value="{"1":2,"2":"10.7MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">10.7MB</td></tr><tr style="height: 20px;"><td style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmMv00d4GpQ0-aOiOZPfKaHO_2M6kyfJg83uMWS5QrtfeCJwdt3T1ykpIFK2T_1bm2SnWRHJaZ45rGUpqXSciU7gYQTZgo42yNTFrRAevo1NPEYv91j3fkGAbedoKr19bR90Tz0j8aXjMu/s573/cache_optimize_002.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="222" data-original-width="573" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmMv00d4GpQ0-aOiOZPfKaHO_2M6kyfJg83uMWS5QrtfeCJwdt3T1ykpIFK2T_1bm2SnWRHJaZ45rGUpqXSciU7gYQTZgo42yNTFrRAevo1NPEYv91j3fkGAbedoKr19bR90Tz0j8aXjMu/s320/cache_optimize_002.png" width="320" /></a></td><td data-sheets-value="{"1":2,"2":"P,floatAttr"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><span style="font-size: 14.6667px;">P(Vector3)<br />rand_val(Float)</span></td><td data-sheets-value="{"1":2,"2":"14.4MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">14.4MB</td></tr><tr style="height: 20px;"><td data-sheets-value="{"1":2,"2":"a"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGBb36U37mYsyvf0zWqv0-G606W9dcjPpaiVorCPwR1QWH1JwCrheA9zJv-uDzNeltr9_1J0-TqlWJcCDvoO4B7_ZqdknoXDjTXzUV3Okjrh3fkzO1QPvgwu4I0oQUl7qzB62GO9i4O6Xr/s571/cache_optimize_008.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="229" data-original-width="571" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGBb36U37mYsyvf0zWqv0-G606W9dcjPpaiVorCPwR1QWH1JwCrheA9zJv-uDzNeltr9_1J0-TqlWJcCDvoO4B7_ZqdknoXDjTXzUV3Okjrh3fkzO1QPvgwu4I0oQUl7qzB62GO9i4O6Xr/s320/cache_optimize_008.png" width="320" /></a><br /></td><td data-sheets-value="{"1":2,"2":"P, Cd"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><span style="font-size: 14.6667px;">P(Vector3)<br />Cd(Vector3)</span></td><td data-sheets-value="{"1":2,"2":"21.4MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">21.4MB</td></tr><tr style="height: 20px;"><td data-sheets-value="{"1":2,"2":"a"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu2kBIB_eCQNzGpu5N2EcWCMeWR_MHS13UghyosHirEuswm2GPeIJxohENCv_ot8I52zY7GtrD5cOWH8_pyIQ4WCnT1-AUf8V3ZxwVmY-9IVP0UTUaSXef3361PW4xw555a7YC3KfHGjaX/s565/cache_optimize_003.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="231" data-original-width="565" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu2kBIB_eCQNzGpu5N2EcWCMeWR_MHS13UghyosHirEuswm2GPeIJxohENCv_ot8I52zY7GtrD5cOWH8_pyIQ4WCnT1-AUf8V3ZxwVmY-9IVP0UTUaSXef3361PW4xw555a7YC3KfHGjaX/s320/cache_optimize_003.png" width="320" /></a><br /></td><td data-sheets-value="{"1":2,"2":"P, Cd(16)"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><span style="font-size: 14.6667px;">P(Vector3)<br />Cd(Vector3, 16bit)</span></td><td data-sheets-value="{"1":2,"2":"16.1MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">16.1MB</td></tr></tbody></table></google-sheets-html-origin>
<p>他の案として、これは少し手間ですが、フレームによって変動しない値があるのなら、その値だけ別ファイルに1フレーム保存し、他の動いてる値にあとからAttibuteCopyするのもありです。</p>
<p><br /></p>
<p>続いてVolumeのオプティマイズです。</p>
<p>Pyro Post-Pprocess Sopというのができて、使ってる人もいるでしょう。ただなぜあれは、VisualizeとOptimizeを一緒のノードにしたのか。分けて欲しかった。</p>
<p>では色々比較してみましょう。</p><google-sheets-html-origin><table border="1" cellpadding="0" cellspacing="0" dir="ltr" style="border-collapse: collapse; border: medium none; font-family: Calibri; font-size: 11pt; table-layout: fixed; width: 0px;" xmlns="http://www.w3.org/1999/xhtml"><colgroup><col width="400"></col><col width="317"></col><col width="100"></col></colgroup><tbody><tr style="height: 20px;"><td style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><br /></td><td data-sheets-value="{"1":2,"2":"タイプ"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">タイプ</td><td data-sheets-value="{"1":2,"2":"Size"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">Size</td></tr><tr style="height: 20px;"><td data-sheets-value="{"1":2,"2":"a"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_MWs2-9NsP62j5699OXlmjWZ6FduyMZ56W2gs9pAAI3dmKt13QDLeczJhCEAY6E95xP8c4fum5qGDKZaIJj32hvwg9MYTxjimNqNXpPUyR4pDH2HJ6b7EQNXm8K975uz0EeaL6Q4zWiq/s389/cache_optimize_009.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="268" data-original-width="389" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_MWs2-9NsP62j5699OXlmjWZ6FduyMZ56W2gs9pAAI3dmKt13QDLeczJhCEAY6E95xP8c4fum5qGDKZaIJj32hvwg9MYTxjimNqNXpPUyR4pDH2HJ6b7EQNXm8K975uz0EeaL6Q4zWiq/s320/cache_optimize_009.png" width="320" /></a></td><td data-sheets-value="{"1":2,"2":"何もしてない"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"> 1. 何もしてない</td><td data-sheets-value="{"1":2,"2":"66.2MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">66.2MB</td></tr><tr style="height: 20px;"><td style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzarTKYhwFzKnkZdylU_xJwSoHxQ417j7sndL7UY8x6HkRzhBOyKhUu7qU5DU0B69ZMpdsTsHnuTJQv6YLeAhq23N51C9rcwj9rlKewZ5Q-bRaWV8xJPsReFEY4U0BQp3fiAfF2KJ_8_4J/s519/cache_optimize_004.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="356" data-original-width="519" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzarTKYhwFzKnkZdylU_xJwSoHxQ417j7sndL7UY8x6HkRzhBOyKhUu7qU5DU0B69ZMpdsTsHnuTJQv6YLeAhq23N51C9rcwj9rlKewZ5Q-bRaWV8xJPsReFEY4U0BQp3fiAfF2KJ_8_4J/s320/cache_optimize_004.png" width="320" /></a></td><td data-sheets-value="{"1":2,"2":"Native VolumeをCompress"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"> 2. Native VolumeをCompress</td><td data-sheets-value="{"1":2,"2":"29.6MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">29.6MB</td></tr><tr style="height: 20px;"><td data-sheets-value="{"1":2,"2":"a"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqTT9YvSlJWzezZhud5ULkhY140RDN0nAKnHdalu2EUMI52gt2JmcQ68HI1YVXrHPq_SwJpwcob0QIip92JBBNGdOoxMFEeWS6xboNU8Nypc9GmkX7iWkFbdnAiUYCexfQU0q7hQjMyvAD/s521/cache_optimize_005.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="357" data-original-width="521" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqTT9YvSlJWzezZhud5ULkhY140RDN0nAKnHdalu2EUMI52gt2JmcQ68HI1YVXrHPq_SwJpwcob0QIip92JBBNGdOoxMFEeWS6xboNU8Nypc9GmkX7iWkFbdnAiUYCexfQU0q7hQjMyvAD/s320/cache_optimize_005.png" width="320" /></a></td><td data-sheets-value="{"1":2,"2":"1つ上のに対し、"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"> 3. 1つ上のに対し、Quantization Tolを0.001<div class="content" style="background-color: rgba(0, 0, 0, 0.075); box-sizing: border-box; font-family: "Source Sans Pro", Arial, sans-serif; font-size: 15px; margin-left: 2em;"></div></td><td data-sheets-value="{"1":2,"2":"27.4MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">27.4MB</td></tr><tr style="height: 20px;"><td data-sheets-value="{"1":2,"2":"a"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigL98zo5hip9zxp1dR_mFgKa9pS-m7HNzmDRyOji_hkj4aqcwBwMIEaS6piOGG-_EsZHclPhC1N32dJkgWUVUC1jFn0nfK-fuiEr6CgzGSyt2Mnxt4MzTYHHoSWCQkSPyIROFdDH5FDtRB/s526/cache_optimize_006.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="526" data-original-width="522" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigL98zo5hip9zxp1dR_mFgKa9pS-m7HNzmDRyOji_hkj4aqcwBwMIEaS6piOGG-_EsZHclPhC1N32dJkgWUVUC1jFn0nfK-fuiEr6CgzGSyt2Mnxt4MzTYHHoSWCQkSPyIROFdDH5FDtRB/s320/cache_optimize_006.png" /></a></td><td data-sheets-value="{"1":2,"2":"VDBで16bit"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"> 4. VDBで16bit</td><td data-sheets-value="{"1":2,"2":"33.8MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">33.8MB</td></tr><tr style="height: 20px;"><td style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimCgpWgWfsZRifc_lAUdlEi1inqfnvWs4R_633TGtC8HhO_zpiubI_C8_xRJvjAMkBJXZa-dIaxmZeKYVwiZrQ2-K5vGXVtvp0qVHP_KBh4zmbekFZmrtDysINeB4dkr0dETczdToJmtKp/s605/cache_optimize_007.png" style="font-family: "Times New Roman"; font-size: medium; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="605" data-original-width="526" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimCgpWgWfsZRifc_lAUdlEi1inqfnvWs4R_633TGtC8HhO_zpiubI_C8_xRJvjAMkBJXZa-dIaxmZeKYVwiZrQ2-K5vGXVtvp0qVHP_KBh4zmbekFZmrtDysINeB4dkr0dETczdToJmtKp/s320/cache_optimize_007.png" /></a></td><td data-sheets-value="{"1":2,"2":"VDBの16bit。Densityが無いエリアのVel削除"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;"> 5. VDBの16bit。Densityが無いエリアのVel削除</td><td data-sheets-value="{"1":2,"2":"11.1MB"}" style="border: 1px solid rgb(204, 204, 204); overflow: hidden; padding: 0px 3px; vertical-align: middle;">11.1MB</td></tr></tbody></table></google-sheets-html-origin><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p>他にもVelフィールドだけ、Voxelの解像度を落としてやるとかもありますね。</p><p>上の表を見てもらうとわかると思いますが、5番だけ説明をします。<br />Volumeに対してMotionBlurをかけるとき、DensityやらTemperatureやらがあるとこのみが、絵に影響します。今回の例で言うとDensityしかありません。Densityのないところは、レンダーに関して言えばVelocityがあっても意味ありません。なので、そこのエリアは消してもいいでしょう。VDBCombineを使ってOperationをActive Intersectionにすると、DensityのVoxelがあるところのみ残ります。これだと際が心配なので、VDB ActiveでDensityのVoxelを広げとくと安心です。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4UcUgIIrC_i1OQ2aOrdVSXc6eXOPOQD112aJxtKQKJA1flJ9focFEOHcZZdLvSMcuBpk3A3P3OdKZ25LmeAYRB9zTZR8-AOrYv4yJvITsnHPd5BkZaSwYKDrx3yhwzuOqNcfBdfOKlx8/s1280/cache_oprimize_volvel.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt4UcUgIIrC_i1OQ2aOrdVSXc6eXOPOQD112aJxtKQKJA1flJ9focFEOHcZZdLvSMcuBpk3A3P3OdKZ25LmeAYRB9zTZR8-AOrYv4yJvITsnHPd5BkZaSwYKDrx3yhwzuOqNcfBdfOKlx8/w640-h360/cache_oprimize_volvel.gif" width="640" /></a></div><p><br /></p><div class="separator" style="clear: both; text-align: center;"><br /></div>
<p>これは、どのレンダラーにも有効です。なぜならファイルサイズが軽くなるほどファイルの読み込みが速くなるからです。とくに貧弱なWindowsやファイルサーバーを使ってる際は、テストし検討してみてください。</p><p><br /></p><p>ここでは、全てには言及しませんが、これらを取り入れるときは必ず検証してください。<b><span style="color: #fcff01;">ファイルサイズが一番軽いのが最適解ではないかもしれません。なのでファイルサイズはもちろんのこと、ファイルの読み書きの時間を計測し、自分たちの環境に最適な方法を見つけてけください</span></b>。</p><p><br /><br /></p>
<div style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); font-weight: bold; padding-left: 10px;">
<h2 style="text-align: left;">ファイルキャッシュノード</h2>
</div>
<p>書き出し先が決まったら、ファイルキャッシュ用のノードを作ります。</p>
<div style="text-align: left;">
デフォルトのFileCacheSopではだめです。出力先を設定しなければなりません。もちろんノードを作った時点で、任意のパラメータを自動で変更する仕組みを作ることは可能です。<br />Houdiniは値を編集したパラメータは太字になるという素晴らしい機能があります。この方法だと作業者は変更していないのに太字になってしまいます。他の作業者の手に渡った時、その値が本当にいじられたがわからなくなるので、避けたほうがよいです。<br />他にもバージョニングしたかったり、ファイルサイズ削減の機能を入れてもいいでしょう。
</div>
<div style="text-align: left;">
<span style="color: #fcff01;">カスタムのファイルキャッシュ作成はワークフローの第一歩のHDAとしてオススメ</span>です。なぜならこのノードは必ず誰もが使うことになるノードだからです。
</div>
<p><br /></p>
<p>このBlog用にファイルキャッシュを作ってみました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPgrsw7DatzwYtjw5k53otNcVbsgBGotURlGPmpA4lI7GBwotPy2ZMX4sw2rd4EwlIVqAj-ydY5h_2K0smDbXQ9hBJvFUJ_1Cyb7uezQXpuO71vnVRSs2W6guzBOrEaW3ApysNtarQeDe6/s1483/filecahe_001.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="922" data-original-width="1483" height="398" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPgrsw7DatzwYtjw5k53otNcVbsgBGotURlGPmpA4lI7GBwotPy2ZMX4sw2rd4EwlIVqAj-ydY5h_2K0smDbXQ9hBJvFUJ_1Cyb7uezQXpuO71vnVRSs2W6guzBOrEaW3ApysNtarQeDe6/w640-h398/filecahe_001.png" width="640" /></a></div><br /><p><br /></p><p><br /></p>
<div style="text-align: left;">
<div style="text-align: left;"><br /></div>
<br clear="left" /><br /></div>
<div>
ファイルパスに直接、環境変数やエクスプレッションを入れるのでなく、一度パラメータに逃すのがオススメです。例えば、他の人からシーファイルを受け継いだ時、このノードのキャッシュは読み込めなくなります。なぜなら$USERがフォルダパスに入ってるからです。USERというパラメータを$USERから前の人のユーザーネームを入れれば読むことが出来ます。そしてファイルパスを直接いじると、どの部分をいじったのかが分からなくなるの避けられるようになります。
</div>
<br />
<p>
独自のファイルキャッシュノードの中にアトリビュートを消したり、VolumeをCompressする機能をつけてもいいでしょう。
</p>
<p>
また、これみたいに何を変更したのかのノートを書き込めるようにしてもいいでしょう。
</p>
<p>
<a href="https://forums.odforce.net/topic/41473-filecache-hda-with-easy-versioning-naming-and-reviewing/" target="_blank">
https://forums.odforce.net/topic/41473-filecache-hda-with-easy-versioning-naming-and-reviewing/
</a>
</p>
<p><br /></p>
<p>個人で使ってるのは以下に公開してます。もう少しちゃんと作ってあります。</p>
<p>
<a href="https://github.com/ShoheiOkazaki/Nagamochi/blob/master/common/otls/SOP__nmFileCache.hda">https://github.com/ShoheiOkazaki/Nagamochi/blob/master/common/otls/SOP__nmFileCache.hda</a>
</p>
<p><br /></p>
<p>
レンダリングや他のDCCソフトにデータを返すためにAlembicやVDBを作るノードは別途作りましょう。なぜなら中間ファイルとは使用が異なるからです。必要な機能としては、シーンスケールをもどしたり、Alembicをレンダーする際に必要なアトリビュートを整えたりPathアトリビュートを設定したり、VolumeならCompressとかスケールをしたときの影響を直すとかでしょうか。
</p>
<p><br /></p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">HDA作成ルール</span>
</h2>
<p>
HDAを作成するにあったとルールを決めておきましょう。こちらも主に管理目的です。
</p>
<p>一番のオススメはバージョニングしましょう。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPtGE6GgIVLJ8sGCfe5JsrguNeHhlge5ua3ulDrQKn1Re-atKIZte-0kCOD9tj_BTPzysQ-G18dW9PS9dn4MiRlpHK2u-vUKr-IVRQM_LvXtehejNl-e3JVdz9j_QO0Si0iC3xbnITtiyT/s640/Hda_Rule_001.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="213" data-original-width="640" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPtGE6GgIVLJ8sGCfe5JsrguNeHhlge5ua3ulDrQKn1Re-atKIZte-0kCOD9tj_BTPzysQ-G18dW9PS9dn4MiRlpHK2u-vUKr-IVRQM_LvXtehejNl-e3JVdz9j_QO0Si0iC3xbnITtiyT/w400-h133/Hda_Rule_001.png" width="400" /></a></div><br /><p><br /></p><div style="text-align: left;">
<br clear="left" /></div>
<p>
詳しいことは、ここに書いてあるので読んでください。<a href="https://www.sidefx.com/ja/docs/houdini/assets/namespaces.html">https://www.sidefx.com/ja/docs/houdini/assets/namespaces.html</a>
</p>
<p>
なぜ、バージョンを付けたほうが良いかという理由は、<b><span style="color: #fcff01;">上書きしてしまうと今までの結果と異なってしまうことを避けるため</span></b>です。
</p>
<p><br /></p>
<p>他のオススメは、ヘルプに更新履歴を書くことです。</p>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzU9tRP4zugjgYTYOCG6xF9VwWgTmne34RGVN12mWLvIy5t57UCCxc-dXVo7fSeZky9bdOwjuzOedun8dGfhSWW6b5_rAw1LeABRmJnWPyYyVA0IarUujNWvCxNLZ3moGE0u4rN2d3EIWf/s1078/Hda_Rule_002.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1078" data-original-width="849" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzU9tRP4zugjgYTYOCG6xF9VwWgTmne34RGVN12mWLvIy5t57UCCxc-dXVo7fSeZky9bdOwjuzOedun8dGfhSWW6b5_rAw1LeABRmJnWPyYyVA0IarUujNWvCxNLZ3moGE0u4rN2d3EIWf/w504-h640/Hda_Rule_002.png" width="504" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>
</div>
<br clear="left" />
<div class="separator" style="clear: both; text-align: left;">
もちろん、パラメータの説明をヘルプにすべて書くのがベストですが、かなりの労力を使うので、<b><span style="color: #fcff01;">せめて更新履歴だけを書いてもらうようにしましょう</span></b>。
</div>
<div class="separator" style="clear: both; text-align: left;"><br /></div>
<div class="separator" style="clear: both; text-align: left;">
ヘルプについてですが、スクリプトで自動でベースをつくるのがオススメです。自分で書くのは面倒な方は、こういったツールを公開してくれてる人がいますので、使ってみてはいかがでしょうか?</div>
<div class="separator" style="clear: both; text-align: left;"><a href="https://vimeo.com/197432788" target="_blank"> https://vimeo.com/197432788</a></div>
<div class="separator" style="clear: both; text-align: left;"><br /></div>
<div class="separator" style="clear: both; text-align: left;">
一応、私が<a href="https://github.com/ShoheiOkazaki/Nagamochi" target="_blank">公開してるツール群</a>にもあります。
</div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRv6kblvQmbFekS2Q0QLjqxRdbwKEmGKUmy8qFLxUzqX-MfNosEtqFkZybM11UZBEv8MyWKzwJaoK89DYQ_TtsGjJqHBvaKDvQBmOrl52HRPghvkort6-a5ACZar4cEDwL7_TUIGCt4wSL/s716/Hda_Rule_003.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="100" data-original-width="716" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRv6kblvQmbFekS2Q0QLjqxRdbwKEmGKUmy8qFLxUzqX-MfNosEtqFkZybM11UZBEv8MyWKzwJaoK89DYQ_TtsGjJqHBvaKDvQBmOrl52HRPghvkort6-a5ACZar4cEDwL7_TUIGCt4wSL/w640-h90/Hda_Rule_003.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><br /></div><br /></div>
<h1 style="text-align: left;"></h1>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px; text-align: left;">
<span style="font-size: large;">シーン作業ルール</span>
</h2>
<p style="font-size: medium; font-weight: 400;">
チームで作業するなら、ある程度のルールを決めたほうがいいです。他の人にシーンを引き継いでもらうときに、わかりやすくしてあげる必要があります。</p><p style="font-size: medium; font-weight: 400;">経験ある方も多いと思いますが、自分が作った2ヶ月前のシーンファイルをみて、何やってんだこれは?という状態になったことはありませんか。ノードの名前ちゃんとしておけばよかったとか思うでしょう。自分以外の人が見たらきっとなおさらわからないでしょう。</p><p style="font-size: medium; font-weight: 400;">ガチガチにルールを決めると返って作業しづらくなるので、最低限のルールを決めて他の人がみても理解しやすくなるように心がけましょう。
</p>
<p style="font-size: medium; font-weight: 400;">
ここでは私自身が取り入れている、いくつかの例をお見せします。
</p>
<p style="font-size: medium; font-weight: 400;"></p>
<ol style="text-align: left;">
<li>ノードの色</li>
<li>ノードの配置</li>
<li>再現性ある組み方</li>
</ol>
<p style="font-size: medium; font-weight: 400;"><br /></p>
<p style="font-size: medium; font-weight: 400;">
まずはノードの色。例えばこんなシーンを渡されて「あとはよろしく」と言われてもどこをいじればいいか戸惑うでしょう。
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWAZag8r2BLQu13wnL-W-fvaiZLYBglzBv6mBtZDp98zL6xWG1Qdk7cOPi6CFcRm5sbe73MOKQf9zpc2KuZWnNBH5uxjXRphwYVDKoj8h8Pf7LlsMQPf7IUMemMODWnLXEm9QYRrDPMXml/s2026/scene_rule_001.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1058" data-original-width="2026" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWAZag8r2BLQu13wnL-W-fvaiZLYBglzBv6mBtZDp98zL6xWG1Qdk7cOPi6CFcRm5sbe73MOKQf9zpc2KuZWnNBH5uxjXRphwYVDKoj8h8Pf7LlsMQPf7IUMemMODWnLXEm9QYRrDPMXml/w640-h334/scene_rule_001.png" width="640" /></a></div><br /><p style="font-size: medium; font-weight: 400;"><br /></p><div style="text-align: left;"><br /><br /></div>
<br />
<br clear="left" />
<p style="font-size: medium;"><b><span style="color: #fcff01;">
ノードの色にルールを持たせておけば色がついたノードだけを気にかければいいし、色によって意味が違うと判断もしやすくなります</span></b><span style="font-weight: 400;">。例えばこんなルールです。
</span></p>
<p style="font-size: medium; font-weight: 400;"></p>
<ul style="text-align: left;">
<li>黄色 : 絵作り等に必要な重要な調整をしてる</li>
<li>緑色 : キーフレームかアニメーションを追加してる</li>
<li>赤色 : プロシージャルではない</li>
<li>紫色 : 他のノードへ出力されている</li>
<li>青色 : Viewportでアトリビュートの値を確認</li>
</ul>
<p style="font-size: medium; font-weight: 400;">
色がついていないノードは無視していいくらいです。上の添付だと1割も重要なノードは無いことがわかると思います。
</p>
<p style="font-size: medium; font-weight: 400;"><br /></p>
<p style="font-size: medium; font-weight: 400;">
ノードの配置にルールをもたせれば、どこに何があるかを把握しやすくなるかもしれません。OBJレベルには、カメラ・ライト・Alembicインポート・作業ノード・レンダー専用のノードといった様々な役割をもったノードが混在してしまいます。個人個人で色んな配置をされるとシーファイルを紐解くのに無駄な時間がかかります。
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgMTJ2zcoDsPufeNuR6TgVPON7Iif9N6qDVDbBJFI8GM1CIR_8P-2SGNl-BusVyY7gl1gbD2dy_IRLJoPrOjY81j2bLp9q5Dy6oB1Hw58CrrMrTjPPXXj3H7GO5u_d7915Vcnr73z_cO5w/s1058/scene_rule_002.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1058" data-original-width="635" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgMTJ2zcoDsPufeNuR6TgVPON7Iif9N6qDVDbBJFI8GM1CIR_8P-2SGNl-BusVyY7gl1gbD2dy_IRLJoPrOjY81j2bLp9q5Dy6oB1Hw58CrrMrTjPPXXj3H7GO5u_d7915Vcnr73z_cO5w/w384-h640/scene_rule_002.png" width="384" /></a></div><br /><p style="font-size: medium; font-weight: 400;"><br /></p><div style="text-align: left;"><br /><br /></div>
<br clear="left" />
枠組みを最初から用意してやって、そこにあったノードを配置するのもありでしょう。<br />
<p style="font-size: medium; font-weight: 400;"><br /></p>
<p style="font-size: medium; font-weight: 400;">
最後の再現性のある組み方をするですが、どういうことかと言うキャラクタのアニメーションが更新されたり、中間キャッシュが全てなくなっても、一番最後のノードをレンダーすれば、全てを再現できる組み方をすることです。
</p>
<p style="font-size: medium; font-weight: 400;">
これをやるには/outにすべてのキャッシュノードとレンダーノードが集まっていて、それらが順番に繋がれている必要があります。ディペンデンシーを組むです。Dispacherを使ってる人はやっていることだと思います。
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzK8vQCOddukvrO1VEPM28R6CwcyoFGoB0Nb5jPgyV6qvqMS7820sqFoVljLSQp4ZaXe046egZIJinwuca3869bXNZ12ZizC_itBsjplUb5jz5VKUQ6LjRAO8erwJM-mtL2huWYQLqy4tE/s833/scene_rule_003.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="618" data-original-width="833" height="476" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzK8vQCOddukvrO1VEPM28R6CwcyoFGoB0Nb5jPgyV6qvqMS7820sqFoVljLSQp4ZaXe046egZIJinwuca3869bXNZ12ZizC_itBsjplUb5jz5VKUQ6LjRAO8erwJM-mtL2huWYQLqy4tE/w640-h476/scene_rule_003.png" width="640" /></a></div><br /><p style="font-size: medium; font-weight: 400;"><br /></p><div style="text-align: left;"><br /><br /></div>
<br />
<br clear="left" />
<p style="font-size: medium; font-weight: 400;">
そして、この組み方をしておけば、アニメーションが更新されたり、別ショットにまるまるシーンをコピーしてもっていったとしても、一番最後のノードのレンダーボタンを押せば、すべてが更新されることが可能です。これぞプロシージャル、これぞHoudiniという使い方です。
</p>
<p style="font-size: medium; font-weight: 400;">
これを心がけるのは面倒かもですが、Houdiniの基本、プロシージャルに組むということの鍛錬にもってこいです。
</p>
<p style="font-size: medium; font-weight: 400;"><br /></p>
<p> </p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">OnCreated.py</span>
</h2>
<p>
キャッシュは独自のファイルキャッシュをつくって出力先を気することはなくなりましたが、レンダー系はどうしたらいいでしょうか。これはノードが作られた時にパラメータを自動でセットする仕組みを作りましょう。
</p>
<p>
<a href="https://www.sidefx.com/ja/docs/houdini/hom/locations.html#node_event_files">https://www.sidefx.com/ja/docs/houdini/hom/locations.html#node_event_files</a>
</p>
<p>
HOUDINIPATH/scripts/OnCreated.pyはすべてのノードが作られた時に実行されます。<br />ただ、これには問題があります。HOUDINI_PATHでいくつかのパッケージを読み込んでいて<b>OnCreated.pyが複数あった場合、一番最初(確か)のOnCreateしか実行されません</b>。複数のパッケージでこれを使いたい場合、運用方法を考える必要があります。</p><p>OnCreateはすべてのノードに対して実行されますが、指定したノードのみを実行するには、HOUDINIPATH/scripts/<i>category</i>/<i>nodename_event</i>.pyにファイルをつくります。例えば、MantraならHOUDINIPATH/scripts/out/ifd_OnCreated.pyにファイルを作ります。</p><p>こんなスクリプトを書くと書き出し先の設定とバージョンのパラメータを追加できます。</p><pre class="prettyprint"><code class="language-python">n = kwargs['node']
n.parm('vm_picture').set("$HIP/../render/${OS}/${OS}_`chs('version')`.$F4.exr")
parmnum = 8
addVerParm = eval('hou.%sParmTemplate("%s", "%s", 1,default_value=(["%s"]))' % ('String', 'version', 'Version ', 'v001'))
parm = n.parms()[parmnum]
parmTmp = parm.parmTemplate()
parmGroup = n.parmTemplateGroup()
parmIndex = parmGroup.findIndices(parmTmp.name())[0]
parmGroup.insertAfter(parmGroup.parmTemplates()[parmIndex],addVerParm)
n.setParmTemplateGroup(parmGroup)</code></pre><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJasJfuMP2ECbXUM1y-dgyqb-3VqKea-GSgre_68LEWcULDkBEjZcVdqFImOfIG3N8Bi7mh6NBIXxmdiB7P0w_OnI8NvRqIrhO09WUZZynww61LJId85_YLiQ8dJmUuEH9KZms1Rg01-Cz/s758/OnCreated_001.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="395" data-original-width="758" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJasJfuMP2ECbXUM1y-dgyqb-3VqKea-GSgre_68LEWcULDkBEjZcVdqFImOfIG3N8Bi7mh6NBIXxmdiB7P0w_OnI8NvRqIrhO09WUZZynww61LJId85_YLiQ8dJmUuEH9KZms1Rg01-Cz/w640-h334/OnCreated_001.png" width="640" /></a></div><br /><p><br /></p>
<div class="separator" style="clear: both; text-align: center;"><br /></div><p style="font-size: medium; font-weight: 400;"><br clear="left" />
</p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">456.py</span>
</h2>
<p>
色々ルールを作っても、すべてを遵守してもらうのは大変です。なのでルールや変数が正しいかをチェックする機能を作りましょう。
</p>
<p>
例えば、現在開いてるシーンの$SEQ,
$SHOTの値は正しいか、フレームレンジは正しいかです。タイムレンジはShotgunからひっぱて比較してもいいでしょう。
</p>
<p>
また、カメラが変更されたら作業者は、自分がインポートして使ってるカメラのパスを見て最新かどうかチェックしないといけません。まともな前工程だったらカメラの変更を教えてくれるかもしれませんが、無言で更新することさえあります。めんどくさいですね。なぜ前工程のせいで後工程が・・・以下略
</p>
<p>
FXの仕事をしていて、モデルやアニメーションが完全にファイナルの状態、ライティングもFXのために用意されてる状態で作業できることなんてあるでしょうか?夢のような状態ですね。<br />作業中にカメラが変わったり尺が変更されても対応できるようにしておきましょう。今使ってるカメラ・アセット・タイムレンジが最新なのかを、シーンファイルを開いた時にチェックできるようしてもいいでしょう。</p>
<p>
Houdiniではシーンファイルを開いた時に動くPythonは456.pyといいます。<a href="https://www.sidefx.com/ja/docs/houdini/hom/locations.html#startup">https://www.sidefx.com/ja/docs/houdini/hom/locations.html#startup</a><br />ここに置きます。HOUDINIPATH/scripts/456.py</p>
<p>Dispacherを使ってサーバで回すときは、これが動かないような仕組みを入れておいたほうが安全でしょう。</p>
<p>
正直ここはパイプラインがしっかりしていないと使う機会がないかもしれません。とりあえずシーンファイルを開いたときに、シーンの中身をPythonでチェックするすべはあるとだけは覚えておきましょう。
</p>
<p><br /></p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">beforescenesave.py</span>
</h2>
<p>
456.pyと同様、シーンを保存する時に何かしらのチェック機能が走ってもいいでしょう。
</p>
<p>
シーンファイルを開く時は456.py、シーンファイルを保存する直前に動くPythonは789.pyですと言いたいとこですが、そんなものはありません。シーファイルを保存する前に何かをしたい場合は、HOUDINIPATH/scripts/beforescenesave.pyここにファイルを作ります。</p><p>例えば、$SEQ、$SHOTをセットしたいけど、ファイルマネージャー無い場合どうしたらいいでしょうか。こういうフォルダ構造で作業している場合なら、シーンファイルの場所から$SEQ・$SHOTを割り出せます。</p><p>/proj/$PROJ/work/$SEQ/$SHOT/$DEPT/$USER</p><p>/proj/BurningProj</p><p>└── work</p><p> └── seq_01</p><p><span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── shot_003</p><p><span> </span><span> </span><span> </span><span> </span><span> <span> <span> </span><span> </span><span> </span></span></span>└── fx</p><p><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> <span> </span><span> </span><span> </span></span>└── shohei</p><p> <span> </span><span> </span><span> </span>└── houdini</p><p><span> </span></p><p><span>Pythonで書くとこんな感じでしょうか。AliasVariablesの値があるかを確認するためにhou.hscript("setenv -s SHOT")を使ってます。これを使わないとグローバルの環境変数に同じ変数があった場合、そちらの値を参照してしまうので、この方法を取りました。</span></p>
<pre class="prettyprint" style="height: 20em; overflow-x: scroll; overflow-y: scroll; overflow: scroll;"><code class="language-python">import hou
hipfolder = hou.getenv('HIP')
dirs = hipfolder.split('/')
new_PROJ = dirs[-6]
new_SEQ = dirs[-4]
new_SHOT = dirs[-3]
get_PROJ = hou.hscript("setenv -s PROJ")
if 'undefined' in get_PROJ[0]:
get_PROJ = None
else:
get_PROJ = get_PROJ[0].split('\t= ')[1].split('\n')[0]
get_SEQ = hou.hscript("setenv -s SEQ")
if 'undefined' in get_SEQ[0]:
get_SEQ = None
else:
get_SEQ = get_SEQ[0].split('\t= ')[1].split('\n')[0]
get_SHOT = None
get_SHOT = hou.hscript("setenv -s SHOT")
if 'undefined' in get_SHOT[0]:
get_SHOT = None
else:
get_SHOT = get_SHOT[0].split('\t= ')[1].split('\n')[0]
print hou.hscript("setenv -s HIP")
chk_env_exist = get_PROJ and get_SEQ and get_SHOT
chk_env_compare = get_PROJ == new_PROJ and get_SEQ == new_SEQ and get_SHOT == new_SHOT
if (chk_env_exist==None or chk_env_compare==False):
ui_chk_env = hou.ui.readMultiInput(message ="Current Local Variables is not Correct.\nDo you want fix it?\n\nCurrent:\nPROJ = {}\n SEQ = {}\nSHOT = {}".format(get_PROJ,get_SEQ,get_SHOT),
input_labels = ["PROJ"," SEQ","SHOT"],
title = "Multi TextField Dialog",
initial_contents =[new_PROJ,new_SEQ,new_SHOT],
buttons=["Accept","Cancel"])
if ( ui_chk_env[0] == 0 ):
hou.hscript("setenv PROJ=\'{}\'".format(ui_chk_env[1][0]))
hou.hscript("setenv SEQ=\'{}\'".format(ui_chk_env[1][1]))
hou.hscript("setenv SHOT=\'{}\'".format(ui_chk_env[1][2]))</code></pre>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">作っておいたほうがいいノード</span>
</h2>
<p><b>カメラ</b></p>
<p>
前述したように、他DCCからデータを持ってきた時に、シーンスケールを直さないといけません。カメラも同様です。インポートしたカメラノードの上にNullを作ってNullのスケールを0.1とかにしてますか?ま、Houdiniに詳しい人がいる会社なら、そんなことしてませんよね。<b><span style="color: #fcff01;">Volumeの見た目が薄くなってしまいます</span></b>。解決策は調べればでてくるので説明はしません。Chopでやったほうがいいでしょう。
</p>
<p><br /></p>
<p>私が公開してるツール群のなかにカメラもあるので興味あれば見てください。</p>
<p>
<a href="https://github.com/ShoheiOkazaki/Nagamochi/blob/master/common/otls/OBJ__nmWorkCam.hda" target="_blank">
https://github.com/ShoheiOkazaki/Nagamochi/blob/master/common/otls/OBJ__nmWorkCam.hd</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdJnJCRr7fNEjnq2MPZHbOIwwi9GJhc3B1d13QyKW67RGTGjC4HUQ58zOaMhC37FtEM4vv_A2wIISVvOjKGYa5KddBbjWj5HgXAr523lT-HacfmZSdzzthCTc63XW8pzKrUCB8nM8B9Zw6/s744/recommend_node_cam.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="405" data-original-width="744" height="348" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdJnJCRr7fNEjnq2MPZHbOIwwi9GJhc3B1d13QyKW67RGTGjC4HUQ58zOaMhC37FtEM4vv_A2wIISVvOjKGYa5KddBbjWj5HgXAr523lT-HacfmZSdzzthCTc63XW8pzKrUCB8nM8B9Zw6/w640-h348/recommend_node_cam.png" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<br clear="left" />
<p><br /></p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">おまけ:PDG</span>
</h2>
<p>
キャッシュの保存先でストレージの管理をしやすくと言いましたが、お高いファイルサーバーとかだとディスク使用量を解析できるツールがあったりして、誰がどれくらい使ってるかは結構容易にみることができます。ないとこはどうしましょう。
</p>
<p>
安心してください。私達には最近PDGという強力なツールを手に入れたので、ディスク使用量も把握が楽になりました。
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieOjVWcXa8-v1BmXptVKF-0t_dt-AUKxiZ_92acW6QUG3lEkH05mElNoSmxQUL-IsG4xZxvW48Bam_xt2p2juv56PFaAMSEEX5M4h9-a9oi_JaO9Rf3Dp4uKxIq0iJASnLWzPR-qJsWUJr/s2157/PDG_001.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="973" data-original-width="2157" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieOjVWcXa8-v1BmXptVKF-0t_dt-AUKxiZ_92acW6QUG3lEkH05mElNoSmxQUL-IsG4xZxvW48Bam_xt2p2juv56PFaAMSEEX5M4h9-a9oi_JaO9Rf3Dp4uKxIq0iJASnLWzPR-qJsWUJr/w640-h288/PDG_001.png" width="640" /></a></div><br /><p><br /></p><div style="text-align: left;"><br /><br /></div>
<br clear="left" />
<p>CSVファイルで保存されるので、これをGoogleSpreadSheat等にコピーし、メンバーに共有しましょう。各ユーザーのキャッシュやシーンファイル・レンダーに使ってる容量の一覧を出すのが簡単になります。便利な時代だ。</p>
<p><google-sheets-html-origin></google-sheets-html-origin></p><table border="1" cellpadding="0" cellspacing="0" dir="ltr" style="border-collapse: collapse; border: medium none; font-family: Arial; font-size: 10pt; table-layout: fixed; width: 0px;" xmlns="http://www.w3.org/1999/xhtml"><colgroup><col width="100"></col><col width="307"></col><col width="100"></col></colgroup><tbody><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"folderCacheType"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">folderCacheType</td><td data-sheets-value="{"1":2,"2":"directory"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">directory</td><td data-sheets-value="{"1":2,"2":"directorySize"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">directorySize</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_009/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_009/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":84.7}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">84.7</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_009/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_009/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":0.1}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0.1</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_009/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_009/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":17.2}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">17.2</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_011/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_011/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":18.9}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">18.9</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_011/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_011/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":0.2}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0.2</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_011/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_011/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":19}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">19</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_015/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_015/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":47.7}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">47.7</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_015/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_015/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":0.1}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0.1</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_015/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_015/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":14.2}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">14.2</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_017/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_017/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":6}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">6</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_017/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_017/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":0.1}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0.1</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_010/shot_017/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_010/shot_017/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":10.9}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">10.9</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_040/shot_003/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_040/shot_003/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":895.3}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">895.3</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_040/shot_003/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_040/shot_003/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":18.3}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">18.3</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_040/shot_003/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_040/shot_003/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":347.3}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">347.3</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_070/shot_001/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_070/shot_001/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":283.9}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">283.9</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_070/shot_001/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_070/shot_001/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":0.8}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0.8</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_070/shot_001/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_070/shot_001/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":124.4}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">124.4</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">cache</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_070/shot_004/fx/shohei/cache"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_070/shot_004/fx/shohei/cache</td><td data-sheets-value="{"1":3,"3":29.5}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">29.5</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">houdini</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_070/shot_004/fx/shohei/houdini"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_070/shot_004/fx/shohei/houdini</td><td data-sheets-value="{"1":3,"3":0.6}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0.6</td></tr><tr style="height: 21px;"><td data-sheets-value="{"1":2,"2":"render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">render</td><td data-sheets-value="{"1":2,"2":"/proj/BurningProj/work/seq_070/shot_004/fx/shohei/render"}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">/proj/BurningProj/work/seq_070/shot_004/fx/shohei/render</td><td data-sheets-value="{"1":3,"3":0}" style="border: 1px solid rgb(204, 204, 204); font-family: "Liberation Sans"; font-size: 8pt; font-weight: normal; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">0</td></tr></tbody></table><p><br /></p><p><br /></p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;"> </span>おまけ:Launcherもどき
</h2>
<p>
最初の方で環境変数を設定するところで、ショットの情報を定義してはどうかと書きました。$PROJ,
$SEQ,
$SHOTのことです。シーンファイルをオープンセーブする自社ツールがあるなら、これらをセットするのは簡単です。そういうツールがない場合は、Shellからソフトを起動するやり方を紹介します。</p><p>まず作業するPROJ SEQ SHOTを指定してから、ソフトを起動するようにします。</p><p>Linuxでは.bashsrcにaliasを登録します。ここではprojsetとします。</p>
<pre class="prettyprint"><code class="language-bash">function projset() {
export 'PROJ='$1;
export 'SEQ='$2;
export 'SHOT='$3;
export 'HOUDINI_HIP_DEFAULT_NAME='$1'_'$2'_'$3'_FX_ELEMENT_v001.hip';
cd '/proj/'$1'/work/'$2'/'$3'/fx/'$USER/houdini;
}
alias projset=projset</code></pre>
<p>Shellでprojset [PROJ] [SEQ] [SHOT]をタイプすると、そのShotのフォルダに移動します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiddalCGvVZfB5iYbCTjJ3cMMbNm6vdXK5TR0-6pQwp5UJtYJIm1vHkXaetH478bCYKjT3Sa534ZqRdIU1Xa0upiBudErlHyg249iLYJfA8UswBeiVnYvrumZHIVqhwihkfCR3KulNIl1d/s927/launcher_001.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="213" data-original-width="927" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiddalCGvVZfB5iYbCTjJ3cMMbNm6vdXK5TR0-6pQwp5UJtYJIm1vHkXaetH478bCYKjT3Sa534ZqRdIU1Xa0upiBudErlHyg249iLYJfA8UswBeiVnYvrumZHIVqhwihkfCR3KulNIl1d/w640-h148/launcher_001.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p>
<br clear="left" />
これでHoudiniを起動すると、$HIPが任意の場所になり、ファイルのデフォルトの名前もセットされるので、セーブ・オープンともに楽になります。<br />houdiniは起動したフォルダがHIPになります。HOUDINI_HIP_DEFAULT_NAMEを設定すると、ファイルの名前を変えられます。デフォルトはuntitled.hipですね。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrhyphenhyphenGLQuTlvEK1sMpGdpCDuKke68egehqRzAfUDAsdxqY1zqb3_B5_MyCgBoklQl4i8_IJCm_yVlEGq8OK7axHxkoXXoFtwZfArC9pcx8FsD8w8gR4E-191Fw5Mnkeq64ZPYOzO9fdjyL/s1189/launcher_002.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="488" data-original-width="1189" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDrhyphenhyphenGLQuTlvEK1sMpGdpCDuKke68egehqRzAfUDAsdxqY1zqb3_B5_MyCgBoklQl4i8_IJCm_yVlEGq8OK7axHxkoXXoFtwZfArC9pcx8FsD8w8gR4E-191Fw5Mnkeq64ZPYOzO9fdjyL/w640-h262/launcher_002.png" width="640" /></a></div><br /><div style="text-align: left;"><br /></div>
<br clear="left" />
<p>Windowsの場合はprojset.batというファイルを、aliasを読み込むことが出来るフォルダに保存。</p>
<pre class="prettyprint"><code class="language-bash">@echo off
set PROJ=%1
set SEQ=%2
set SHOT=%3
set HOUDINI_HIP_DEFAULT_NAME=%1_%2_%3_FX_ELEMENT_v001.hip
cd /D W:
cd Z:\proj\%1\work\%2\%3\fx\%USERNAME%\houdini
echo PROJ=%1 SEQ=%2 SHOT=%3
echo HOUDINI_HIP_DEFAULT_NAME=%1_%2_%3_FX_ELEMENT_v001.hip</code></pre>
<p><br /></p>
<p><br /></p>
<h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;">
<span style="font-size: large;">サンプル</span>
</h2>
<p>
長ったらしい文だけど分かりづらいと思うので、サンプルファイルを作りました。サンプルシーンも入ってます。</p>
<p><a href="https://drive.google.com/file/d/1Po3sTjZq_-YMfbEbCdpT4WFuP3oiXOpU/view?usp=sharing" target="_blank">https://drive.google.com/file/d/1Po3sTjZq_-YMfbEbCdpT4WFuP3oiXOpU/view?usp=sharing</a></p><p>使い方は、まず解凍したら、フォルダをどこかに置いてください。</p>
<p>以下2つのjsonファイルの中身のREPLACEという文字を解凍した場所に置き換えてください。</p><p>SampleWorkFlow/packages/BurningProj.json<br />SampleWorkFlow/BurinungProj_User.json</p><p>そしてSampleWorkFlow/BurinungProj_User.jsonを、$HOME/houdini18.5/packages/にコピーしてください。</p><p><br /></p><h2 style="border-bottom: 2px solid rgb(255, 250, 240); border-left: 10px solid rgb(255, 250, 240); padding-left: 10px;"><span style="font-size: large;">おわりに</span></h2><p>ここまで、紹介したことすべてが必要不可欠で最適解だとは考えていません。10年以上Houdiniメインで仕事をしてきて、私がフルスロットで仕事する上に最低限必要ないくつかを紹介させていただきました。</p>
<p>Houdini Workflow作るにはPythonは必須です。OdForceやSideFXのフォーラムにたくさんのサンプルがあります。Gitにもあがってるので調べれば大半はでてきます。最初はPythonを書かない簡単なものから始めてもいいでしょう。キャッシュファイルを作るとかでもいいと思います。</p>
<p>コロナで他の会社の人と交流する機会も減り、情報交換もしづらい世の中になっています。私がいると、こんな感じでやってますが、みなさんはどんなことをしていますか?こんなのが面倒くさいから、こういうのが欲しいみたいな意見でもいいので、ぜひ皆さんからの意見をお待ちしてます。
</p>
<p><br /></p>
<p></p>
Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-69904743614535473112019-02-12T09:30:00.000+09:002019-02-12T10:21:07.408+09:00FX的 Height Fieldの使い方今回は、Height Fieldです。<br />
FXは、Height Fieldの恩恵は、あまりないと思いますが、個人的なFX的使い方を紹介します。<br />
<br />
サンプルファイルです。17.0.459で作成。<br />
<a href="https://drive.google.com/open?id=1_-5SP8ltkWlC_JtBdGq3u9PpNmvl8A2d" target="_blank">https://drive.google.com/open?id=1_-5SP8ltkWlC_JtBdGq3u9PpNmvl8A2d</a><br />
<br />
<a name='more'></a><br />
<br />
<div style="border-bottom: 2px solid #FFFAF0; border-left: 10px solid #FFFAF0; font-weight: bold; padding-left: 10px;">
<h3>
Terrain Object</h3>
</div>
<br />
Height Filedの実装にともないTerrain Object DOPにUse Heightfiledというオプションが追加されました。<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk4UxXrjq6h6sbYSTAcl6jlvL-jsBfs0vtLEE2A_p4WFbnPVVGMEcxb6K3NtMhch-GVeNxLoNwnCclS-vrAuHU6JgAe_BuOKyGqUSBvig8xG4fzFrtQ-me3GB025vhEuayaAM0K1IbGxGY/s1600/blog_height_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="515" data-original-width="985" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk4UxXrjq6h6sbYSTAcl6jlvL-jsBfs0vtLEE2A_p4WFbnPVVGMEcxb6K3NtMhch-GVeNxLoNwnCclS-vrAuHU6JgAe_BuOKyGqUSBvig8xG4fzFrtQ-me3GB025vhEuayaAM0K1IbGxGY/s400/blog_height_001.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
今までは、Particleと地面の詳細なコリジョン結果を得るには、このノードのVolumeに変換する所のオプションにてDivisionSizeをあげて高解像度にするか、StaticObjectをつかってSurface Collisionを使用したりしてました。どちらも、軽いものではありませんね。<br />
Height Filedは、どこかの軸が2000を超えてもなんてことありません。普通のVolumeのならめっちゃ重いですよね。これを使うなんて、さすがSideFX。<br />
<br />
<br />
さて実際の使い方は、Environment Modeler等が作ってくれた地形等を読み込み、HeightField ProjectでHeightFiledに変換します。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZGxoccLYChmu16B601fwSoNJq40R54_DSUQhxTNkN_s1RAZWBWQpwTt1yevpsS683BYiWiQBrZtHTtyqsKUCHpx8QVG4nQa4MvU0uYY8UuJclZzCyh5jcKF7c_X6G3H1h0xY_ilzAc0e0/s1600/blog_height_002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="477" data-original-width="1032" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZGxoccLYChmu16B601fwSoNJq40R54_DSUQhxTNkN_s1RAZWBWQpwTt1yevpsS683BYiWiQBrZtHTtyqsKUCHpx8QVG4nQa4MvU0uYY8UuJclZzCyh5jcKF7c_X6G3H1h0xY_ilzAc0e0/s400/blog_height_002.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVuL5BahrIVjZ5QvLJiPD78-ykMcpdwykfSdXIjUWQGzRzFvQRVTHfMvNeG2O9ZcJDzygwyakXMxBrvqrqftBFL2SuuPe4gYzFnJICPicOovHm5ywrJg-qHoy1mzIEGiWInt5qqjj32e8-/s1600/blog_height_003.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVuL5BahrIVjZ5QvLJiPD78-ykMcpdwykfSdXIjUWQGzRzFvQRVTHfMvNeG2O9ZcJDzygwyakXMxBrvqrqftBFL2SuuPe4gYzFnJICPicOovHm5ywrJg-qHoy1mzIEGiWInt5qqjj32e8-/s400/blog_height_003.gif" width="400" /></a></div>
<br />
シミュレーションの範囲を決めて、より効率的に作業するならHeightField Cropを使いましょう。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPPyJ5dnDvTKK3PL_-HjtrT44OdRdEHkh38qce13vKKD61OVxEIGkTXqNbHPOowEDFYCWJMs8SaVzAzzek4x1HO9rxRo96BEF3IZyTTuMMiuaaDBgR9S-wThsjwBvLZcQk4sv2jzz-_lmi/s1600/blog_height_004.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPPyJ5dnDvTKK3PL_-HjtrT44OdRdEHkh38qce13vKKD61OVxEIGkTXqNbHPOowEDFYCWJMs8SaVzAzzek4x1HO9rxRo96BEF3IZyTTuMMiuaaDBgR9S-wThsjwBvLZcQk4sv2jzz-_lmi/s400/blog_height_004.gif" width="400" /></a></div>
<br />
小さな石とかデブリがあったら、それごとProjectionしても、そこそこ使えます。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS-J9OzUOnXYVFZeSWEMvVwNahBJa3x1xDfx0GJ0lmGW-16QVHqFVwzH_EyQ1rXKX-ygcw4YniMpms2gE8M2WOODdVBIKvESFkXv1prURZiGkpuAkO5ky1kwsUemoNzgqQV8S2MtD9jSD4/s1600/blog_height_005.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS-J9OzUOnXYVFZeSWEMvVwNahBJa3x1xDfx0GJ0lmGW-16QVHqFVwzH_EyQ1rXKX-ygcw4YniMpms2gE8M2WOODdVBIKvESFkXv1prURZiGkpuAkO5ky1kwsUemoNzgqQV8S2MtD9jSD4/s400/blog_height_005.gif" width="400" /></a></div>
<br />
え、Displacement・Bumpを使ってたらどうするんだって?<br />
Point CloudでUVを持ってきて、Textureをインポートして、 足し算。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQQZeHfMgOZcFmG4ktkNZUv-0V5BgBdsM226kULMtQEt1jYJztgJpHsO1YHX2ERg5lfHgEGifEvstAmTMI0_yF7iIuNZN2KRs9ARQsaR8emp_qzleOsVpiypwt8mIHTsQY2fjHgIWhvAFG/s1600/blog_height_006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="366" data-original-width="989" height="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQQZeHfMgOZcFmG4ktkNZUv-0V5BgBdsM226kULMtQEt1jYJztgJpHsO1YHX2ERg5lfHgEGifEvstAmTMI0_yF7iIuNZN2KRs9ARQsaR8emp_qzleOsVpiypwt8mIHTsQY2fjHgIWhvAFG/s400/blog_height_006.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBiUzHVBGjnD-vhbuC7jDqod4STbbV6qBxQajoN2UtTU8HxKR-aT_GBpXVlF6Eo3iDlwVVYgwyIh7HyYAQvoOeZTRfVb2_jApi7XYTAGeNJwY2aRErgDvz-s18aD1C7RNXxzJeI2O3yu2U/s1600/blog_height_007.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBiUzHVBGjnD-vhbuC7jDqod4STbbV6qBxQajoN2UtTU8HxKR-aT_GBpXVlF6Eo3iDlwVVYgwyIh7HyYAQvoOeZTRfVb2_jApi7XYTAGeNJwY2aRErgDvz-s18aD1C7RNXxzJeI2O3yu2U/s320/blog_height_007.gif" width="320" /></a></div>
<br />
それだとNormal考慮してないってか。インポートしたGeometryをSubdivisionをめっちゃかけて、SopでDisplacementするしかないですかね。<br />
<br />
Packでコレ使うと、めっちゃ重いからVolume Collision使わないで、普通にBulletでConcaveにしたほうが良いです。 <br />
<br />
<br />
<div style="border-bottom: 2px solid #FFFAF0; border-left: 10px solid #FFFAF0; font-weight: bold; padding-left: 10px;">
<h3>
Boolean Cutter</h3>
</div>
<br />
続いては、別の使い方の紹介。BooleanのShatterに使ってみましょう。<br />
そもそもBooleanを使う時の重要な点は、如何にエラーのないGeometryを作り出しレンダリングできるようにするかです。「エラー」とは<a href="http://help.autodesk.com/view/MAYAUL/2016/JPN/?guid=GUID-8E97CEF7-1CFE-4838-B4B7-59F526E21AB2" target="_blank">Manifold Topology</a>になっていないものが生成されたり、Alembicを使って他のツールにGeometryとしてインポートするときに起こりうる問題の要因のことを指します。Houdini内で完結する場合は、これらの問題があっても気にせずレンダリングできることが多々です。<br />
<br />
<br />
なぜBooleanに使うのか?それはHeightFiledの特徴が気に入ったからです。<br />
<br />
<b>特徴1:軽い </b><br />
前述した通り挙動が軽いです。破壊の断面はディティールが欲しくなります。通常だったら、面を細かく分割してPointにNoiseをかけたりしますが、結構動作重いです。軽いは良いです。<br />
<br />
<b>特徴2:Topology </b><br />
HeightFieldをPolygonにコンバートして、それをDisplacementした方向からTopoloyを見ると綺麗な格子状になっています。<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSuxRQOqoWJeXeXQ8K6qsb3qLFub6oNrct2A2rSxV4OAN0jHwmiZvtPDxjoQJF4YP5atjAWjqpM_DsBpY-izjMRlNJFLp13FgZ5jCe030K2Sxc6yJ4aITKOIb1Kp950ZIFLYcI24i66zcT/s1600/blog_height_008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="356" data-original-width="1278" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSuxRQOqoWJeXeXQ8K6qsb3qLFub6oNrct2A2rSxV4OAN0jHwmiZvtPDxjoQJF4YP5atjAWjqpM_DsBpY-izjMRlNJFLp13FgZ5jCe030K2Sxc6yJ4aITKOIb1Kp950ZIFLYcI24i66zcT/s640/blog_height_008.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
エラーTopologyを最も生成しやすい要因は、このNoiseのカッターを作ってる時です。GeometryのPointsに対して、強いNoiseをかけると、自身の面と干渉してしまいます。これは、あまり良くないです。</div>
<div class="separator" style="clear: both; text-align: left;">
そして、綺麗なTopologyということは、ここからUVが作りやすいです。 </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
それでは、実際の手順の説明です。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXWc-iAERpPjfVlqLjzIeITqm3gc9WGjzIxY_p0HCE5skPJ7f1YbXNOGkfI6Ifka5kmG8KgRE30yaprV2eK_inHTzf6mZyUK0zMDPjtbsWYGsz0L2-qubX0zH-qwY_jbxMwIvMeOxW432o/s1600/blog_height_010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="588" data-original-width="588" height="398" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXWc-iAERpPjfVlqLjzIeITqm3gc9WGjzIxY_p0HCE5skPJ7f1YbXNOGkfI6Ifka5kmG8KgRE30yaprV2eK_inHTzf6mZyUK0zMDPjtbsWYGsz0L2-qubX0zH-qwY_jbxMwIvMeOxW432o/s400/blog_height_010.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
基本的には、普通よくあるやつと似てます。Point作って、HeightFiledのGridをコピーしてNoiseをかけます。</div>
<div class="separator" style="clear: both; text-align: left;">
Noiseをかける前に対象Geometryより少し大きめなBoundigBoxを使ってCropしてあげれば、より効率が良くなります。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtYdfRKk63VIb2BadOrmPUTlToUB-Oto3jo7LzGx-HxPGnOymQi5fh-L9HU00WISbMBoWxXbvKYkRKxQbPQiuE4c5ZJeZy3YKgV8z88JGhtxeMJverwA3nPM-9mGVP5cOLBLOt1EdPw809/s1600/blog_height_009.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtYdfRKk63VIb2BadOrmPUTlToUB-Oto3jo7LzGx-HxPGnOymQi5fh-L9HU00WISbMBoWxXbvKYkRKxQbPQiuE4c5ZJeZy3YKgV8z88JGhtxeMJverwA3nPM-9mGVP5cOLBLOt1EdPw809/s320/blog_height_009.gif" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
続いて、HeightFiledをMeshにコンバートし、UV ProjectでDisplacement方向からUVを転写。UV Layoutで一度整えます。このままだと高さが考慮されていないので、heightというPointAttrを使ってUVを調整します。</div>
<div class="separator" style="clear: both; text-align: left;">
Wrangleで縦横比をheihgtで乗算</div>
<pre class="prettyprint"><code class="language-c">vector bsize = getbbox_size(0);
float mult= bsize[0]/bsize[2];
@uv.y = point(0,"height",@ptnum)*mult;
</code></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoDG10erbshb6zCv9MtfGYplSG-eOUX4TA9Ynq4kPiECMsgQyIT4yW41L2QRfsuxudT_ROGQQhg7ekx9pVqCWMpWXH4JV_mTh2v2aXXdGbYydO3Nk7sHN8W1E3_jSvenwzhu93jh9h-7p6/s1600/blog_height_013.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="517" data-original-width="331" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoDG10erbshb6zCv9MtfGYplSG-eOUX4TA9Ynq4kPiECMsgQyIT4yW41L2QRfsuxudT_ROGQQhg7ekx9pVqCWMpWXH4JV_mTh2v2aXXdGbYydO3Nk7sHN8W1E3_jSvenwzhu93jh9h-7p6/s400/blog_height_013.png" width="255" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
最後に、UV Layoutでもう一度整えておしまいです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh58C8lcSMsJn82xnnA0DeqSTJGaeeeoBttfIaat6mbUuuSatWUuevPBg4Wpa3-vd_J_nqJM6zCOBo2XsQdHlTakuLc5ck9SHsof8J_bzEPWB8px0E1o6ylK4EbVxbDxBQ0xyvToUh7exo/s1600/blog_height_011.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="474" data-original-width="1280" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh58C8lcSMsJn82xnnA0DeqSTJGaeeeoBttfIaat6mbUuuSatWUuevPBg4Wpa3-vd_J_nqJM6zCOBo2XsQdHlTakuLc5ck9SHsof8J_bzEPWB8px0E1o6ylK4EbVxbDxBQ0xyvToUh7exo/s640/blog_height_011.gif" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Cutterの用意ができたら、あとは通常通りBooleanでShatterしましょう。<br />
その後は、Normal入れたり、<br />
Non-Manifoldを取り除くために、CleanかPolyDoctorで治しときましょう。エラーは出るときは出ます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCn5rCt1cj5U0T4yKj8wKth0Y97UoIHl59d2IeRtMs1Soc3t8xEapfn_lpDS0-2TtsvveaB95ZAvSQFtmyXVHcfGoua1z1KInCRGn-_4IormJy4PZnAKqp_PbSMRWVwtJRVA4Hjdz9a6Q2/s1600/blog_height_012.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="402" data-original-width="1600" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCn5rCt1cj5U0T4yKj8wKth0Y97UoIHl59d2IeRtMs1Soc3t8xEapfn_lpDS0-2TtsvveaB95ZAvSQFtmyXVHcfGoua1z1KInCRGn-_4IormJy4PZnAKqp_PbSMRWVwtJRVA4Hjdz9a6Q2/s640/blog_height_012.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
ここまでUVがあれば、ModelerやLookDevにTexture・Shaderを作ってもらうために壊したものを戻しても、文句は言われないでしょう。きっと。</div>
<br />
ということで、今回は本来の用途とは違った使い方の紹介でした。<br />
他にも、こんな風に本来の目的とは違う使ってるよって方いましたら、ぜひ教えてください。<br />
<br />
<br />
<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-46845155896308034792018-03-06T12:00:00.000+09:002018-03-07T01:52:48.790+09:00最近のお気に入り - 1 「右クリック」大したことじゃないけど、最近のお気に入りを紹介するコーナ。<br />
第一弾は右クリック。<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/MS6R6TinDz0/0.jpg" frameborder="0" height="420" src="https://www.youtube.com/embed/MS6R6TinDz0?feature=player_embedded?vq=hd720&loop=1" width="690"></iframe></div>
<br />
<br />
<a name='more'></a><br />
<br />
FXを作ってく上で、僕には2大裏テーマというものがあります。それは「キーフレームを極力打たない」と「手の挙動範囲を極力少なくする」です。今回は後者のために、必要なカスタマイズです。<br />
<br />
ノードのプリセットに、入れればいいじゃんと言う人もいるかもしれないですが、あれはパラメータの並び順や位置のレイアウトも記憶しています。Houdiniはバージョンが変わると、パラメータのレイアウトが変わることなんてことは当たり前なので、バージョンごとにプリセットを更新する必要があり非常にめんどいのです。なので、右クリックのメニューにサポートツールを追加して効率化を図っています。<br />
<br />
<br />
<br />
メニューの追加の仕方ですが、 <br />
ノードを右クリックした時に、メニューを追加するには、OPmenu.xmlを編集します。<br />
パラメータを右クリックした時に、メニューを追加するには、PRAMmenu.xmlを編集します。<br />
<br />
基本的には、ここに書いてあるんで、読めばわかります。<br />
<a href="http://www.sidefx.com/docs/houdini/basics/config_menus.html" target="_blank">http://www.sidefx.com/docs/houdini/basics/config_menus.html</a><br />
<br />
<br />
<br />
<br />
お題として、先日パベルさんのセミナーでDescriptive Parmの表示の仕方を習ったので、これをパラメータの右クリックに追加してみましょう。<br />
Descriptive Parmとは、File Sopなどにある、Network View上でノードの名前の下にあるやつです。 <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR0j9dbfZs2OBBw53WX38RcgcAffYJGCHPfD5PYWINsdxb0XqRiv4HjcaNFGZSi4TUHvbRHdnpnLCdefjSrWLItLp2o7jFqiQ6mqX1Yar1ud1ykb8JUz0zeqIoQNYUeXQf43rxLZEbosnm/s1600/blog_favorite01_001.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="741" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR0j9dbfZs2OBBw53WX38RcgcAffYJGCHPfD5PYWINsdxb0XqRiv4HjcaNFGZSi4TUHvbRHdnpnLCdefjSrWLItLp2o7jFqiQ6mqX1Yar1ud1ykb8JUz0zeqIoQNYUeXQf43rxLZEbosnm/s1600/blog_favorite01_001.png" /></a><br />
これを、表示されてないノードにも表示させるようにします。これで、いちいちノードを選択してパラメータを見なくても、重要なパラメータの値がNetwork View上で確認できるようになります。しかし、そのパラメータが何かのノードとリンクして、そのノードはクソ重い処理をしなければならないのなら、この値を表示するために、毎回時間がかかってしまうので、気をつけてください。<br />
<br />
最初に、Pythonでどうやるか確認しましょう。ヘルプを見るとノードのUserDataを変更すれば、いいようです。<br />
<a href="http://www.sidefx.com/docs/houdini/network/badges.html#textbadges" target="_blank">http://www.sidefx.com/docs/houdini/network/badges.html#textbadges</a><br />
<br />
<br />
上の写真のようにMountainSopのElement Sizeを、Network Viewに表示させるには、Pythonはこんな感じ。<br />
<pre class="prettyprint"><code class="language-python">node = hou.node('/obj/geo1/mountain1')
parm_name = 'elementsize'
node.setUserData("descriptiveparm", parm_name)</code></pre>
ノードと、Descriptive Parmになるパラメータの名前が必要ですね。<br />
<br />
必要なものがわかったので、実際の作業に入りましょう。まずはPythonファイルを作ります。ここでは、changeDescriptiveParm.pyという名前にして、Houdiniがインポートできる場所に保存します。<br />
<pre class="prettyprint"><code class="language-python">import hou
def doit(parms,type):
parm = parms[0]
parm_name = parm.name()
node = parm.node()
if type == "clear"
parm_name = ""
node.setUserData("descriptiveparm", parm_name))</code></pre>
現在、右クリックしているパラメータが何かはparms=kwargs["parms"]で取得します。parmsとあるとおり、リストとして値が返ってきます。選択してるパラメータは1つなので、parm = parms[0]。パラメータからノードの情報を得るには、単純にparm.node()。これで、必要な情報はすべて取得できたことになります。 <br />
Descriptive Parmをクリアしたい時もあるので、parm_nameを空にして、それを可能にしておきます。<br />
<br />
最後に、PARMmenu.xmlを編集しましょう。こうです。<br />
<pre class="prettyprint"><code class="language-xml"><?xml version="1.0" encoding="UTF-8"?>
<menuDocument>
<menu>
<subMenu id="changeDescriptiveParm">
<label>Change Descriptive Parm</label>
<scriptItem>
<label>Set</label>
<scriptCode><![CDATA[
import changeDescriptiveParm
reload(changeDescriptiveParm)
changeDescriptiveParm.doit(kwargs["parms"],"set")
]]></scriptCode>
</scriptItem>
<scriptItem>
<label>Clear</label>
<scriptCode><![CDATA[
import changeDescriptiveParm
reload(changeDescriptiveParm)
changeDescriptiveParm.doit(kwargs["parms"],"clear")
]]></scriptCode>
</scriptItem>
</subMenu>
</menu>
</menuDocument></code></pre>
<br />
Descriptive Parmをセットしたりクリアする必要があるので、サブメニューを作ってどちらかを選択できるようにします。<br />
xmlにPythonを書き込むときは<scriptCode><![CDATA[を使います。とか、細かい書き方はヘルプ読めばわかるので、割愛します。<br />
<br />
ここにサンプルファイルを置いておくので、然るべきところに置けば、動作するはずです。 <br />
<a href="https://drive.google.com/file/d/1GvSa9tYAYhc3rBqIx1psfQGSmNqLRfvb/view?usp=sharing" target="_blank">Download Sample File</a><br />
<br />
僕の作業環境では、最初の動画にあるように、パラメータのスニペットを作っています。<br />
なぜかというと、いちいち`opinputpath('.',0)`とかcentroid(opinputpath('.',0),D_X)とかタイプするのめんどいですよね。なので、右クリックからできるようにしてます。<br />
xmlをうまいこと編集すれば、右クリックしたパラメータのタイプ等を判別して右クリックにメニューを追加するか否かや、リストに入れるのは必要なスニペットだけにすることもできます。<br />
<a href="http://www.sidefx.com/docs/houdini/basics/config_menus.html#menu-items" target="_blank">ヘルプのMenuItems</a>にある<scriptMenuStripDynamic>を使います。<br />
<br />
例えば、こんな感じです。<br />
<pre class="prettyprint"><code class="language-python">menu_items = []
parm = parms[0]
parm_temp = parm.tuple().parmTemplate()
parm_type = parm_temp.type().name()
if parm_type=='String':
if parm_temp.stringType().name()=='NodeReference' or parm_temp.stringType().name()=='NodeReferenceList':
menu_items = ["opinput00","opinputpath('.',0)","opinput10","opinputpath('..',0)"]
elif node=='ifd' and parm_temp.stringType().name()=='FileReference' and parm.name().find('vm_cryptolayeroutput')!=-1:
menu_items = ['setIfdCrypt','Set CryptoLayer']
elif parm_type=='Float':
if parm_temp.numComponents()==3:
menu_items = ["centerOwnVar","center own [ $CEX.. ]",]
return menu_items</code></pre>
<br />
これで、パラメータがStringで、そのStringのタイプがノードを選択する奴だったらopinputpath系を呼び出したり、パラメータタイプがFloatでサイズが3(float3)だったら、$CEXなどのポジション等に関するリストを呼び出すこともできます。<br />
<br />
<br />
みなさんも右クリックによく使う機能を入れて、手の負担を減らしてみてはいかがでしょうか?<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-72415157617431596582017-09-13T11:00:00.000+09:002018-03-06T00:56:21.773+09:00[Deadline] Add Extra Version時々、悩んでる人がいたので、Deadlineネタを1つ。<br />
<br />
どんなソフトでも、マイナーアップデートは簡単にできますが、メジャーアップデートは、プロジェクトの兼ね合いや自社Plugin/Toolの影響で、そうは容易くできません。アップグレードの金を出すのに渋って更新してないのでなく、ただ単にめんどくさいという理由で更新されてなかったら、担当者のケツを蹴っ飛ばして更新してもらいましょう。<br />
<br />
いろんな理由でDeadlineのバージョンが古すぎて、最新のHoudiniのバージョン使用できないという人もいるでしょう。今回は、そんな人向けへの裏ワザを紹介します。<br />
※この記事は、Deadline Client Version: 9.0.6.1の元、作成しています。<br />
<br />
<a name='more'></a><br />
<br />
<h3>
Configure Plugins</h3>
まずは、 Configure Pluginsに任意のバージョンを追加して、Pathをセットできるようにしましょう。<br />
<br />
以下のファイルを探しだして、[Houdini16_Hython_Executable]の次に追加します。<br />
$DEADLINE_REPOSITORY/plugins/Houdini/houdini.param<br />
<br />
<pre class="prettyprint linenums"><code class="language-html">[Houdini17_Hython_Executable]
Label=Houdini 17 Hython Executable
Category=Render Executables
CategoryOrder=0
Type=multilinemultifilename
Index=8
Default=C:\Program Files\Side Effects Software\Houdini 17.0.000\bin\Hython.exe;C:\Program Files (x86)\Side Effects Software\Houdini 17.0.000\bin\Hython.exe;/Applications/Houdini/Houdini17.0.000/Frameworks/Houdini.framework/Versions/17.0.000/Resources/bin/hython
Description=The path to the hython executable. It can be found in the Houdini bin folder.</code>
</pre>
<br />
そうすると、Configure Pluginsをみてみると追加されています。簡単ですね。各自インストールフォルダを指定してあげてください。
Distribute Sim使う人は、Sim Trackerも追加しときましょう。(HQueue使う人ってどれくらいるんだろう?使わないよね?)
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7DInPxfDQBi5pMylOaedySxSLHXDTxrQiAaXIQpkBMD0t9weiPMo2oUrO0KE68ew8mOXyJKvxwXB_7xHe3SrLTgxYK_ui5pgc-S0OsyD_BpgsY6vtAhUHOiK9gSKDxNQnYb5E2XOnRlfE/s1600/blog_deadline_01_001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="587" data-original-width="1113" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7DInPxfDQBi5pMylOaedySxSLHXDTxrQiAaXIQpkBMD0t9weiPMo2oUrO0KE68ew8mOXyJKvxwXB_7xHe3SrLTgxYK_ui5pgc-S0OsyD_BpgsY6vtAhUHOiK9gSKDxNQnYb5E2XOnRlfE/s640/blog_deadline_01_001.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Buildを指定したいなら、Houdini16.5.123_Hython_Executableみたいに作ることも可能です。<br />
Mantraも同じ要領でやればできます。
<br />
<br />
<h3>
Houdini Submission</h3>
Submission WindowのVersion指定メニューに、任意のバージョンを足すには、以下のpythonを変更します。
$DEADLINE_REPOSITORY/scripts/Submission/HoudiniSubmission.py
以下のラインを探しだして、任意のバージョンを追加してください。
<br />
<pre class="prettyprint"><code class="language-py">scriptDialog.AddComboControlToGrid("VersionBox","ComboControl","14",("9","10","11","12","13","14","15","16","17",), 5, 1)</code></pre>
<br />
これだけです。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhBqGg5NGj-frUDM3r9hYXl2VyJ9ZgXG7c2h2Kf6vLE8vsC8id4AIDfDaKdWhbPRdKKWTktICLmcRoXj1K7wnpE69HKW-bfqEy2HALG27s1YDTljAQCi3DoUxGnFVB0Yla9jn4ak2ig36E/s1600/blog_deadline_01_002.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="771" data-original-width="550" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhBqGg5NGj-frUDM3r9hYXl2VyJ9ZgXG7c2h2Kf6vLE8vsC8id4AIDfDaKdWhbPRdKKWTktICLmcRoXj1K7wnpE69HKW-bfqEy2HALG27s1YDTljAQCi3DoUxGnFVB0Yla9jn4ak2ig36E/s640/blog_deadline_01_002.png" width="456" /></a>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<h3>
Deadlineは結構いいよ</h3>
以上の手順を踏めば、投げられるようになったと思いますが、 Deadlineはバッチ処理をする前に、いくつかのプロセスを処理してるので、あまりにも古いバージョンを使用してる場合は、ノードのパラメータ名が変わっていたり、対応してないかもしれません。<br />
そんな時は、$DEADLINE_REPOSITORY/plugins/Houdini/hrender_dl.pyをなんとかなります。<br />
<br />
ちなみに9の最後のほうでOpenGL Ropに対応したり、10からBuildバージョンを指定できるみたいです。Houdiniユーザも増えてきて、ようやく当たり前にあるべき機能が追加されていきましたが、はっきり言って遅いです。いつも小出しで出してくるので、バージョンアップは欠かせないです。Houdini用のPythonも、おそらくHoudiniに精通した人が書いていないため、かゆいとこには手は届いていないですし、書き足し×2でやってるため、きれいではありません。<br />
<br />
<br />
個人的には、MarzaのオリジナルDispatcherのほうが、頭いいので断然好きですが、Deadlineはインストールすれば、多くのことがすぐにできるようになります。そして今回紹介したように、こういったファイルをいじれば簡単に編集でき、TDでなくても自分たちの環境に合わせたカスタマイズは容易です。小さい会社やTDがいない会社にはおすすめです。<br />
<br />
いつか、僕が会社でやってるDeadlineカスタマイズを公開できればいいですね。
Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-77133498120358935402017-06-19T13:30:00.000+09:002018-01-27T12:54:12.836+09:00Kill Houdini今回の話は、Linuxユーザのためだけですので、あしからず。<br />
<br />
なにか間違った値を入れてしまったりして、メモリが右肩上がりに上昇し、メモリをフルに使いきり、パソコンが動かなくなるということは、時々あるでしょう。会社のマシンは128GBですが、まれになります。<br />
そんなときは、 CUIモードで対処したり、同僚のマシンから操作してもらったり、泣く泣く電源を落としたりと、みなさんもこんな経験はたくさんあるでしょう。<br />
残念ながら、いろいろセーブしてなくて、「ごめんなさい」を連呼しながらEscを連打しても、ダメなときはダメです。 <br />
<br />
そうなる前に、問題のプロセスを強制的に終了させましょう。<br />
というわけで、今回はBashを調べてみました。基本Linuxで仕事してますが、Bashやコマンドは避けてきたので、何か間違ってる点や、もっといい方法がありましたら教えてください。<br />
<br />
<br />
<a name='more'></a><br /><br />
<br />
<h3>
プロセス一覧から探しだして、kill </h3>
まずは、ベーシック。 <br />
プロセスを表示するコマンドはps。<br />
みなさんは、どういうオプション使っているかはわかりませんが、自分はいつもこれ<br />
<pre class="prettyprint"><code class="language-c">ps aux</code></pre>
<br />
端末内外のプロセスを表示して、CPUとメモリの使用量も表示させる。<br />
<br />
さらに、Houdiniのプロセスだけを表示させる<br />
<pre class="prettyprint"><code class="language-c">ps aux | grep houdini-bin</code></pre>
<br />
<br />
表示された結果から、見つけた対象のプロセスIDを殺す。<br />
<pre class="prettyprint"><code class="language-c">kill -SEGV 123456 </code></pre>
<br />
このSEGVは、ホント助かりますよね。Windowsにはないらしいですが、可哀想に。<br />
<br />
これで、プロセスが死に、$houdini_tmpのなかに、シーンファイルが、保存される。まっ、たまに保存が失敗することがありますが。<br />
<br />
<br />
さて、ここまでは普通の手順。もう少し、賢くやってみましょう。<br />
<br />
<br />
<br />
<h3>
すべてのHoudiniプロセスを、kill</h3>
まずは、今あるHoudiniのプロセスすべてをKillします。<br />
<pre class="prettyprint"><code class="language-c">kill -SEGV `ps aux | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2`</code></pre>
<br />
houdini-binは、houdiniの立ち上げ方によって、名前変わるので、各自変えてください。ちなみにhoudini-bin はターミナルで、houdini_sourceをセットし、houdiniとタイプし起動したら、そうなります。<br />
なので、それらを考慮するなら、複数指定しときましょう<br />
<pre class="prettyprint"><code class="language-c">grep -e [h]oudini-bin -e [h]indie-bin</code></pre>
[]を使う理由は、プロセスにgrep自身が表示されないようにするためです。<br />
<br />
<pre class="prettyprint"><code class="language-c">ps aux | grep [h]oudini-bin </code></pre>
<br />
実行すると、こんな感じのものが返ってくると思います。<br />
shohei 9042 4.7 1.5 5985364 2067844 ? Ssl 10:54 11:17 /opt/hfs16.0/bin/houdini-bin<br />
shohei 24231 0.4 0.4 1385564 544956 ? Ssl Jun05 11:00 /opt/hfs16.0/bin/houdini-bin<br />
分かりづらいかもしれせんが、連続したスペースがあります。これだと不便です。<br />
<br />
そこで、これ。<br />
<pre class="prettyprint"><code class="language-c">tr -s ' '</code></pre>
<br />
-sは、同じ連続した文字を1文字に置き換えるオプションです。<br />
<br />
<pre class="prettyprint"><code class="language-c">ps aux | grep [h]oudini-bin | tr -s ' '</code></pre>
<br />
これを付け加えて実行すると、 <br />
shohei 9042 4.7 1.5 5985364 2067844 ? Ssl 10:54 11:16 /opt/hfs16.0/bin/houdini-bin<br />
shohei 24231 0.4 0.4 1385564 544956 ? Ssl Jun05 11:00 /opt/hfs16.0/bin/houdini-bin<br />
綺麗になりました。<br />
<br />
さらに、左から2番めにあるのがプロセスIDですので、これだけを取り出します。<br />
<pre class="prettyprint"><code class="language-c">cut -d ' ' -f2</code></pre>
<br />
-dが区切り文字の指定で-fが抽出する番号です。pythonでいう、split(' ')[2]ですね。 <br />
<br />
<pre class="prettyprint"><code class="language-c">grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2</code></pre>
<br />
9042<br />
24231 <br />
<br />
この返ってきた番号すべてをkillします。<br />
<br />
<br />
<br />
<h3>
1番メモリくってるHoudiniを、kill</h3>
全部のHoudiniはkillしたくないけど、一番メモリを食ってるやつのみをkillしたい<br />
<pre class="prettyprint"><code class="language-c">kill -SEGV `ps aux --sort -vsize | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2| sed -n 1p`</code></pre>
<br />
<br />
まずメモリ使用量が大きい順に、ソートする。 <br />
<pre class="prettyprint"><code class="language-c">ps aux --sort -vsize</code></pre>
<br />
<br />
また、プロセスIDだけ取り出す。そしたら、一番最初のIDだけにする。<br />
<pre class="prettyprint"><code class="language-c">sed -n 1p</code></pre>
<br />
あとは、まえのと一緒です。<br />
ちなみに、1番目から3番目にメモリを食ってるのを対象にするには、この部分をこうします。<br />
<pre class="prettyprint"><code class="language-c">sed -n 1,3p</code></pre>
<br />
<br />
<br />
<h3>
コマンドとして登録</h3>
しかし、メモリを急激に食い始めたやつを止めるには、悠長にこんな長いコマンドを打ってる時間は、残されてません。<br />
コマンドに登録して、さらにスマートにしてみましょう。<br />
<br />
まず、全部をkillするコマンドを作ってみます。以下のコードをファイルとして<br />
/usr/local/binに保存します。名前はkillhoudiniallとしときます。
<br />
#!/bin/sh<br />
<pre class="prettyprint"><code class="language-c">kill -SEGV `ps aux | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f 2`</code></pre>
ファイルのパーミッションで、プログラムとして実行可能にしときましょう。
<br />
<br />
<br />
最後に、メモリを食ってる順番から消すようにするコマンドを作ります。コマンド名はkillhoudiniとします。<br />
<pre class="prettyprint"><code class="language-c">#!/bin/sh
BASECOMMAND="ps aux --sort -vsize | grep [h]oudini-bin | tr -s ' ' | cut -d ' ' -f2 | sed -n"
if [ $# -ne 2 ]; then
if expr "$1" : '[0-9]*' > /dev/null
then
kill -SEGV `eval ${BASECOMMAND} $1p`
exit 1
else
echo "error: Not a number"
fi
elif [ $# -ne 3 ]; then
if expr "$1" : '[0-9]*' > /dev/null && expr "$2" : '[0-9]*' > /dev/null
then
kill -SEGV `eval ${BASECOMMAND} $1,$2p`
exit 1
else
echo "error: Not a number"
fi
else
echo "error: Not support"
exit 1
fi </code></pre>
<br />
<br />
要点だけ説明すると、引数が2つの時のみ実行するために<br />
<pre class="prettyprint"><code class="language-c">$# -ne 2</code></pre>
<br />
変数が整数か否かのチェック<br />
<pre class="prettyprint"><code class="language-c">if expr "$1" : '[0-9]*' > /dev/null</code></pre>
<br />
これで、”killhoudini 1”とやれば、1番メモリ食ってるのをkill。”killhoudini 2 4”とすれば、2番目から4番目にメモリを食ってるのをkillします。<br />
<br />
<br />
<br />
余談ですけど、Autodesk系を抹殺するには<br />
rm -rf /opt/Autodesk*<br />
ですね。(*´ω`*)<br />
<br />
<br />
<br />
今の時代、勉強しなくてもネット見れば、誰でも簡単なコードはすぐかける。いい時代だけど、できないなんていう戯言は一切通用しない時代。<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-34427911354147466622017-03-29T15:50:00.000+09:002018-01-27T12:58:08.976+09:00H16についてのメモ<br />
<br />
<h3>
New Network Editor</h3>
さて、賛否両論ありそうなこれ。見た目は可愛くなりましたね。<br />
そして描画速度も速くなりました。Pythonでノードを何千と作ったり、AlembicのHierarchyを保持して展開するときなど、大きな差が出そうです。<br />
<br />
<br />
あのノードの形、可愛くないから使いたくないとか、デフォルトを変えたいって人はいるでしょう。僕はノードを組む上での自分なりのルールがあるためノードの色が最初から付いているのは非常に不便でデフォルトを変更してます。<br />
<br />
そこで、どうやってカスタマイズするかを紹介します。<br />
<br />
<a name='more'></a><br />
<br />
書き方は、インストール先の$HFS/houdini/OPcustomizeに記述されてるので覗いてみてください。<br />
<a href="https://drive.google.com/open?id=0BxR_QF5anLH0V0Y5TVBKTncyTUk" target="_blank">Sample</a><br />
文頭がopdefaultcolorで始まるのが色の設定。 文頭がopdefaultshapeで始まるのが形の設定。 <br />
では、$HOME/houdini16.0/OPcustomizeというテキストを作って編集してみましょう。<br />
<br />
まず形から変更してみましょう。<br />
SopのMergeを丸にするには<br />
<pre class="prettyprint"><code class="language-c">opdefaultshape Sop merge circle
</code></pre>
<br />
形の種類ってヘルプのどこかに書いてあるんですかね?5分位探してなかったのであきらめました。<br />
そこでPythonで選択したのノードの形を取得してみます。<br />
<pre class="prettyprint"><code class="language-py">import hou
n = hou.selectedNodes()[0]
ns = n.userData('nodeshape')
ds = n.type().defaultShape()
print ns,ds
</code></pre>
userDataに入ってるのは、NetworkViewで変えた形で、defaultShapeは名の通りです。<br />
<br />
続いて色です。個人的に勝手にノードに色がつくのはうっとおしかったため、すべての色の設定をクリアしました。<br />
<pre class="prettyprint"><code class="language-c">opdefaultcolor -c
</code></pre>
これで、Houdini Pathの順番で、このファイルより前で設定されたopdefaultcolorはClearされます。<br />
形の設定をクリアするには、同じく-cです<br />
<pre class="prettyprint"><code class="language-c">opdefaultshape -c
</code></pre>
<br />
<br />
色をつけるには<br />
<pre class="prettyprint"><code class="language-c">opdefaultcolor Sop rop_geometry 'RGB 0.451 0.369 0.796'
</code></pre>
<br />
ノードの名称、色とか形を調べるのはメンドイんで、ノードを選択して実行すれば分かるようにして、作業しました。<br />
<pre class="prettyprint"><code class="language-py">import hou
ns = hou.selectedNodes()
for n in ns:
nn = n.type().nameWithCategory()
cd = n.color()
ds = n.type().defaultShape()
us = n.userData('nodeshape')
print "Name:%s, Color:%s, Defalut Shape:%s, User Shape:%s" % (nn, cd, ds, us)
</code></pre>
<br />
<br />
なんで、こんなことをしたかというと、例えば、チーム内で「このノードの色はこういう条件の時のみ使用しよう。」とか「このノードの形は書き出しを意味する。」とか決めておけば、他の人の複雑なシーンファイルを渡されても、どのノードが重要なのかとか何をしてるのか、わかりやすくなっておすすめです。<br />
<br />
<h3>
Mantra</h3>
ifdを書きだすとき、Geometryを別のファイルとして保存することによって、時間短縮されるようになりました。以下のパラメータが追加されています。<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Py1sOH3EawXpLj9gapoUjkVDw_n5L24ZYRM7slHNXzQ3K-HUf51d79CeNVnF3L5TJ3FDrxH9vgxFSzy8OSY4OZQL0JlpXFxVFyKLCyuZJGDWck4AzsHUxgf4JGgwoSTDEKrXVpbPDZux/s1600/h16_mantra.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Py1sOH3EawXpLj9gapoUjkVDw_n5L24ZYRM7slHNXzQ3K-HUf51d79CeNVnF3L5TJ3FDrxH9vgxFSzy8OSY4OZQL0JlpXFxVFyKLCyuZJGDWck4AzsHUxgf4JGgwoSTDEKrXVpbPDZux/s320/h16_mantra.png" width="320" /></a></div>
ifdにすべて書き込みたい場合はSave inline geometryにチェックを入れてください。<br />
パイプラインのある会社では、レンダー終わったあとにifdを消す仕様にしてるところもあると思いますが、ここのtemp storageを消すように考慮したほうがいいかもしれません。<br />
<br />
<br />
<br />
<br />
<br />
毎回のごとく素晴らしいアップデートばかりです。でも時々、なんで変更したのかとか、なぜこうしないんだとか思うことがあるかもしれません。しかし、ちゃんと訳を聞いてみると、納得出来ますし、従ったほうが吉です。フォーラムで見かけた言葉を引用すると「<b>As always SESI knows best.</b>」です。Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-51480707201097807292016-12-10T10:00:00.000+09:002018-01-27T13:04:46.066+09:00Wrangleを使おう 3 - Replace ForLoop久しぶりのWrangle回です。<br />
<br />
個人的にHoudiniにおいて、よく使う必需ノードは、For LoopとAttribute Promoteです。これらがないと仕事ができません。もちろんWrangleも絶対使います。<br />
<br />
特にFor LoopはHoudiniを象徴するようなノードだと勝手に思ってます。ある処理を考え、それを他のものにも同様な処理を施す。まさにProceduralに作業する上で必要不可欠なものです。<br />
<br />
しかし!ForLoopは処理に時間がかる時が大半です。なぜなら、すべてのノードがマルチスレッド処理されるわけではありませんし、1つ1つのピースやグループを同時にではなく、順番に処理するため遅くなってしまいます。<br />
<br />
<a name='more'></a><br />
<br />
<br />
シンプルな例を元に解説していきます。<br />
<br />
Sample File : <a href="https://drive.google.com/open?id=0BxR_QF5anLH0WktQX3RNdG4tR2c" target="_blank">wrangle_03.hiplc</a> (15.5.607 linux-x86_64-gcc4.8)<br />
<br />
Voronoiで割った1つ1つのピースのサイズを測ろうと思います。あまりにも小さいピースはSimulationに参加させない様にさせるとか、大きいやつはもう一回砕こうとかで使うことがありますね。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWgQdD3zYDqfwu0p9OzVMUbsRC6Mgl9vkxnZLYXuizR_KmOHUsYfbWeLrYh5CAk9uWLsEkcU7N9iJ9UAqBPY1CVT9JEEiSQ-cNdEfK-ooSl-WgZni_HLysuTv_qLfrSeBCtr8wDn15jFVJ/s1600/blog_wrangle3_006.png" imageanchor="1"><img border="0" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWgQdD3zYDqfwu0p9OzVMUbsRC6Mgl9vkxnZLYXuizR_KmOHUsYfbWeLrYh5CAk9uWLsEkcU7N9iJ9UAqBPY1CVT9JEEiSQ-cNdEfK-ooSl-WgZni_HLysuTv_qLfrSeBCtr8wDn15jFVJ/s400/blog_wrangle3_006.png" width="400" /></a><br />
<br />
ピースのサイズを求めるために、まずMeasureで個々のPrimitiveの面積か体積を測ります。続いて、For Loopで各ピースごとが持っている各Primitive面積の総和を出します。これが、ピースのサイズとなります。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtnOhPDud4oQr2kz8hrx7I1QVGbE2fIQ4WapfXDYvat_Tzdy2bt1ufYYQSwzhNVO9nByRm8VPCptrL3fF30uT4aoUIzx5_kobXWU0EgGIE9TRBuZ1-eIIg3vaw1Bysg4AorL2ayVphGpkF/s1600/blog_w3_001.png" imageanchor="1"><img border="0" height="536" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtnOhPDud4oQr2kz8hrx7I1QVGbE2fIQ4WapfXDYvat_Tzdy2bt1ufYYQSwzhNVO9nByRm8VPCptrL3fF30uT4aoUIzx5_kobXWU0EgGIE9TRBuZ1-eIIg3vaw1Bysg4AorL2ayVphGpkF/s640/blog_w3_001.png" width="640" /></a><br />
<br />
本題です。Wrangleでやってみます。<br />
<a href="http://www.sidefx.com/docs/houdini15.0/vex/functions/nuniqueval" target="_blank">nuniqueval()</a><br />
<a href="http://www.sidefx.com/docs/houdini15.0/vex/functions/uniqueval" target="_blank">uniqueval()</a><br />
<a href="http://www.sidefx.com/docs/houdini15.0/vex/functions/findattribvalcount" target="_blank">findattribvalcount()</a><br />
<a href="http://www.sidefx.com/docs/houdini15.0/vex/functions/findattribval" target="_blank">findattribval()</a><br />
この関数がミソなんでHelpは読んでください。<br />
<pre class="prettyprint"><code class="language-cpp"> string piece_attr = "name";
int num_piece_attr = nuniqueval(@OpInput1, "prim", piece_attr);
addattrib(0,"prim","area_sum",0.0);
for(int i = 0; i < num_piece_attr; i++){
string uq_val = uniqueval(@OpInput1, "prim", piece_attr,i);
int num_prim_piece = findattribvalcount(@OpInput1, "prim", piece_attr,uq_val);
int prim_piece,ii =0;
float per_area,area_sum =0.0;
for(ii=0; ii< num_prim_piece; ii++){
prim_piece = findattribval(@OpInput1,"prim",piece_attr,uq_val,ii);
per_area = prim(0,"area",prim_piece);
area_sum += per_area;
}
for(ii=0; ii< num_prim_piece; ii++){
prim_piece = findattribval(@OpInput1,"prim",piece_attr,uq_val,ii);
setattrib(0, "prim", "area_sum", prim_piece, 0, area_sum, "set");
}
}
</code></pre>
<br />
For Loopでやった処理を分解しながら説明していきます。Run OverはDetailです。<br />
Loop処理をどのアトリビュートに対して行い、何回処理するかを決めます。<br />
<pre class="prettyprint"><code class="language-cpp">string piece_attr = "name";
int num_piece_attr = nuniqueval(@OpInput1, "prim", piece_attr);
</code></pre>
<br />
Primitiveのnameというアトリビュートのリスト数が取得できたので、これをLoopさせます。そして、まずLoopの中で、今どの要素に対して処理してるのかを判断します。uniquevalを使って、現在のnameを取り出します。ここまでがFor Loop Sopの処理です。<br />
<pre class="prettyprint"><code class="language-cpp">for(int i = 0; i < num_piece_attr; i++)
string uq_val = uniqueval(@OpInput1, "prim", piece_attr,i);
</code></pre>
続いて、Attribute Promoteの処理を落とし込みます。<br />
現在処理が行われてるnameを持ってるPrimitiveが、いくつかあるかを求めます。<br />
<pre class="prettyprint"><code class="language-cpp"> int num_prim_piece = findattribvalcount(@OpInput1, "prim",piece_attr,uq_val);
</code></pre>
各PrimitiveのMeasureで測った値を、1度Detailに合算しながら格納します。1つ1つのPrimitiveに対して処理を行うので、またforの出番です。そして各Primitiveからareaを取り出すためには、そのPrimitive Numberを把握しなければなりません。そこでfindattribvalを使います。<br />
例えるなら"piece19"(uq_val)をもつPrimitiveが12(num_prim_piece)あって5番目(ii)の@primnumは1254(prim_piece)である。となってます。<br />
<pre class="prettyprint"><code class="language-cpp">for(ii=0; ii<num_prim_piece; ii++)
prim_piece = findattribval(@OpInput1,"prim","name",uq_val,ii);</code></pre><br />
Primitive Numberからareaの数値を引き出して、合算していくだけです。<br />
<pre class="prettyprint"><code class="language-cpp"> per_area = prim(0,"area",prim_piece);
area_sum += per_area;}
</code></pre>
<br />
ここまででは、まだareaの合計はDetailにあるので、Primitiveに戻してあげましょう。2つ目のAttribute Promoteの処理です。<br />
<pre class="prettyprint"><code class="language-cpp"> for(ii=0; i<num_prim_piece; ii++){
prim_piece = findattribval(@OpInput1,"prim",piece_attr,uq_val,ii);
setattrib(0, "prim", "area_sum", prim_piece, 0, area_sum, "set");
}
</code></pre>
<br />
Wrangleで再現出来ましたので、速度を比較してみましょう。<br />
<style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}--></style><br />
<table border="1" cellpadding="0" cellspacing="0" dir="ltr" style="border-collapse: collapse; border: 1px solid #ccc; font-family: arial,sans,sans-serif; font-size: 13px; table-layout: fixed;"><colgroup><col width="124"></col><col width="100"></col><col width="120"></col><col width="226"></col></colgroup><tbody>
<tr style="height: 24px;"><td data-sheets-value="{"1":2,"2":"Number of Pieces"}" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom;"><span style="color: red;">Number of Pieces</span></td><td data-sheets-value="{"1":2,"2":"Original"}" style="background-color: #f6b26b; border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-weight: bold; padding: 2px 3px 2px 3px; text-align: center; vertical-align: bottom; vertical-align: top;"><span style="color: red;">Original</span></td><td data-sheets-value="{"1":2,"2":"Wrangle"}" style="background-color: #6fa8dc; border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-weight: bold; padding: 2px 3px 2px 3px; text-align: center; vertical-align: bottom; vertical-align: top;"><span style="color: red;">Wrangle</span></td><td data-sheets-value="{"1":2,"2":"*times faster than Original"}" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-weight: bold; padding: 2px 3px 2px 3px; text-align: center; vertical-align: bottom; vertical-align: top;"><span style="color: red;">*times faster than Original</span></td></tr>
<tr style="height: 18px;"><td data-sheets-value="{"1":3,"3":98}" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">98</span></td><td data-sheets-value="{"1":3,"3":0.216}" style="background-color: #ffe599; border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">0.216</span></td><td data-sheets-value="{"1":3,"3":0.078}" style="background-color: #cfe2f3; border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">0.078</span></td><td data-sheets-formula="=R[0]C[-2]/R[0]C[-1]" data-sheets-value="{"1":3,"3":2.769230769230769}" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">2.769230769</span></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":5880}" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">5880</span></td><td data-sheets-value="{"1":3,"3":5.934}" style="background-color: #ffe599; border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">5.934</span></td><td data-sheets-value="{"1":3,"3":0.829}" style="background-color: #cfe2f3; border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">0.829</span></td><td data-sheets-formula="=R[0]C[-2]/R[0]C[-1]" data-sheets-value="{"1":3,"3":7.158021712907118}" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">7.158021713</span></td></tr>
<tr style="height: 21px;"><td data-sheets-value="{"1":3,"3":11858}" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">11858</span></td><td data-sheets-value="{"1":3,"3":15.705}" style="background-color: #ffe599; border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">15.705</span></td><td data-sheets-value="{"1":3,"3":1.611}" style="background-color: #cfe2f3; border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">1.611</span></td><td data-sheets-formula="=R[0]C[-2]/R[0]C[-1]" data-sheets-value="{"1":3,"3":9.748603351955307}" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; text-align: right; vertical-align: bottom;"><span style="color: red;">9.748603352</span></td></tr>
</tbody></table>
ピースの数が増えるほど、速くなってるのが分かりますね。勝ちました!!<br />
最大値や最小値や他のことにも簡単に応用出来ますね。<br />
<br />
わざわざ、Measureを使わずにIntrisicsにmeasured*があるのでWrangleで引っ張ってこれば、今回の例はWrangle1つでCookできます。<br />
<pre class="prettyprint"><code class="language-cpp">@area = primintrinsic(0, "measuredvolume", @primnum)</code></pre>
<br />
Wrangleを推奨してますが、Wrangleだけを使えということではありません。僕は昔からあるSopたちも沢山使ってます。というかそのSopたちが、どのような処理をして、どんな時に役立つからを知っているから、wrangleでこういうふうにやれば処理が速くなるよという事を伝えてます。初級者のかたはまずはwrangleだけに頼らず、ガッツリ基礎を固めてください。<br />
<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-17877291304512346882016-08-07T23:45:00.002+09:002016-08-11T21:20:06.672+09:00Time Dependent Cook : YES? or NO?お久しぶりです。そこそこ忙しくて、ブログを書くのを怠ってました。<br />
今回の内容はビギナー向けですが、非常に重要な考え方なので紹介しようと思います。Time Dependent Cookについてです。<br />
<br />
Time Dependentという言葉は、Houdiniを使ってないと聞き慣れないかもしれませんし、気にしたこともないかもしれません。<br />
<br />
サンプルファイル (Fedora21, Houdini15.0.393, linux-x86_64-gcc4.8)<br />
<a href="https://drive.google.com/file/d/0BxR_QF5anLH0NkQ0U2t1SDVFRXc/view?usp=sharing">https://drive.google.com/file/d/0BxR_QF5anLH0NkQ0U2t1SDVFRXc/view?usp=sharing</a><br />
<br />
<a name='more'></a><br /><br />
<br />
<h4>
<span style="font-size: large;">Time Dependent?</span></h4>
<br />
ではTime Dependentとはなんでしょうか?直訳すると「時間に依存」です。<br />
<br />
[Time Dependent Cook:Yes]はフレームが変わるとcookする。逆にNoの場合は、時間に依存してない。つまり、フレームが変わってもcookしません。1回cookすれば、それを使いまわします。単純な話、レンジが100Fの場合でYesなら100回cookします。Noなら1回のcookですみます。<br />
<br />
これを気にせずアセットを作るなんてことは、トーシロー、素人です。一昨日来やがれ。言い過ぎました。<br />
<br />
<a href="https://www.blogger.com/null" name="more"></a>このTime Dependent Cookの情報をどうやって知るかというと、ノードをミドルクリックすれば一番下に出てきます。SOP、DOP、OBJ、COP、CHOP、SHOP、ROP全てのノードで出てきます。(ん?ROPのTime Dependent Cookってなんでしょうね?)<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG-WdyVtJ38HPJi8IpnucVn-UPe3KH0EHWdm7fcd5bxgbQS5BvX-P1ivLB6WHNFhcw6KBS4r9QLM1LOhcwYjyCrI8ZUk7Bw-CiPjU-Xbe9D4qVnnc_NHC9ULL2EOErgzCRefLfD4ui-58m/s1600/blog_TD_001.png" imageanchor="1"><img border="0" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG-WdyVtJ38HPJi8IpnucVn-UPe3KH0EHWdm7fcd5bxgbQS5BvX-P1ivLB6WHNFhcw6KBS4r9QLM1LOhcwYjyCrI8ZUk7Bw-CiPjU-Xbe9D4qVnnc_NHC9ULL2EOErgzCRefLfD4ui-58m/s320/blog_TD_001.png" width="320" /></a><br />
<br />
また、会社の人に教えてもらいましたが、ノードを光らせてどのノードがそうなのかを識別させることもできます。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIuDP0unoMnNdbYmWYOZw9fROgOLTf8mY2usjpqHVZB0vMbxn8657efY1hCr-y7UlhKKLFyAKYUnZgI2HJk0D0BuN0HZfA750ZvF1L0jfZKpH1eJG706BzAs53IlP9pSRv-85GdJcqtP5Q/s1600/blog_TD_002.png" imageanchor="1"><img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIuDP0unoMnNdbYmWYOZw9fROgOLTf8mY2usjpqHVZB0vMbxn8657efY1hCr-y7UlhKKLFyAKYUnZgI2HJk0D0BuN0HZfA750ZvF1L0jfZKpH1eJG706BzAs53IlP9pSRv-85GdJcqtP5Q/s400/blog_TD_002.png" width="400" /></a><br />
<br />
<br />
<h4>
<span style="font-size: large;">どうして重要なのか?</span></h4>
<br />
続いて、活用方法を紹介したいと思います。Houdini始めたら誰しもが使うScatterを使って解説します。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisn1iAtzBTEDjr05m7BnjxYqnQOATk4OCFw3Rir6Ye7x40G28gQICkRU6MvZhKO9fEw71xf7YNDbA-vjlR6bTGOIv1CXMdm_g0dYXTGm4LrBGRlgFDy5qv4a2I1H7jv95O_UjrFCwYnCYk/s1600/blog_TD_003.gif" imageanchor="1"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisn1iAtzBTEDjr05m7BnjxYqnQOATk4OCFw3Rir6Ye7x40G28gQICkRU6MvZhKO9fEw71xf7YNDbA-vjlR6bTGOIv1CXMdm_g0dYXTGm4LrBGRlgFDy5qv4a2I1H7jv95O_UjrFCwYnCYk/s400/blog_TD_003.gif" width="400" /></a><br />
例えば、この歩いている人間にPointを発生させたいとします。普通にScatterすると毎フレーム違う場所に発生してしまいます。これを回避するには、ScatterのパラメータにあるGenerateをIn Texture Spaceにします。一気に処理が重くなりますね。<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb2GaP9CsafOOHhEPZQe2np9XruBiJGmVxAxZ50KP0ktovwjdIm1stWjnMeLJiN8cKaZiiepSY6X2e28iYfOJ9k-p2wG_NUa-b8k09Z1THS0wbpeCOPCfWxwsHTNZID9I7HKq0UHRzCsNM/s1600/blog_TD_005.png" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrGwTNoGXeFKgzdUqgidibgiCnq3a5AOqra8mND4sURMP5flDfsgVrRRMftc4D9NtTpAlVQjeE8TMOTs-G9zXpdnHdkLDJZkyQOGu5J_eQJsplmt7szh4xBRo6GvyzevgfSEL3AcBKH52R/s1600/blog_TD_004.gif" imageanchor="1"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrGwTNoGXeFKgzdUqgidibgiCnq3a5AOqra8mND4sURMP5flDfsgVrRRMftc4D9NtTpAlVQjeE8TMOTs-G9zXpdnHdkLDJZkyQOGu5J_eQJsplmt7szh4xBRo6GvyzevgfSEL3AcBKH52R/s400/blog_TD_004.gif" width="400" /></a><br />
パラメータを変えるまでは120fps出ていたのに、 10fpsも出なくなってしまいました。致命的ですね。<br />
<br />
速くするにはScatterするのを1回だけにして、後からPositionを動かせばいいのです。TimeShiftでScatterのソースを止めます。そして、ScatterのOutput Attributesから2つを有効にします。これはScatterしたPrim NumberとUVを保存してくれます。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HtENZpfakJNhdgH2w9eTA9-9c3SME9Vl6PvUk2zCG0icTRD_KIid9qkJmT6rNNCbsWgWU8rRbVjRWJTAOk2rdZpYyW0hoot4h3UniXlk1DUKnZ4x2hhHLR43bspyiAgXUsi_kg8OgpvH/s1600/blog_TD_006.png" imageanchor="1"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HtENZpfakJNhdgH2w9eTA9-9c3SME9Vl6PvUk2zCG0icTRD_KIid9qkJmT6rNNCbsWgWU8rRbVjRWJTAOk2rdZpYyW0hoot4h3UniXlk1DUKnZ4x2hhHLR43bspyiAgXUsi_kg8OgpvH/s320/blog_TD_006.png" width="320" /></a><br />
保持したら、最近ついた新しいノードをつかいます。Attribute Interpolateです。1st InputにScatterしたPointをさして、2nd Inputに動いてる人をさすだけPointが動きます。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZsjPu7c2S2Bx4SbEwCpQy9xM76kThob1qPRhbDKrRLkAbW1fJGwTid6knnTfhyphenhyphen34InIvHqdi_Bb4v9p4altccmlsbXandH-VWzt5X0hlXCqWgXTgohfGnKQ6wGsHnW54jkU3NX0mT6dk1/s1600/blog_TD_007.png" imageanchor="1"><img border="0" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZsjPu7c2S2Bx4SbEwCpQy9xM76kThob1qPRhbDKrRLkAbW1fJGwTid6knnTfhyphenhyphen34InIvHqdi_Bb4v9p4altccmlsbXandH-VWzt5X0hlXCqWgXTgohfGnKQ6wGsHnW54jkU3NX0mT6dk1/s320/blog_TD_007.png" width="320" /></a><br />
Attribute Interpolateなかったころ、どうやっていたかというとVopのPrimitive Attributeを使っていました。ちなみにですが、sourceのPrim NumとUVはIntersect Vopでもとれます。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0jWFxdOaFl664XtAtW6gpB6NJRiqL0YO0PW_uROmg67S24-8p9gG2HZMLrg9n-ZBd-hQmUJ46OMxDqbCN-itcC0ds4RBXt8_BeXHP2nNMt2Y8dAA_G2zSK0euGdI4wlfRuaYPUFu4-kzi/s1600/blog_TD_008.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0jWFxdOaFl664XtAtW6gpB6NJRiqL0YO0PW_uROmg67S24-8p9gG2HZMLrg9n-ZBd-hQmUJ46OMxDqbCN-itcC0ds4RBXt8_BeXHP2nNMt2Y8dAA_G2zSK0euGdI4wlfRuaYPUFu4-kzi/s320/blog_TD_008.png" width="320" /></a><br />
<br />
Pointが動いたということで、どれくらい速くなってか試してみましょう。一番最後にTrail Sopをさして、Compute Velocityをvを計算させてみます。毎フレームScatterする場所が違うと、vもおかしな値が入ってしまうので、正確に動作しているかも判断できます。<br />
<br />
では、Scatterを毎フレーム計算させた場合です。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU_IpX5giBnT1O0_ER8hxlh0HAFOXQNej5Fle5irSYKQ3UoY-RU3b_o57OcIH89U2fyQtDm2nmeqaUVF4CLvxJIQJkNRbstN2sLbvKw2ZhYlSQ7APhua5ZcRbjmA1eK4v50g4to12BKsvR/s1600/blog_TD_009.gif" imageanchor="1"><img border="0" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU_IpX5giBnT1O0_ER8hxlh0HAFOXQNej5Fle5irSYKQ3UoY-RU3b_o57OcIH89U2fyQtDm2nmeqaUVF4CLvxJIQJkNRbstN2sLbvKw2ZhYlSQ7APhua5ZcRbjmA1eK4v50g4to12BKsvR/s640/blog_TD_009.gif" width="640" /></a><br />
<br />
続いて、1FだけScatterしたものです。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbSexmQSMNu9b6BO5pfe-2oEAw7QNscEBYr7SQbc__uK_76__cA6yWe-nDB0XSz1BSrMC5dS7NfJYs3p4c47-KH9pb-IbYy5DFKU0n9FyU8dLfJ0-b-KGnkN__w3VJPZXZc_D6iPLD5lP7/s1600/blog_TD_010.gif" imageanchor="1"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbSexmQSMNu9b6BO5pfe-2oEAw7QNscEBYr7SQbc__uK_76__cA6yWe-nDB0XSz1BSrMC5dS7NfJYs3p4c47-KH9pb-IbYy5DFKU0n9FyU8dLfJ0-b-KGnkN__w3VJPZXZc_D6iPLD5lP7/s640/blog_TD_010.gif" width="640" /></a><br />
一目瞭然ですね。処理も速いですし、Velocityもうまく計算されています。<br />
<br />
Attribute Interpolateを使うと速くなるよということが言いたかったわけではありません。何が言いたかったかというと、重い処理を極力少なくすれば速くなるよということです。<br />
<br />
<br />
それを判断する材料の1つがTime Dependent Cookということです。<br />
<br />
特になにかしらのエミッターを作るときに、非常にお世話になります。シミュレーションは重いです。エミッターも重いとなるとトライアンドエラーの回数が減ってしまいます。<br />
<br />
<br />
<br />
<h4>
<span style="font-size: large;">まとめ</span></h4>
<br />
出来る限り重い処理を少なくするためにはどうすればよいか。<br />
<br />
今回の例だと<b>「動いているものにScatterして、Point群を動かす」</b>を<b>「Scatterして動いているものにくっつけ、Point群を動かす」</b>に変えました。言葉の並び替えみたいなようなものですが、この考え方が重要です。頭の中で、今ある仕組みを文にして、並び替えてみてください。 <br />
<br />
ただ単純にノードをつなぐ順番を変えるだけでも、速くなるかもしれません。Performance MonitorやTime Dependentを表示させて、どこがネックになっているか見てみましょう。<br />
<br />
今作っている仕組みには、これ使えないなと思ってるあなた!本当にそうでしょうか?固定観念を捨てて、違った角度から考えてみてはいかがでしょうか?なぜなら、あなたが使ってるソフトはHoudiniなんです。限界を作ってるのはあなた自身かもしれません。信じるか信じないかはアナタ次第です!笑 <br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-56999760383335315582015-11-07T13:43:00.001+09:002015-11-07T13:43:55.568+09:00[RnD] Pyro with Vorticity<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/144945053" webkitallowfullscreen="" width="500"></iframe> <br />
<a href="https://vimeo.com/144945053">Houdini RnD - Pyro with Vorticity</a> from <a href="https://vimeo.com/shohey">Shohei Okazaki</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<br />
レゾをそんなに高くしなくても、手軽にコントロールでき、形を崩しいい感じのShapeを作るを目的にしたRnD<br />
<br />
<a name='more'></a><br />
Houdini歴5年目にして、やっとSopレベルもそこそこになってきたので、最近Dopに力を入れ始めました。データの流れを考えながら構築していったり、Sopでの知識は必ず役に立ちますし、データを可視化できるので、今までもっていたMicroSolverに対する苦手意識がなくなりました。<br />
<br />
<br />
FumeやらPhoenix FDにvorticityというのがついてるのに、Pyroにはないのとお思いの方、朗報です。<br />
<br />
<span style="font-size: large;"><b>自分で作れます。</b></span><br />
<br />
あのプラグイン達はBlackboxになっているので、どのような手法をとっているかは伺えしれませんが、結果的によければOKです。<br />
<br />
普通に煙をエミットするとのっぺりとした部分ができてしまいます。 これを崩すにはTubulenceをかけたり、Pyroの場合はDisturbanceを使ったりします。Turbulenceの使い方を間違えると、エミットしてから時間が立っているとこにも強くかかってしまうと、ダサい煙になってしまいます。また、Disturbanceも強くかけ過ぎると、ボロボロになってしまいます。コントロールが難しいです。<br />
<br />
Phoenixの動画を見てもらえば、違いが解ると思います。<br />
<iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/1SnDTin2gUE?rel=0&showinfo=0" width="640"></iframe>
<br />
Vimeoにあげた動画の、最初の煙はエミットされてからすぐに、モコモコしてるのが分かると思います。これが、求めていたものです。コントロールも結構簡単です。<br />
<br />
作り方は、、、いくつかのMicroSolverとSop Solverの組み合わせですw<br />
Vorticleを作って、渦度が高くないところも高くして影響を与えるみたいなことをしてます。 <br />
(Divergenceをいじってもこんな結果ができるはずです。)<br />
<br />
手軽に自分で作れるこそが、Houdiniの強み<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-5490136854608035742015-07-16T00:54:00.000+09:002015-08-09T01:49:46.752+09:00Volume Displacement<br />
<h4>
<span style="font-size: large;">
Cloud Noise</span></h4>
<br />
シミュレーションをせずにVolumeを何かしら編集するエレメントといったら雲や霧だと思います。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYWTO8bGF5cPCOCN6eJDFqt1ZNlOla0dWJ9EbRSZlLkwKj3vZd7cNW0_XSVZEgtbUYZd2BPvlcfd4mf4Q57ssbK5_LVCw9Wl12tV3CnGNJLrRA4cJuTCg9Gw-WSm-6L4azuTRJ4Rf3pPBQ/s1600/blog_04_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<br />
エフェクトの人で雲を作るときに、ネット検索で引っかかり一回は目にしたことであろう、この論文<a href="http://magnuswrenninge.com/productionvolumerendering" target="_blank">http://magnuswrenninge.com/productionvolumerendering</a>, <a href="http://people.cs.clemson.edu/~jtessen/papers_files/RIV.pdf" target="_blank">Resolution Independent Volumes</a> 何やら、難しそうですね。てか4年も前なんですね。<br />
<br />
<a name='more'></a><br />
<br />
個人的な見解ですが、H13?から用意された<a href="http://www.sidefx.com/docs/houdini14.0/nodes/sop/cloudnoise" target="_blank">Cloud Noise Sop</a>はこれを元に作られていると見ています。理由は中を見ればわかります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzZz_uwdHA1BY4jsokvWsj7lxa6utJQ7F9QFzXMvUnYicnKys0qpN7HYJICWKOyGq5iVMPbxlw-h9HeTD4lDfh6eyIWEGqdcSrCXY7fDBjhNX0p9PWZyEHIATVr4KoALGmNUijHHzTfe8R/s1600/blog_04_001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzZz_uwdHA1BY4jsokvWsj7lxa6utJQ7F9QFzXMvUnYicnKys0qpN7HYJICWKOyGq5iVMPbxlw-h9HeTD4lDfh6eyIWEGqdcSrCXY7fDBjhNX0p9PWZyEHIATVr4KoALGmNUijHHzTfe8R/s1600/blog_04_001.png" /></a></div>
<br clear="all" />
Surfaceの場合、DisplacementはNormal方向に対して、ポジションをオフセットします。となると、VolumeのNormalを計算する必要があります。つまりGradientを用意します。<br />
<br />
1でDensity VolumeをPolygonにしてからSigned Distance Field(SDF)を作っています。SDFは表面までの距離を記録しています。これをVolume Vopで<a href="http://www.sidefx.com/docs/houdini14.0/nodes/vop/volumegradient" target="_blank">Volume Gradient</a>を使って読み込んだSDFから勾配を計算し、このVector方向にDisplacementしています。<br />
SOPでも<a href="http://www.sidefx.com/docs/houdini14.0/nodes/sop/vdbanalysis" target="_blank">VDB Analysis</a>か<a href="http://www.sidefx.com/docs/houdini14.0/nodes/sop/volumeanalysis" target="_blank">Volume Analysis</a>を使って勾配のVector Fieldを作れます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5fqeBIt6KyETK6-me4eF2ykr-WgBNPRjmPaEC5vjG_Rlk3-J2Kps0Qpp6Z3VpfFTYmhdL7fbwoRX2EoAK9DNGg8kZt-QTQLavczWiiEesZOypAEn75VaWJQOfDnUXJkOIuFuEhxScelG-/s1600/blog_04_007.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5fqeBIt6KyETK6-me4eF2ykr-WgBNPRjmPaEC5vjG_Rlk3-J2Kps0Qpp6Z3VpfFTYmhdL7fbwoRX2EoAK9DNGg8kZt-QTQLavczWiiEesZOypAEn75VaWJQOfDnUXJkOIuFuEhxScelG-/s1600/blog_04_007.png" /></a></div>
<br clear="all" />
<strike></strike><br />
<br />
DisplacementによってVolumeが膨らむことを考慮して、2でBounding Boxを大きくしています。<br />
<br />
3でNoiseを生成しています。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP53wNhasaztaXmA-y8xrqqii321NMZDrD9DRLuf_Z8gNqUjy0U40wafs8JvBKOfJBB8m0QRicLgldcVMvEU6nvokDBSe42TV3RmIPJqTE7I6vJqtbILflrKNP7YwV8Qh53NAlJh5DUEVl/s1600/blog_04_008.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP53wNhasaztaXmA-y8xrqqii321NMZDrD9DRLuf_Z8gNqUjy0U40wafs8JvBKOfJBB8m0QRicLgldcVMvEU6nvokDBSe42TV3RmIPJqTE7I6vJqtbILflrKNP7YwV8Qh53NAlJh5DUEVl/s400/blog_04_008.png" width="400" /></a></div>
<br clear="all" />
NoiseはForを使って、最初のNoiseより少し小さなNoiseを足していくようなことを繰り返すことによって複雑なNoiseを作り出しています。あとはAdvectionもありますね。<br />
<br />
論文で紹介されているやり方に似ていると思いませんか?<br />
<br />
中を覗いてみることによって、細かいところは理解できなかったとしても、VolumeにDisplacementする大枠はつかめたのではないでしょうか?<br />
SDFからGradientを計算し、その方向にNoiseで作った値をDisplacementするという流れです。次に、この考えを応用してみます。<br />
<br />
<br />
<h4>
<span style="font-size: large;">
Pyro Displacement</span></h4>
<br />
<div class="separator" style="clear: both; text-align: left;">
<iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/_TE35j8tBC4?loop=1&playlist=_TE35j8tBC4&rel=0&showinfo=0" width="640"></iframe></div>
<br />
VolumeのDisplacementの方法がわかったところで、続いてシミュレーションしたVolumeに対しての方法を紹介します。<br />
<br />
前述の方法は静止しているPに対してNoiseをかけていました。今回は シミュレーションされたVolumeに対して処理を施します。PにNoiseをかけると煙の動きとあいません。Maya Fluidだと煙の進行方向と動きのスピードに合わせて、Noiseのオフセットにキーを打つみたいなことをした経験があるかたもいるかもしれませんが、そんなことはしません。<br />
<br />
restが必要です。他のソフトではP_refとか言われていますね。<br />
<br />
<br />
rest Filedを作るにはいくつか設定が必要です。<a href="http://www.sidefx.com/docs/houdini14.0/nodes/dop/smokeobject#idm140150855641520" target="_blank">Smoke Object</a>と<a href="http://www.sidefx.com/docs/houdini14.0/nodes/dop/smokesolver#adv_restfieldtab" target="_blank">Solver</a>に設定すべき項目があるので設定します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVPie3H9ccXoKYPBSeVThQif6QQ8W6V78MkgqEXo0SDBE4QK8-glO9zQYHxHYkFLY0cCzpbj27XeCBEgYxQJG8_m5LNnfdOr77nv_neyvhaAz_utbJbdz6zM3HE8sL5VCHIIraO0GAFqZq/s1600/blog_04_005.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVPie3H9ccXoKYPBSeVThQif6QQ8W6V78MkgqEXo0SDBE4QK8-glO9zQYHxHYkFLY0cCzpbj27XeCBEgYxQJG8_m5LNnfdOr77nv_neyvhaAz_utbJbdz6zM3HE8sL5VCHIIraO0GAFqZq/s1600/blog_04_005.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
ヘルプによるとRest Fieldは、流体の位置を追跡するフィールドと解説されています。また、Dual Restは長いシミュレーションの時に有効で、異なる開始フレームで始まる2つのrestができて、その2つをブレンドして使います。そして、Detailアトリビュートにrest_ratioとrest2_ratioの2つが追加されます。VopまたはShader内で読むときは、restとrest2を<a href="http://www.sidefx.com/docs/houdini14.0/nodes/vop/mix" target="_blank">Mix</a>でまぜbaisにratioを入れてあげます。<br />
<br />
<br />
最後にSDFも用意しておきましょう。<br />
<br />
ここまで用意できれば、後はrestを元にNoiseを作ってDisplacementするだけです。SOPでやるかShaderでやるかは、アナタ次第です。<br />
<br />
ちなみにShaderでやる場合は、Pyro Shaderを参考にすると良いです。<br />
上の動画はBasic Smokeを元に作りました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0u0lythoNtWpMqpHYOMJd4pmEPkJtc1QNnSiqXzcNctdItGTFNNXe5E_bulgYHGhi4VL0zBK16J-Rev6Hxn_BS8Klhh-ZXRIJNg4fMLVDczWkIVkRnTLIN0W1tKCHU4uM9Eg1fUjSaYYb/s1600/blog_04_009.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="396" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0u0lythoNtWpMqpHYOMJd4pmEPkJtc1QNnSiqXzcNctdItGTFNNXe5E_bulgYHGhi4VL0zBK16J-Rev6Hxn_BS8Klhh-ZXRIJNg4fMLVDczWkIVkRnTLIN0W1tKCHU4uM9Eg1fUjSaYYb/s640/blog_04_009.png" width="640" /></a></div>
<br clear="all" />
<br />
<br />
<br />
<br />
<br />
<h4>
<span style="font-size: large;">
おまけ。Compress Volume Cache</span></h4>
<br />
とあるセミナーで、キャッシュサイズの節約法みたいな話がでていたみたいなんで、ここでも触れてみたいとおもいます。といっても、これまた用意されているOTLとノードの解説なんで、手抜き感が否めないですが、意外と知らない方が多いので紹介します。<br />
<br />
ShelfからPyroを組んでる人は、Dop I/O SOPを使ってキャッシュをとってる人がいるかもしれません。そのSOPにCompressionタブがあり、これを使います。これはVolume Compressノードの値を逃しているだけです。<br />
このノードは基本的に、以下の画像の赤枠をいじればよいかと思います。Compress設定は、レンダリングに影響が出ない範囲で、最適な値を各自見つけてください。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_qos4Qj2pM1DGdyIZKY_wKWCWvE3O_CtBgTpGSq3x7OXxHI0KlOEnf_hctx58ZBsCfmo19XXZrOlcJI_j-nk1fPLLrum3iV47Hc2Ko7l2Fi_ZzNIlBf34wj9ETp2cAZFHRrgAW2JiX5l/s1600/blog_04_003.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_qos4Qj2pM1DGdyIZKY_wKWCWvE3O_CtBgTpGSq3x7OXxHI0KlOEnf_hctx58ZBsCfmo19XXZrOlcJI_j-nk1fPLLrum3iV47Hc2Ko7l2Fi_ZzNIlBf34wj9ETp2cAZFHRrgAW2JiX5l/s1600/blog_04_003.png" /></a></div>
<br clear="all" />
<br />
ちょうど2年前に比較したデータですが、Compressをすることでサイズが半分くらいになり、ディスクへの書き込み時間も減っています。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9ZgLw3e4d2kbXVlOZbmKlkfLxA1cbKIRXKG0jmuKFYXPO6mW6_6aapgrm1_wJILg0kptf_t2Hjt43D4c9FsWGteGMIIAV8q5rrgK9KBmx02XAmuEUoprBWJqBbmU1zl_1ikb4pq92ujzF/s1600/blog_04_002.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9ZgLw3e4d2kbXVlOZbmKlkfLxA1cbKIRXKG0jmuKFYXPO6mW6_6aapgrm1_wJILg0kptf_t2Hjt43D4c9FsWGteGMIIAV8q5rrgK9KBmx02XAmuEUoprBWJqBbmU1zl_1ikb4pq92ujzF/s1600/blog_04_002.png" /></a></div>
<br clear="all" />
余談ですが、この表はWindowsとLinuxを比べることを目的にしたものです。どちらが速いかはわかりますよね。<br />
<br />
<br />
また、多くのVolumeなんちゃらSOPはVDBに対応していません。VDBのデータを16bitにしたい場合は、PrimitiveのVolume>VDBにWrite 16-Bit Floatsというオプションにチェックを入れます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcA8aSN2ico_ICsvGi_k7imjz7AiK4N9a60ji3g0YLYjNAZnS8U_qmq6Pbwd19JYutTlhZe1cFF_0mj1VVVhWLOTZQauhngxtNuFPnFtythgah3aqYTuaVC8rzAW73C7udA8Iq8aYcXt-V/s1600/blog_04_004.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcA8aSN2ico_ICsvGi_k7imjz7AiK4N9a60ji3g0YLYjNAZnS8U_qmq6Pbwd19JYutTlhZe1cFF_0mj1VVVhWLOTZQauhngxtNuFPnFtythgah3aqYTuaVC8rzAW73C7udA8Iq8aYcXt-V/s1600/blog_04_004.png" /></a></div>
<br clear="all" />
<br />
<br />
<br />
<h4>
<span style="font-size: large;">まとめ</span></h4>
<br />
今回の内容は、SideFxが用意したOTLの解説みたいになってしまいました。Houdiniのアセットは、ブラックボックスになっているところが少ないので中の仕組みを見ることも、編集して自分用にカスタマイズできます。当たり前ですが仕事で使うには、遅かったりコントロールが難しかったり、クオリティが出にくいことがあるので、中を見たり編集する行為は必然です。<br />
<br />
Sigrapphのようなところで発表された技術も、Cloud Noise Sopのように既存のノードを組み合わせるだけで一部を再現できることがあります。Mayaやプラグインのアップデートを待たないと何もできないと手をこまねいているより、新しい技術を観て取り入れるチャレンジをすれば色んな発見をし、可能性が広がるかもしれません。<br />
<br />
<br />
<br />
<br />
<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com4tag:blogger.com,1999:blog-6350472608286146708.post-21102980668198918972015-05-03T12:04:00.000+09:002018-01-27T13:08:05.904+09:00Dynamically Fractured ObjectFXらしく少し見栄えの良いものを紹介します。<br />
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='640' height='266' src='https://www.blogger.com/video.g?token=AD6v5dydblh_-NvUakASvBZlk09ApqRiuqYNeDCSBX6-o7bpDwAthdqe4XhkjRpvCMVhtp7OCzuolrpezyZCeO_T8w' class='b-hbp-video b-uploaded' frameborder='0'></iframe> <br />
破壊です。といっても、激しいやつではありません。 <br />
<br />
<div>
破壊をするときは、Pre-Fractureしてからシミュレーションをかける事が大半だとも思いますが、何かしらのトリガーによって自動的に破壊が起こる仕組みを作ってみます。<br />
<br />
<br />
<a name='more'></a> 今回のトリガーさんはImpactです。何かしらが対象物に当たり、ある一定以上の衝撃を受けた部分を壊していきます。</div>
<div>
(昔からshelfにRBDで似たようなのができるボタンがあったと思いますが、使ったことないのでよく知りません。)<br />
<br />
簡単なところやパラメータに関しての説明はしませんので、hipファイルを見ながら、ブログを読んでいただけるとありがたいです。<br />
<a href="https://drive.google.com/open?id=0BxR_QF5anLH0ZHVWTEliR28tXzA&authuser=0" target="_blank">シーンファイル</a>(Houdini14.0.291-gcc4.8 Fedora20) </div>
<div>
<div>
<br />
<br />
そもそもRBD Packed Objectを使ったことない人は、これからの説明を理解することは困難だと思うので、日本語字幕も付いている<a href="https://www.sidefx.com/index.php?option=com_content&task=view&id=2622&Itemid=132" target="_blank">H13 Masterclass | Bullet</a>を見ることをおすすめします。<br />
<br />
このチュートリアルの19:30くらいからのPackエミットを使って、破壊を引き起こす飛んでくる物体をつくります。しかし、チュートリアルのままだと、エミットの量が倍になってしまいます。この問題は、RBD Packed Objectが複数あると起こっていしまいます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCpD5-RVrDA3i6iz53cJgFQvqtsE-bUlO5BMr6Vkfrozo7oefb6BR_WjQuhd1yd7T_Cq_YMlTe-AZDo5_zDUWmUKOrPR5R1V2g7hAYizOD4BfgvYZ8B8IGGDOo_Y4HTYnt6UMUdewarlVO/s1600/blog_03_002.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCpD5-RVrDA3i6iz53cJgFQvqtsE-bUlO5BMr6Vkfrozo7oefb6BR_WjQuhd1yd7T_Cq_YMlTe-AZDo5_zDUWmUKOrPR5R1V2g7hAYizOD4BfgvYZ8B8IGGDOo_Y4HTYnt6UMUdewarlVO/s1600/blog_03_002.gif" height="160" width="320"></a></div>
<br clear="all" />
上の画像のように白い柱と赤いボックスは、別々のRBD Packed Objectです。この2つがGeometryというデータを持っているため、SopSolverが両方に処理を行ってしまいます。なのでエミットの量も2倍になっています。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLolvTBZIVsuwBQleHMx7dfJlPYiQbOGqrzh26WZp4hJcmXf6sX_4ApHd-CglipF2wcRdMYF3XGCrYk5Z8OCwxMaIVc58o1qEl8lvANPx2MwqeajMFHXtQuxUcQ1TL85C_ulW0Gk-gRB1o/s1600/blog_03_004.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLolvTBZIVsuwBQleHMx7dfJlPYiQbOGqrzh26WZp4hJcmXf6sX_4ApHd-CglipF2wcRdMYF3XGCrYk5Z8OCwxMaIVc58o1qEl8lvANPx2MwqeajMFHXtQuxUcQ1TL85C_ulW0Gk-gRB1o/s1600/blog_03_004.png"></a></div>
<br clear="all" />
問題を解決するには、片方だけに処理が行われるようにしなければいけません。<br />
<a href="https://www.sidefx.com/docs/houdini14.0/nodes/dop/emptydata" target="_blank">Empty Data</a>で任意のDataを作り、<a href="https://www.sidefx.com/docs/houdini14.0/nodes/dop/enablesolver" target="_blank">Enable Solver</a>で作ったDataに対してのみ作用するようにします。(ここの使い方が正しいかは、あまり自信がないです)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYgnyxnCLRbHZ5FFQU2fyQqamGee7iwH-4YAsAj5b36mQpp-yccYhdwB5uwJ2xnoIDAGEmFg8edx0jMGFui-uEvoGi834GIPeD3oprRjvoEe_GxlhaoQWAyjbL2LxM7W3cLvDTYT0TtdNW/s1600/blog_03_005.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYgnyxnCLRbHZ5FFQU2fyQqamGee7iwH-4YAsAj5b36mQpp-yccYhdwB5uwJ2xnoIDAGEmFg8edx0jMGFui-uEvoGi834GIPeD3oprRjvoEe_GxlhaoQWAyjbL2LxM7W3cLvDTYT0TtdNW/s1600/blog_03_005.png"></a></div>
<br clear="all" />
これで意図する結果が得られました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3htvYoV0vRTSBge7xUTMgGbuBtFFmzOYu2UD8N6Va7Mt6bSzRrJYlWrcKDtchZdfkJbRSsYquAbGdmVp4_aPO04mjBqBFS01OP57kYSLjFem80IwzF46Mba4d19lofggSCdOqOy1-9W7q/s1600/blog_03_001.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3htvYoV0vRTSBge7xUTMgGbuBtFFmzOYu2UD8N6Va7Mt6bSzRrJYlWrcKDtchZdfkJbRSsYquAbGdmVp4_aPO04mjBqBFS01OP57kYSLjFem80IwzF46Mba4d19lofggSCdOqOy1-9W7q/s1600/blog_03_001.gif" height="160" width="320"></a></div>
<br clear="all" />
<br /></div>
<div>
続いて、Impactの情報を取得するために、<a href="https://www.sidefx.com/docs/houdini14.0/nodes/dop/impactanalysis" target="_blank">Impact Analysis</a>を使います。これはImpactの時間や強さ、法線、ぶつかったオブジェクトのOBJID等を取得できます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRS8fmT3tYW_2s-selRXaJnMK4Oeil4689YgtB1V1rKj86UlBT_3MTNItyv6XGIdHeJ1_89AepTwmLHQdsinFsTbnMR4E0Pb8ZzOP3z1a7ShsUcpOeqGa9cW8b4O-a1WjJrbJNJMFI-gA1/s1600/blog_03_003.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRS8fmT3tYW_2s-selRXaJnMK4Oeil4689YgtB1V1rKj86UlBT_3MTNItyv6XGIdHeJ1_89AepTwmLHQdsinFsTbnMR4E0Pb8ZzOP3z1a7ShsUcpOeqGa9cW8b4O-a1WjJrbJNJMFI-gA1/s1600/blog_03_003.gif" height="160" width="320"></a></div>
<br clear="all" />
このImpactの情報を元にFractureしていきます。<br />
初めに衝撃を受けたピースの判定をします。Impactの情報の中にはimpactobjectとimpactprimnumがあります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip79r2wT8WCzK3rwGFSPjJXUxrxHFFJzez8Djblm7xsQ6_8UEoNQateYoY7dFSU6R-RWT_5GrviWMdVyY_4iM82hxjrQgSzpsKAzYT-TfJDRnXvgW5pIDBqoPz7lQLxTTM9H52WsQsZPdp/s1600/blog_03_006.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip79r2wT8WCzK3rwGFSPjJXUxrxHFFJzez8Djblm7xsQ6_8UEoNQateYoY7dFSU6R-RWT_5GrviWMdVyY_4iM82hxjrQgSzpsKAzYT-TfJDRnXvgW5pIDBqoPz7lQLxTTM9H52WsQsZPdp/s1600/blog_03_006.png" height="164" width="320"></a></div>
<br clear="all" />
impactobjectは$OBJIDのことで、impactprimnumはPackのPrimitive Numberです。<br />
このimpactprimnumをArrayアトリビュートに格納します。<br />
<pre class="prettyprint"><code class="language-cpp">int numpoints = npoints(0);
i[]@_impactList;
for(int i=0; i<numpoints; i++){
int prinum = point(0,"impactprimnum",i);
append(@_impactList,prinum);
}</code></pre>
Arrayの中に重複した値がある場合がありますが、今回は問題にならないので無視します。<br />
H14からArrayをアトリビュートに保存できるようになりましたが、すごい便利ですね。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgjGH7D3rFrjW3fPkPT-useoWeZE4WWgyLBfHOjCss4aIn8466aeX2LQg9rTnkpfA90z1k8u56cqrDiSL4cKvt4zrddEZQ7kL7KJ9e3q4Jj2L_MoemNUTyjafO8t5AcnaRIrk1eIr5wAjK/s1600/blog_03_007.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgjGH7D3rFrjW3fPkPT-useoWeZE4WWgyLBfHOjCss4aIn8466aeX2LQg9rTnkpfA90z1k8u56cqrDiSL4cKvt4zrddEZQ7kL7KJ9e3q4Jj2L_MoemNUTyjafO8t5AcnaRIrk1eIr5wAjK/s1600/blog_03_007.png"></a></div>
<br clear="all" />
Vopを使ってprimnumがこのArrayの中にある値と同じときに、任意のGroupに入るようにしています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBzXbm__UlQG6clgDuMwy63emOMH-T5nwGJg0SN3iwBMsVpLLdVkF2bZIIGc-4gHVdT8SX5yNMmydxk6A1w3aUEgb4WsDJU9zs-Q_h22js5vmzwKcJDxpYvUqPWPLTXEyjmAGCahXmqvQ/s1600/blog_03_008.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeBzXbm__UlQG6clgDuMwy63emOMH-T5nwGJg0SN3iwBMsVpLLdVkF2bZIIGc-4gHVdT8SX5yNMmydxk6A1w3aUEgb4WsDJU9zs-Q_h22js5vmzwKcJDxpYvUqPWPLTXEyjmAGCahXmqvQ/s1600/blog_03_008.gif"></a></div>
<br clear="all" />
後は、このGroupに入ったピースをUnpackして壊してくだけです。<br />
<br />
砕いた後に、packed objectに戻しますが、nameアトリビューを重複しないように修正します。nameはコンストレイントでは必ず使用されるので注意して扱う必要があります。また、RBD Packed Objectの中にあるcreate_or_overwrite_attributesをみてシミュレーションに必要なアトリビュートを設定しておきましょう。最後に、砕く前のvなどのアトリビューを移しておくと、それらの値を継承したまま新たな破片が生まれることになります。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcu6edkmLZ4RfTGQ8hHUGUYle_oCRg46cJBCCWbJo-LuFJhkJRf_jtKJjcHzpmy-lllZSgobMA4ZZCBDna6_ySN-40y6auGhJe4cTE46EzVx3bN5GuNVNrymxTfpTzBTixqhAxb8eF6da3/s1600/blog_03_009.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcu6edkmLZ4RfTGQ8hHUGUYle_oCRg46cJBCCWbJo-LuFJhkJRf_jtKJjcHzpmy-lllZSgobMA4ZZCBDna6_ySN-40y6auGhJe4cTE46EzVx3bN5GuNVNrymxTfpTzBTixqhAxb8eF6da3/s1600/blog_03_009.gif"></a></div>
<br clear="all" />
<br />
このままだと無限に割れ続けてしまうので、ある一定の状態になったものは割れないようにしといたほうが良いです。例えば、ピースがある一定以下のサイズになった場合とか、割れる最大回数を指定しておくとかです。 <br />
<br /></div>
<div>
さらにコンストレインを毎フレーム更新すると、より見栄えが良くなっていくと思います。最初のムービーはPin Constraintを毎フレーム生成しています。<br />
<strike>書くの疲れてきたしGW中なので</strike>諸事情により、これらの説明等は割愛させていただきます。</div>
<div>
<br />
<div>
Packが登場して格段にDopでのコントロールが簡単になりましたね。ほぼSopです。Details Viewを見ながら値を簡単に確認しながらできるので楽です。<br />
色んな人に言っていますが、重要なのはSopです。今回、Dopを使ってますが、ほとんどの作業はSopです。Sopを制するものはHoudiniを制するとまでは言いませんが、それくらい重要です。<br />
</div>
</div>
</div>
Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-82124519190091611262015-03-02T02:53:00.001+09:002018-01-27T13:11:05.171+09:00Wrangleを使おう 2.5一個書き忘れてたことがあったので、さらっと。<br />
<br />
<a href="http://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E5%AE%9A%E6%95%B0">数学定数</a>、円周率(π)・自然対数の底(e)・黄金比(φ/τ)とか、時々使うけど漠然としか値を覚えていない奴らがいます。正確な値を知るために毎回、調べるのは億劫です。<br />
<br />
例えば、Wrangleで初めに#include <math.h>と書けば、以降このノード内ではM_PIが3.1415926の値を持っていることになります。<br />
<pre class="prettyprint"><code class="language-c">#include <math.h>
f@_check = M_PI;</code></pre>
<br />
なにが起こっているかというと、$HH/vex/includeにmath.hというファイルがあります。そのファイルの中で、定義されたものを読み込んでいます。この他にもあるので中を見てみてください。<br />
<br />
このファイルは自分で作ることもできます。例えば黄金比を呼び出したい場合。<br />
<pre class="prettyprint"><code class="language-c">#define PHI 1.61803</code></pre>
これを、HOUDINI_PATHに設定している場所のvex/includeに.h形式で保存するか、HOUDINI_VEX_PATHに登録しているところに保存すれば、これ以降、読み込むことができます。<br />
<pre class="prettyprint"><code class="language-c">#include <test.h>
f@_check = PHI;</code></pre>
<br />
決められたところに保存しなくても、test.hのところを/home/user/test.hとパスを入れても呼び出すこともできます。<br />
<br />Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-42572441442189760452015-03-01T11:40:00.000+09:002018-01-27T13:09:30.234+09:00Wrangleを使おう 2<br />
Wrangleは、アトリビュートを作ったり編集するだけでなく、Pointを作ったりPrimitiveを作ったりもできます。初心者向けのチュートリアルで時々みるPointSopを使って、Pを編集してるやつをWrangleで置き換えてみます。こんなやつです。<br />
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0yD7RvaiZnZ0493RQwB1e8KNX8vu3-NvvuyUoJuc4RxLH2RgSvBLS3OLsKIlOLJHuQ3MHOsKJM1IB4XhWeiVcMOVdyM63aCiMqgL1A233fre2IfOYNgaDXXMDTRMNTKgv5bBQYsC9AH_R/s1600/blog_02_001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0yD7RvaiZnZ0493RQwB1e8KNX8vu3-NvvuyUoJuc4RxLH2RgSvBLS3OLsKIlOLJHuQ3MHOsKJM1IB4XhWeiVcMOVdyM63aCiMqgL1A233fre2IfOYNgaDXXMDTRMNTKgv5bBQYsC9AH_R/s1600/blog_02_001.png"></a></div>
<br clear="all" />
<div>
<br />
<a name='more'></a><br />
まずラインの作り方</div>
<div>
line sopできますが、wrangleでやってみます。ただの直線を作るときに、わざわざwrangleでやる必要はないかと思いますが、近くのpoint同士を結びつけるときなど普通にやろうとすると、めんどくさい時に重宝するので覚えときましょう。<br />
<br /></div>
<pre class="prettyprint"><code class="language-cpp">int res = 10;
float height = 5.0;
int line = addprim(0, "polyline");
for(int i=0; i<res; i++){
vector pos =set(1, height/(res-1)*i, 0);
int cp = addpoint(0,pos);
addvertex(0, line, cp);
}</code></pre>
<div>
<br />
長さ(height)とポイント数(res)を決めてあげて、これらのポイントを結んでラインを作ります。なぜ、Vertexを作る必要があるかというと、Primitiveを構成するにはVertexが必要です。Pointではありません。<a href="http://www.sidefx.com/docs/houdini14.0/vex/snippets#idm47124599254960" target="_blank">http://www.sidefx.com/docs/houdini14.0/vex/snippets#idm47124599254960 </a></div>
<div>
<br />
もちろん、Vopでもつくれます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVyk_h2fBbW3klocCqq7czXwpDuY9JOE_x56pzvP1x84rPuhOe_dae6MVHHGjBKk58Q78yhj1RR9y2rTbxDc5YdgVgH7FNt_xG7ZS_RNki0s4WRvyMAM0JaJoVfe3Kt_srKiV8kF-2X7uE/s1600/blog_02_002.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVyk_h2fBbW3klocCqq7czXwpDuY9JOE_x56pzvP1x84rPuhOe_dae6MVHHGjBKk58Q78yhj1RR9y2rTbxDc5YdgVgH7FNt_xG7ZS_RNki0s4WRvyMAM0JaJoVfe3Kt_srKiV8kF-2X7uE/s1600/blog_02_002.png" height="393" width="640"></a></div>
<br clear="all" />
ラインが作れたら、各Pointの位置を編集するだけです。簡単ですね。<br />
<br />
<pre class="prettyprint"><code class="language-cpp">int res = 100;
float rad = 3;
float height = 5;
float freq = 10;
int line = addprim(0, "polyline");
for (int i = 0; i < res; i++){
vector pos;
pos.x = sin(radians(i) * freq) * rad;
pos.y = height / (res-1) * i;
pos.z = cos(radians(i) * freq) * rad;
int cp = addpoint(geoself(),pos);
addvertex(0, line, cp);
}</code></pre>
<br />
1つ気をつけないといけないのは、エクスプレッションのsin/cos/tanは<b>Degree</b>、Vexは<b>Radian</b>なので変換が必要です。<br />
<br />
sine, cosine, tangent, dot product, cross product,etc...<br />
この業界に入って思うことは英語、数学、物理学、英語、英語とか色んな知識が必要です。専攻していた分野が、この業界とは全く関係ないとはいえ、学生時代なにしてたんでしょうね(T_T)<br />
今まで働いてきた会社には多くの優秀な外人がいました。日本人の優秀な人より、基礎がしかっりしているなとよく感じました。(日本では専門学校でソフトの使い方を軽く教わるだけが大半という時点で差がついてしまってるかもしれませんね。)<br />
彼らは基礎知識がしっかりしてる上に最新の技術も積極的に取り入れています。そして、なにより勉強熱心です。この差を詰めるのは大変です。<br />
<br />
日本人でも外人でも、尊敬できる優秀な人に共通してることは、30過ぎても年齢など関係なく勉強を怠らない人たちです。日々勉強ですね。<br />
<br />
<br />
話はそれましたが、<a href="http://sidefx.jp/doc/ref/expression_cookbook.html#id397844" target="_blank">http://sidefx.jp/doc/ref/expression_cookbook.html#id39784</a><a href="https://www.blogger.com/null">4</a>に、いくつかExpressionの例があるので、Wrangleに置き換えてみてください。<br />
三角関数を使って<a href="http://www.nano-architects.com/curves.html" target="_blank">色んな形</a>を作れるので、面白いですよ。<br />
<br />
シーンファイルはこちらです。(Houdini14.0.201.13-gcc4.8 Fedora20) <br />
<a href="https://drive.google.com/file/d/0BxR_QF5anLH0akFiX2Y1V0ROSUE/view?usp=sharing">https://drive.google.com/file/d/0BxR_QF5anLH0akFiX2Y1V0ROSUE/view?usp=sharing</a><br />
<br />
次は、もうちょい絵的にFXっぽいネタにします。<br />
<br /></div>
Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com0tag:blogger.com,1999:blog-6350472608286146708.post-20346256395068159962015-02-18T13:59:00.000+09:002018-01-27T13:15:37.766+09:00Wrangleを使おう 1<br />
12.5から搭載されたWrangleですが、結構避けてる人が多い印象です。せっかくノードベースでやってるのに、<strike>イライラする</strike>MayaのExpressionを思い出させられて避けてるのかもしれません。しかしMayaから移行した人にとっては、Expressionと似ているので敷居は高くないはずです。エフェクト屋でPythonとかMelなどのScriptを、全く書けないという人はいないと思うんで、その知識も役立ちます。<br />
<br />
お勧めする理由は、単純に速いの一言につきます。初心者向けのチュートリアルでよく出てくる、$CR>0.2みたいなExpressionを使うやつが重いです。なぜ遅いのか、ざっくり言うとシングルスレッドだからです。<br />
個人的な意見ですが、チュートリアルでPoint Sopを使ってるのをよく見かけますが、もはや使うことはありません。Attribute Createもほとんど使わないです。理由は遅いからです。VopとWrangleは、ざっくり言うとマルチスレッドで速いからです。<br />
<br />
別にVopでいいじゃんと思う人もいるかもしれせんが、Wrangleの方が簡単に済ませられる時もあるので、覚えておいて損はないです。<br />
<br />
<br />
では、どんだけ違うか検証してみましょう。<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
SphereをScatterして100万ポイント作ります。ポイントにランダムなカラーをつけて、赤が0.1より大きいポイントを消すことにします。<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
従来?の方法の場合<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjExXWs9MVQ23brG7OHkOu6hRiFDVpKPnYNUU_l2v-cqfIMvCKeK3YYZTT8DhgEj4dCV4rTGh3in5wCxDmv__zKi_sJpMMY2-hWxE8ftrSXlQxJ7kPab-aFzDR_quUtoF5ZJ1XHj-m7xqyr/s1600/blog_01_006.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjExXWs9MVQ23brG7OHkOu6hRiFDVpKPnYNUU_l2v-cqfIMvCKeK3YYZTT8DhgEj4dCV4rTGh3in5wCxDmv__zKi_sJpMMY2-hWxE8ftrSXlQxJ7kPab-aFzDR_quUtoF5ZJ1XHj-m7xqyr/s1600/blog_01_006.png"></a></div>
<br clear="all" />
<br />
50フレームで1分47秒かかります<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv9rtM1bsv6chcTF-Y9HpAxp5gsDOPZ2WGhqtR_aqmWvq5a4P61ZQkVaOjHYrK7W3puwjUbxDLHtbVKv6Qi-KQa8zwL4xnP4PUpKcLS2bGnWLsP0jUBJ-mrfSAMXDJg0L8Fwwqgc7t6_Py/s1600/blog_01_001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv9rtM1bsv6chcTF-Y9HpAxp5gsDOPZ2WGhqtR_aqmWvq5a4P61ZQkVaOjHYrK7W3puwjUbxDLHtbVKv6Qi-KQa8zwL4xnP4PUpKcLS2bGnWLsP0jUBJ-mrfSAMXDJg0L8Fwwqgc7t6_Py/s1600/blog_01_001.png"></a></div>
<br clear="all" />
CPUをみてみると、使ってないコアがあるのがわかります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzI0LBcYjo1tFNOhkNDTWlzOjSzwqwsGY666SuqZlF1tqx8Waxo4qmKbX8ZsjwBcf6OnJ0gOA9aR1_cMLAv3lsdx6oVyBoUvGdWpTl_NGcvMLHCY_2V7-DGOGSPQ5O5rvp6aAnnE-v1Tb5/s1600/blog_01_004.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzI0LBcYjo1tFNOhkNDTWlzOjSzwqwsGY666SuqZlF1tqx8Waxo4qmKbX8ZsjwBcf6OnJ0gOA9aR1_cMLAv3lsdx6oVyBoUvGdWpTl_NGcvMLHCY_2V7-DGOGSPQ5O5rvp6aAnnE-v1Tb5/s1600/blog_01_004.png" height="254" width="640"></a></div>
<br clear="all" />
これらをWrangleで置き換えてみます。Wrangleでランダムな色をセットする際は<br />
<pre class="prettyprint"><code class="language-c">v@Cd = set(rand(@ptnum), rand(@ptnum + 0.123),rand(@ptnum + 1.234));</code></pre>
<br />
ポイントを消すには<br />
<pre class="prettyprint"><code class="language-c">if(@Cd.x > 0.1)
removepoint(geoself(),@ptnum);</code></pre>
16秒で計算されました。速いっすね。<br />
<div class="clear" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3HHCr59mDIFImBQQ63zengRPT_bI18bkv18H3Gkv7sB84IqFraXRnkLtzMLJYYJmDrT_iznGJnJCTimoCon2GxnCnmTQndZI1iLZ35r1XqYuOdUthQqqSpmNY67D8euivMr3jrZQeHSLF/s1600/blog_01_002.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3HHCr59mDIFImBQQ63zengRPT_bI18bkv18H3Gkv7sB84IqFraXRnkLtzMLJYYJmDrT_iznGJnJCTimoCon2GxnCnmTQndZI1iLZ35r1XqYuOdUthQqqSpmNY67D8euivMr3jrZQeHSLF/s1600/blog_01_002.png"></a></div>
<br clear="all" />
CPUはすべて使ってます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0sH6_zXTTb5lmHYJnG-ncuucR4gnnUaooNrbCAo1QMIRquKs8aJtcijZoISgRyUARfxFpwJGMycWox6yTTYs8103j42jN2Evvd8ySczJxYHGS05bahVmLP5KNEJ07EtscfmnnzF8dO1JF/s1600/blog_01_005.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0sH6_zXTTb5lmHYJnG-ncuucR4gnnUaooNrbCAo1QMIRquKs8aJtcijZoISgRyUARfxFpwJGMycWox6yTTYs8103j42jN2Evvd8ySczJxYHGS05bahVmLP5KNEJ07EtscfmnnzF8dO1JF/s1600/blog_01_005.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0sH6_zXTTb5lmHYJnG-ncuucR4gnnUaooNrbCAo1QMIRquKs8aJtcijZoISgRyUARfxFpwJGMycWox6yTTYs8103j42jN2Evvd8ySczJxYHGS05bahVmLP5KNEJ07EtscfmnnzF8dO1JF/s1600/blog_01_005.png" height="255" width="640"></a></div>
<br clear="all" />
ちなみに、Vopで組むとなると、こうです。<br />
ランダムな色を作るには<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGHf8GoTO7mODP-Tdyda4mtzhf3eL_Ceb556DqyiCr3mB1BbsdvWoQqWcpnuu6l3lS_Y7ymuBKhKiJwlI0nK_OC2DeI1x92mPqElxRmYTYGGYBqHl0ZcFgBFT4H8-3YsDmeM96DsUeU-ip/s1600/blog_01_007.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGHf8GoTO7mODP-Tdyda4mtzhf3eL_Ceb556DqyiCr3mB1BbsdvWoQqWcpnuu6l3lS_Y7ymuBKhKiJwlI0nK_OC2DeI1x92mPqElxRmYTYGGYBqHl0ZcFgBFT4H8-3YsDmeM96DsUeU-ip/s1600/blog_01_007.png" height="212" width="640"></a></div>
<br clear="all" />
ポイントを消すには<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxQ5VpZc__rCBOkFP180ptiQGCPmfycLBR399VFE9v1Yc75nClK59fpqGo3pAsNEpj3SBUHd-sbFi8ubMh7cZ-U-tZ8MQkleMMPS1KOzJ4vTwglqBTUQt2yhRuJOEEJGitOYsCpdQ6rTCw/s1600/blog_01_008.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxQ5VpZc__rCBOkFP180ptiQGCPmfycLBR399VFE9v1Yc75nClK59fpqGo3pAsNEpj3SBUHd-sbFi8ubMh7cZ-U-tZ8MQkleMMPS1KOzJ4vTwglqBTUQt2yhRuJOEEJGitOYsCpdQ6rTCw/s1600/blog_01_008.png" height="174" width="640"></a></div>
<br clear="all" />
Wrangleのほうが簡単に見えませんか?このケースではVopとWrangleの速度は、ほとんど変わりません。<br />
<br />
<br />
<br />
さらに、他のSopもWrangleで置き換えてみましょう。<br />
<br />
・ある条件のもとでグループを作りたいときは<br />
Group <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv_Bldm1VYLO5ANEaFzpFo0E1tYmCemu5sK94rMeHsxUvceukdqOY8e1iWe73ykBPPQXW8uN9xQvpbnuMppoAklGbJjOgSlmB3RHabDww73uZJnjm9UBl-UtvTkBPwF9SrFbLMk8Ye13P-/s1600/blog_01_009.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv_Bldm1VYLO5ANEaFzpFo0E1tYmCemu5sK94rMeHsxUvceukdqOY8e1iWe73ykBPPQXW8uN9xQvpbnuMppoAklGbJjOgSlmB3RHabDww73uZJnjm9UBl-UtvTkBPwF9SrFbLMk8Ye13P-/s1600/blog_01_009.png"></a></div>
<br clear="all" />
Wrangle<br />
<pre class="prettyprint"><code class="language-c">if(@P.y > 0.75)
i@group_test = 1;</code></pre>
Vop<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFpj7_vavHxzfYg4D7Kpjd99H9PsUbryGx0qgaIe6jDsvU5R6qr_Lg4m-XkygC3S-cZC9qFiAGB_7QrN0tlHpiZrsIHDA3nHl4JU0C_cl3aHFwxPqGGlP95jGG3PX9lNIxGui35wmFjgOI/s1600/blog_01_010.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFpj7_vavHxzfYg4D7Kpjd99H9PsUbryGx0qgaIe6jDsvU5R6qr_Lg4m-XkygC3S-cZC9qFiAGB_7QrN0tlHpiZrsIHDA3nHl4JU0C_cl3aHFwxPqGGlP95jGG3PX9lNIxGui35wmFjgOI/s1600/blog_01_010.png"></a></div>
<br clear="all" />
<br />
・アトリビュートを作りたいときは<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI4_dKEyNv1rZg3wJp_-BbJUmI6iJ7SM1_7bmvXyz205Kjo-vNV5gxeumzTPzOtdth4Ff5aIhJaZxccX1spKy-VidhaAUU7J515o288DYPfNzS8LAWLzWPM5KaD_5XVxDh5SHAgxEpiQqE/s1600/blog_01_011.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI4_dKEyNv1rZg3wJp_-BbJUmI6iJ7SM1_7bmvXyz205Kjo-vNV5gxeumzTPzOtdth4Ff5aIhJaZxccX1spKy-VidhaAUU7J515o288DYPfNzS8LAWLzWPM5KaD_5XVxDh5SHAgxEpiQqE/s1600/blog_01_011.png"></a></div>
<br clear="all" />
Yの位置で値を作って、Yの最大値を1に最小値を0にマッピングします。<br />
<br />
Attribute Createにエクスプレッションをかくなら<br />
fit($TY,bbox(opinputpath(".",0),D_YMIN),bbox(opinputpath(".",0),D_YMAX),0,1) <br />
<br />
Wrangleなら<br />
<pre class="prettyprint"><code class="language-c">vector min_p;
vector max_p;
getbbox(0,min_p,max_p);
f@check = fit(@P.y, min_p.y, max_p.y, 0, 1);
addvariablename(0,"check","CHECK");</code></pre>
<br />
Vopなら<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8rLQI0jYTEKCRyTe24ac-6DXnFQ_POw72f1pV-8G_dHcJlGkfAL9lyC9MFktpeM9rJoxFToMfAkaAKyrkiD5jWe3tJ1EcN-RjPrAforUc8sRkSJPJk0FglUmS2j4KQSNJOz9w3MWE4TFG/s1600/blog_01_012.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8rLQI0jYTEKCRyTe24ac-6DXnFQ_POw72f1pV-8G_dHcJlGkfAL9lyC9MFktpeM9rJoxFToMfAkaAKyrkiD5jWe3tJ1EcN-RjPrAforUc8sRkSJPJk0FglUmS2j4KQSNJOz9w3MWE4TFG/s1600/blog_01_012.png" height="286" width="640"></a></div>
<br clear="all" />
<br />
Vopで組めるけど、Wrangleで書くときはどーすればいいか迷うことがあると思いますが、そんな時はVopで組んでからノードを右クリックしてView VEXを実行すれば、カンペを見ることができます。 <br />
<br />
仕事で使うときは、シーンファイルやセットアップを他の人に渡すことが多いので気をつけてることがあります。1つのWrangleノードに何十行もかいてしまうと、嫌がられること間違いないので、機能ごとにノードを分けるようにしています。(ただ、自分の場合Sop自体のノード数が多すぎて嫌がられることが多々ありますがw)<br />
<br />
Flipは何百万何千万ものPointを編集するので、WrangleとVopを多様する必要があります。一回、あなたが組んだ仕組みをPerformance Monitorでみてみましょう。どこが負荷をかけているかが分かります。そしてWrangleを使って速度の違いを体感してみてください。<br />
<br />
シーンファイルはこちらです。(Houdini14.0.201.13-gcc4.8 Fedora20) <br />
<a href="https://drive.google.com/file/d/0BxR_QF5anLH0TGNhWi03dDFKS0U/view?usp=sharing" target="_blank">https://drive.google.com/file/d/0BxR_QF5anLH0TGNhWi03dDFKS0U/view?usp=sharing </a>Shoheihttp://www.blogger.com/profile/06864912369096602504noreply@blogger.com2