この記事はHoudini Advent Calendar 2016の三日目の記事です。
この記事では
・Trace SOP
・Group SOP
・Find Shortest Path SOP
を利用します。
#目的:迷路の答えを導こう
今回の記事の目的は迷路の画像を与えると迷路を脱出できるネットワークの作成です。
Find Shortest Pathを利用すると恐ろしく簡単に目的の機能を実現することができます。
##画像を取り込むtraceSOP
画像は「迷路 フリー」と検索して出てきた迷路画像を利用します。(http://から画像参照も可能)
##課題1
・ポリゴンが通路でなく壁として出力されている。
(違う画像であれば結果は逆になっているかもしれません)
##traceSOPの注意点
###注意点1
よく勘違いしてしまうのが、黒の部分が残り白い部分が消えるのならば、色を反転させればいいのではないか。
という考えです。しかし色を反転させてもtraceSOPでの出力結果は変わりません。
traceSOPでは、画像のピクセル中に存在する色の差分を探します。(差分の閾値はパラメータで制御できます)
例えば黒一色の画像や白一色の画像を読み込んでも、色の差分がないので何も出力されません。
###注意点2
traceSOPに入れる画像サイズが小さすぎる場合は、解像度が足りず、うまくトレースすることができません。逆に大きすぎる画像も計算時間が長くなってしまいます。これらの事象を避けるため、事前に読み込む画像を前処理しておくか、COPのfileで一度画像を読み込んだ後scaleを利用して画像のリサイズ→読み出しが良いでしょう。(といいつつもCOPで座標をちょっとずつ移動させるなら元画像を弄ったほうが早いかもしれません。)
###注意点3
traceSOPで抜き取る際、FiltersタブのHoleFacesのチェックを入れると穴が適切に塞がります。(しかし独立するprimitiveが多いほど計算処理は重くなります)
その他ポイント数が多すぎる場合はResample Shapesにチェックを入れてStetp Sizeを上げます。
##課題1の解決策
今回利用したのは通常の色を扱うcolorノード、2つのインプットから画像を重ねるoverノード、白を抜いて透明にするためのlumakeyノード、画像の大きさを調整するためのscaleノードです。
COPで必要な迷路のエリアのみを残して壁と同色の黒い枠を重ねます。
枠の大きさは画像によって異なると思われるため、HDAにする場合はOverのScaleパラメータを外に出しておくと調整がしやすいでしょう。
▼COP内
#Group SOPでスタートとゴールを設定
##課題2
Find Shortest Pathにはスタート地点とゴール地点のポイントgroupが必要です。ですので2つgroupを用意する必要があります。
###課題2の解決策
groupでindex値をそのまま入力してもいいのですが、今回はgroupSOPの2番目の入力を利用してスタート地点とゴール地点にオブジェクト(sphere)を置いて、そのオブジェクトのバウンディングオブジェクト内に含まれるポイントをgroupに設定します。
(point only)と書かれている通りポイントgroupでしか設定できません。ただし、EditタブのConvetからpoint→primitiveを行うことでprimitiveを間接的に選択することもできます。
ちなみに、これを何度か繰り返すとgroupのグローを行う事が出来ます。
#Find Shortest Path SOPを使おう
これで準備は整いました。これでスタートとゴールを示すgroupを指定を行うと
瞬時に迷路を脱出する事が出来ます。
Find Shortest Pathは必ずポリゴンがスタートとゴールで繋がっている必要があります。
この段階でpolylineなのでそのあとは何でもできそうです。NURBSに変換したり、carveを利用してアニメーションを行ったり。
これであとはHDAとして作れば、OK
ただ、スタート地点とゴール地点は事前に防がないと、迷路の外周を回ってチートされるので気をつけましょう。
▼本当は道の真ん中を通るようにしたかったのですが、1日ではできませんでした。
HoudiniではFind Shortest Path SOPのように便利なノードが多いのは嬉しいのですが、
あまりに多すぎて、何かのきっかけで知らないと一生知らないノードなどがあるのが恐ろしいところですね。
以上