Houdiniのforループを理解する

■ループの種類と用途

  1. forループ
    入力したジオメトリデータ全体を対象に、複数回の処理を繰り返し行う

    (例)
    Copy SOPで複製されたジオメトリ全体を対象に、Mountain SOPの処理を累積的に10回行う。

  2. for-eachループ
    入力したジオメトリ内の個別のピースに対し、同一の処理を行う

    (例)
    複数のグループを複数含むジオメトリデータから、特定のルールにマッチするグループを1つずつ個別に取得し、個別にバウンディングボックスに置き換える。

  3. Fetch FeedbackとFetch Pieceの組み合わせ
    ループに入力されたジオメトリに対し、別の入力されたジオメトリのピースを使って反復的かつ累積的に処理を行う事ができる。

    (例)
    穴あきチーズ
    複数の気泡オブジェクトを入力し、気泡オブジェクトのピースごとに、チーズの本体に累積的に繰り返し削り取る。


■forループ

Tab -> For loop

オレンジ色に囲まれた部分がforループのブロック

MountainSOPを挿入しHeightを0.1に変更
Block EndのIterationパラメータを変化させると、各ボックスが累積的に変形することが確認できる。

※同じ設定のMountainSOPで同一の処理を累積的に10回繰り返すことと同じなので、CopySOPの下流にMountainSOPを10個作って直列で繋げても同じ結果が得られます。


■for-eachループ

Tab -> For-Each loop

ピース単位の処理。
ピースは、ピースを表現するアトリビュート(通例では@name)の値の同一性により表現される。

For-Each loopを作成した直後は、上流に@pieceや@nameがないためにエラーが出る場合がある。このような場合は、自分でアトリビュートを作成する。

Voronoi Fracture SOPなど、自動的に@nameを作るSOPもある。
Voronoi Fracture SOPのデフォルト設定では、破片ごとにPrimitiveクラスの@nameを作成し、piece+番号の命名規則で各Primitiveが所属するピースを表現する。

@name以外のアトリビュートを使用してピースを表現したい場合は、Block End SOPのPiece Attributeを変更し、任意のアトリビュート名を指定する。

CopySOPで複製したBoxをVoronoi Fracture SOPで分割

For-Each loopにより、各破片のピースをバウンディングボックスに置き換え


■Block Begin SOP

・Methodパラメータ

  1. Fetch Feedback
    累積的に処理を行う場合に選択。
    ループが行われる度、前回のループで出力された結果を現在の処理対象としてフィードバックし、再Fetchする。
  2. Fetch Piece
    入力されたジオメトリ内のピースごとに処理を行う場合に選択。
    ループ毎に、認識されているピースの中から新たなピースがFetchされる。
  3. Fetch Metadata
    現在のループに関する情報をDetailsアトリビュートに持つジオメトリを作成する。
    detail関数を使ってこれらの値へアクセスし、ループ内で使用することができる。

・Block Pathパラメータ

このループの終点を示すBlock End SOPへのパス

・Create Meta Import Node

Metaデータを持つBlock Begin SOPを作成する。
この実態は、ModeがFetch Metadataに設定され、Block Pathが現在のループの終点にセットされているBlock Begin SOP。


■Block End SOP

・Gather Method

  1. Fetch Each Iteration
    ループが終わるたびに結果を再Fetchする
    ループのBlock Begin SOPでMethodがFetch Feedbackの場合に使用する。
  2. Merge Each Iteration
    ループ毎にジオメトリを記録し、最後に結合する。
    ループのBlock Begin SOPでMethodがFetch Pieceの場合に使用する。
    ピースは個別に処理され最後に結合され、結果として出力される。

・Iterations/StartValue/Increment

ループ回数の指定
一般的なforループで使用する変数

・Python風に書くならこんな感じ
for i in range(startValue , iterations , increment):


■Block Begin SOP – Fetch Feedback と Fetch Pieceの組み合わせ

あるジオメトリに対し、別のジオメトリを使って複数回の処理を累積的に行う事ができる。
Block BeginのヘルプにあるSwiss Cheeseサンプルでは、チーズ本体のVDBオブジェクトを一つと、気泡のVDBオブジェクトを複数入力し、チーズ本体オブジェクトを気泡オブジェクトごとに削り取る処理を行う。

  1. チーズ本体のジオメトリを作成
  2. 気泡ジオメトリを作成
    SphereSOPをPolygonなどではなくPrimitiveモードで作成。
  3. Scatter SOP + Copy SOPでチーズ表面に気泡をばらまく
  4. For loopを作成
  5. チーズ本体を受け取るBlock Begin SOPの設定を確認
    Methodパラメータ:Fetch Feedback
    Block Pathパラメータ : Block Endへのパス
  6. 気泡を受け取るBlock Begin SOPを追加
    Block Begin SOPを作成後、以下のパラメータをセット。
    Methodパラメータ : Fetch Piece
    Block Pathパラメータ : 1で作ったBlock Endへのパスをセット
  7. Block End SOPを確認
    Iteration Method:By Pieces(またはAuto Detect from Inputs)
    Gather Method:Feedback Each Iteration
    Piece Elements:Primitive
    Piece Name:オフ
    Default Block Path/Piece Block Path:Block Begin

 


■Block Begin SOP – Fetch Metadataの使い方

  1. Block Begin SOPを作成
    Method:Fetch Metadata
    Block Path:末端のBlock End SOPへのパス

・Detailsアトリビュート

  • numiterations
    最大のループ回数
  • iteration
    現在のループ回数
  • value
    Pieceループ時、現在ループ中のピースを識別するためのアトリビュート値。
  • ivalue
    valueの整数版。
    valueがfloatの精度範囲を超える場合などに使う。
    特別な理由がなければ普段はこっちを使うのがよさそう

・Metadataを取得する

ループ内でdetailエクスプレッション関数を使う。

  1. detailエクスプレッション関数を使う
    detail(“../foreach_begin1_metadata”, “iteration”, 0)
  2. detail VEX関数を使う
  3. Import detail attribute VOPを使う
  4. Pythonで取得する
    node(“../foreach_begin1_metadata”).geometry().attribValue(“iteration”)

■ループの停止条件

Block End SOP の Stop Condition を1にセットすると強制的にループを終了できる。


■デバッグとテストループ

・Feedbackループの場合

Block End SOP の Max Iterationsパラメータで最大ループ数を設定できる。
数回のループだけである程度結果が判断できる場合は、このパラメータを有効化することでループ処理を制限し、素早く調整が行えるので便利。

・Pieceループの場合

Block End SOP の Single Passパラメータでピース番号を指定して、ピースごとの処理結果を確認できる。


■グループからピースを作成する

グループパラメータを使ってピースを作成したい場合は、Name SOPを使用して@nameを作成し、グループ名をセットしておく。


何か間違いがあれば突っ込んでいただけると嬉しいです

Houdini Crowd System – 002 / Transition + ragdoll テスト

先日から続けているHoudiniの群衆シミュレーション勉強。
今回は、状態遷移とラグドールの勉強。

正直、かなりどうかしている映像になってしまったけど、今日の勉強の成果としてアップ。

使用したエージェントの状態は、待機5種+歩行+ジャンプ+ラグドールによるシミュレーションと言った感じ。歩き出しがぎこちないのは、待機モーションと歩行モーションのポーズ差が大きすぎるからで、こういう場合は中間モーションを作ったほうが良さそう(特に回し蹴りモーションからの歩き出し)

群衆シミュレーションだと、手前のキャラは手付けで動かし、群衆は大写しになりにくい上に、もっとエージェントの密度が高い場合が多いと思うので、もう少しだけエージェントの状態遷移がスムースになればかなり見られる絵が作れると思ったりする。

Houdini 15.5 から搭載された Agent Terrain Adaptation も試してみたい。

Houdini Crowd System – 001

最近Houdini のCrowd Systemを勉強し始めた。

bandicam 2016-05-15 23-44-25-734

手頃なテストデータがなかったので、今回はUnityちゃんのfbxデータをUnity経由で引っこ抜いて使用してみる。
今日はとりあえず、モーションを読み込むところで終了。

群衆と関係なく、Fetch CHOPでFBXモーションを適用する方法がわかった。

Fetch CHOPで

1 モーションデータの取得先と取得チャンネルを指定。

bandicam 2016-05-15 23-49-57-755

2 モーションデータの適用先を指定。

bandicam 2016-05-15 23-50-01-954

3 これでFetchを有効化

これで、指定したモーションfbxがまとめられたsubnet内のモーションが再生される。

MYAM_QuickSelector 途中経過

今年の1月末くらいに作り始めたのはいいものの、公私ともに忙しく、なかなか手がつけられなかったツール「MYAM_QuickSelector」が、このGWでだいぶ形になってきたので、途中経過を駆け足で記事にしてみます。

Qtは目的に到達するまでの手続きが多く面倒な部分も多いですが、慣れるて来るととても楽しいです。もうMaya標準のGUIライブラリは触れません。


■画面サンプル

bandicam 2016-05-08 22-32-34-391

好きな画像をツール上からキャプチャし、背景に置いた状態で好きなノードに対応するボタンを配置し、いつでも簡単に選択できるようになります。
選択できるアイテムはいわゆるDAGオブジェクトだけでなく、マテリアルなどのDGノードにも対応します。


■マルチプラットフォーム(DCCツール間)

bandicam 2016-05-08 23-10-05-047

Maya上でもHoudini上でも全く同様に動作します。(現在はMayaのみ対応ですが)
その他にも、最小限の拡張でPySideが使えるすべてのDCCツールに対応可能です。
DCCツールを変えた時にも、操作法が統一されていると覚え直す必要もなく楽です。


■キャプチャ機能

bandicam 2016-05-08 23-13-10-644

Bandicamのようにウインドウを使ってキャプチャ範囲を指定して、背景画像として取り込むことができます。


■セレクターボタンは任意の画像が使えます

bandicam 2016-05-08 23-12-43-450

ジョイントやコントロールリグなど、タイプごとに任意の画像をアイコンとして設定できます。
また、各アイコンのサイズも自由に変更できるため、よく使うコントローラを目立たせておくなど、視認性を高められます。
アイコン置き場フォルダに任意の画像を格納しておけば、自動的にツール内で使用できるようになります。


■その他

その他にも、配置したボタンの整列なども手軽に行なえます。


もう少し洗練して、早くリリースしたいなあ。

MYAM_genericSelector(仮名)を作り始めました

昔とある仕事場で作成した MYAM_quickSelector2 の後継ツールをQtで作り始めました。

前述のツールの機能に加え、足したい機能は大体以下の様な感じです

・オブジェクトアイコンに任意の画像が使用できる
・オブジェクトアイコンのサイズや形状を自由に変更できる
・Maya/MotionBuilder/Houdiniあたりで共通して使えるようにする
・選択オブジェクトのグループ登録/簡単選択

まだほとんど仮組みの状態ですが、完成したらCreative Crashあたりで公開すると思います。

MYAM_genericSelector_SS001

Ricoh THETA S でIBL画像を作成するためのスクリプトを書きました

簡易的なIBL用のHDRIを作成するため、素材になる天球マップ画像をRicoh THETA SをiPhoneで遠隔操作して手軽にオートブラケット撮影できるようにしてみました。

撮影方法は、ISOを固定しEVを変化させて行う露出ブラケット撮影になります。
今の所、使用する撮影モードではシャッタースピードを同時に操作できなそうなので、自動設定にしてあります。

THETA SはRAWデータでの撮影ができず、また撮影時に厳密なホワイトバランス設定などもできないので精度は落ちますが、簡易的に使用するにはそこそこ使えるHDRIが得られると思います。

iOSデバイスに限らず、THETA Sとネットワーク接続できるデバイスで、なおかつ標準的なPythonを実行できるなら同じように使用できるはずです。

というわけで、需要がありそうなのでソースコードを公開します。

時間の関係で良い作例の用意ができていませんが、そのうち貼りたいと思います。

・使い方

1:デバイスとTHETA Sをネットワーク接続接続します

2:下記スクリプトをデバイス内のPython実行環境で実行します
当方は、iPhone6S+上で iOS用のPython 2.7 というアプリを使用しています。

3:撮影されたJPEG画像をHDR ShopLuminance HDRなどを使ってHDRIにします

・設定

設定の変更を行うにはコードを直接書き換える必要があります。
撮影枚数は、ThetaSettingsの evs で指定されているEV値の数で指定されます。
撮影ごとにリスト内のEV値がそれぞれ使用されます。

・EV値と撮影枚数の設定

指定できるEV値は、上記の Full で指定されている13個の値になります。
THETA Sは一枚撮影するごとに内部処理に約8秒ほどかかるようなので、撮影枚数が多くなると時間がかかります。
必要に応じ、不要な値を削除するなどして調整してください。

・各種オプションの設定

現在は、上記を指定できます。
必要に応じ、RICOH THETA API v2 Referenceを参照して値を設定してください。
といいつつおそらく上記の中では iso と _shutterVolume くらいしかいじらないと思います。

・_shutterVolume
0−100の間で指定します。0が無音です。

・iso
以下の値が使えます
100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600

ExpoDisc 2.0 でお手軽ホワイトバランス生活

 ・マニュアルホワイトバランスの重要性

写真を正しい色味で仕上げるためにはRAWデータでの撮影とホワイトバランス(WB)調整が不可欠です。

誤ったWB設定のまま、何十枚、何百枚と撮影された画像を、一枚ずつ調整するのは非常に手間がかかるため、できるだけ撮影の時点で正しいWB設定を使用しておきたいものです。

また、RAWではなくJPGで撮影する場合は、後処理で厳密なWB調整ができないため、なおのこと撮影時点で正確なWB設定を行うことが重要です。

仕上げの味付けのため、RAW現像処理でWBを大幅に変えることがありますが、この時、基準となる正しいWB設定が分かっていると、調整のやり直しや、ニュートラルな色味を中心に効果的な調整がしやすくなります。

このように正しいWBで撮影することには多くのメリットがあり、時間の節約にもなるのでとても重要です。


 

・オートホワイトバランス(AWB)の罠

オートホワイトバランスモード(AWB)は、おおよそ正しい色が再現されるようにカメラがWBを自動設定しますが、ほとんどの場合カメラ性能の限界なども手伝い正確な色の再現には至りません。(後半の作例を参照)


 

・WBの設定方法 – ホワイトバランスカードを使う場合

正しいWBで撮影したい場合、一般的には市販のカラーチャートに付属しているホワイトバランスカードやグレースケールカードを使用して設定を行い、マニュアルホワイトバランスモード(MWB)を使用して撮影を行います。

MWBでは、周囲の色味を測るためのMWB画像を撮影し、正確なホワイトバランスを判断するために使用します。

この方法では、被写体の近くにカードを配置して撮影し、MWB画像として使用する必要があるため、被写体のある場所に踏み入れられない場合は使用できません。

※ホワイトバランスカードを使う場合の設定方法(Canon公式サイトより)
http://cweb.canon.jp/camera/cms/c4_1.html


 

・WBの設定方法 ー ExpoDiscを使用する場合

ExposDiscを使用する場合は、MWB画像の作り方が違います。
ここでは、Canon EOS M3での設定方法を例に解説したいと思います。

1・カメラをマニュアルホワイトバランスモード(MWB)に設定する

IMG_0288

MWBモードでは、周囲の光の色味を測定するための画像データ(MWB画像)を解析し、正しいホワイトバランスの計算に使用します。

2・MWB画像を撮影する

フォーカスモードをマニュアルフォーカスモード(MF)にします。
ちなみにMFにするのは、ピントが合っていない状態でシャッターを切るためです。
ExpoDiscをレンズに密着させ、カメラを光源に向けシャッターを切ります。

スタジオ撮影のように被写体が小さく光源が明確な場合は、カメラを被写体の位置から光源方向へ向けることで、より正確なMWB画像が撮影できます。

被写体の色が強く、被写体の表面から跳ね返る光に不要な色が乗ってしまう場合は、純粋な環境光を取り込む事ができず、WBが狂います。
このような場合、光源に向けてシャッターを切るのがいいと思います。

風景写真などの場合は空全体が光源と考えて差し支えないので、純粋に撮りたい方向へカメラを向けてMWB画像を撮影することができます。

シャッタースピードや絞りが極端な値の場合、MWB画像の明るさも極端なものになり、正しいMWB画像として使用できません。撮影時のEVレベルが0になる状態で撮影するのが望ましいです。

IMG_0287

※実際にExpoDiscを使用している様子を自分一人で撮影するのは難しかったので、上の画像は機材一式をテーブルの上に置いた状態で撮影しています。実際は、両手でカメラとExpoDiscをそれぞれ持ってMWB画像を撮影します。

IMG_1972_REF

このように、MWB画像はほぼ単色の画像になります。

3・MWB画像を指定します

設定メニューから「MWB画像選択」を選び、先程撮影した画像を選択します。

IMG_0290

これで、WB設定が完了します。

4・撮影します

あとは撮るだけ。
時間が経過して日差しが変わったり、撮影場所を移動することで光源が変わった場合は、再び同じ手順でWBを調整します。


 

・作例 ー 環境光が暖色の例

AWBでの撮影

IMG_1971_AWB

環境光が暖色の状態で撮影。
環境光の影響で画面全体が若干赤みがかっている事がわかります。

MWB画像

IMG_1972_REF

調整後

IMG_1977_MWB

赤みが取り除かれる事で白がより白くなり、画面全体が自然な色合いになりました。


 

・作例 – 環境光が寒色の例

AWBで撮影

IMG_1982_AWB

環境光が寒色の状態で撮影。
環境光の影響で画面全体が青みがかっている事がわかります。

MWB画像

IMG_1983_REF

調整後

IMG_1985_MWB

画面全体から青みが取り除かれ、自然な色合いになりました。
若干赤みが強くなってしまった感はありますが、色味がAWBに比べ遥かに改善しており、十分に許容範囲と思います。


 

作例を見ても分かる通り、多少のブレはあるものの、ExpoDiscを使用することで、かなり手軽に、おおよそ許容範囲のWBを設定できます。

手頃な価格で現像の手間がかなり軽減できるこの製品、WB設定でお悩みの方は導入してみてはいかがでしょうか。

Fabric Engine 2 プラグインをMayaへ導入する

ふと気が付くとFabric Engine 2.0 がリリースされていたので、導入方法をメモしておきます。
やり方はほとんどバージョン1.15.3と変わらず。ライセンス入力あたりだけが大きく違います。

説明が急ぎ足なので、後で加筆修正するかも。


■Fabric Engine サイト

http://fabricengine.com/


■ダウンロードリンク

以前のようにEvaluation Lisenceのダウンロードリンクはありません。
ライセンスは後から取得し入力します。

FabricEngine-2.0.0-Windows-x86_64.zip
約500MB程度。ダウンロードを待ち、完了させます。


■解凍とコピー

ダウンロードが完了したら、zipファイルを解凍します。
解凍してできたフォルダ「FabricEngine-2.0.0-Windows-x86_64」は、C:\Program Filesの直下に置きました。


■ライセンスの取得

再びダウンロードページに戻り、ページ下部にある評価ライセンス請求フォームへ記入し、送信します。


送信が完了すると、ライセンスコードが表示されます。

このライセンスコードを保存しておき、あとでFabric Engineのライセンス登録フォームに記入します。


■Maya.envの編集

・以下を追加
MAYA_MODULE_PATH=C:\Program Files\FabricEngine-2.0.0-Windows-x86_64\DCCIntegrations\FabricMaya2014;


■Maya起動とプラグインのロード

ロードが完了すると、メニューに「Fabric」が追加されます。


■ライセンスの入力

ちょっと曖昧ですが、初回のプラグインロード時か初回のグラフ作成時にライセンス入力を求められるので、以前の手順で入手していたライセンスコードをコピーペーストして認証を完了させます。


 

■グラフを作ってみる

Fabricメニュ- → Create Graph

今バージョンから、メインで使用するノードタイプがcanvasNodeに変更されたようです。

Open Canvas ボタンを押します。

その他のノードベースツールで定番の操作、TABキーを押し、ノード名の一部を入力することでインテリセンスを使用して任意のノードを簡単に作成できます。

また、左右端のスライドバーをドラッグすると、ノード一覧が表示されます。
サブカテゴリを開き、キャンバス内にドラッグしてノードを追加できます。

ポートの追加は、左右の入出力ポードリストを右クリックし、Create Portを選択して行えます。

過去に作成したツールのご紹介

リンク

テクニカルアーティストを自称しているのに、あまりにも普段からツールネタが少ないのはどうかと思っていたところ、許可がいただけたので、自分がこれまで作ってきたツールの一部を載せてみたいと思います。

ご興味のある方はどうぞご覧ください。