Edited at

Houdiniでチキンラーメンを作る方法


メリークリスマス!

この記事は HoudiniApprenticeAdventCalendar2018 25日目の記事です。

クリスマスといえば、クリスマスチキンですよね。

image.png

NHKの朝ドラ「まんぷく」もチキンラーメンですし。

*見ていない方に説明すると、主人公たちに色々苦労があった後に世界初のインスタントラーメンであるチキンラーメンを発明するというお話です。

今回はチキンラーメンを久々に食べたらおいしかったので、じゃあHoudiniで作ってみようという試みです。


チキンラーメンの形状を考察する

チキンラーメンの形状ですが、3Dモデリングしたくもない、異形の構造をしています。

image.png

ポリゴン数どうするのか、形状を簡単にしてノーマルマップかディスプレイスメントで疑似的な形状を作るのか、、もしくは麺1本1本モデリング職人の温もりを感じる手作業で行うのか。

Googleで「chicken ramen obj」とか「instant chicken noodle fbx」で探してもなかなか見つかりません。札幌一番のようなモデルはありましたが、6$かかります。3Dモデル1つ買うと札幌一番が5回食べれます。(*そもそもチキンラーメンを作ろうとしているから札幌一番のモデルだと違いますよね)

https://www.turbosquid.com/3d-model/instant-noodles

image.png

じゃあどうするのか。

今回は、2つのアプローチから攻めたいと思います。


RealityCapture

1つ目が「RealityCapture」です。(注意:現時点で上手く動作しないので、この記事は問題が解決した後追記します!)5/28追記しました

Houdini16.5から高品質なフォトグラメトリソフトのRealityCaptureと連携できるようになりました。

ただ、Houdiniインストール直後そのままで使用できるわけではありません。RealityCaptureも別途購入する必要があります(←重要!)

一連のインストールからリンゴを作るまでのチュートリアルは以下のサイトにあります。

https://www.sidefx.com/tutorials/reality-capture-plugin-open-beta/

RealityCaptureの日本語での導入方法については、

インディゾーンHoudini情報日本語ブログ

にあります(この時は16.5の説明なので今と若干異なります)。同じような内容になりますが、購入手順を紹介します。


RealityCaptureの購入

Steamからも購入できますが、StreamのライセンスだとHoudiniとの連携で動作しないので注意してください。

image.png

9月に試したときはHoudiniから連携しようとした際にこの画面で止まって認証ができませんでした。(今は違うのかもしれませんが、試す勇気がないので検証は勘弁してください)

image.png

なので本家本元から正式ルートで購入する必要があります。

まずcapturingreality.comに行き、capturingreality社のアカウントを作る必要があります。

https://www.capturingreality.com/My

image.png

当然ですが、名前や住所は英語で入力してください。日本語から英語に変換してくれる便利なサイトもあります。

http://judress.tsukuenoue.com/

登録が完了したら、サインインします。

image.png

サインインすると、「You have no active license.」お前は何のライセンスも持ってないと言われます。

image.png

ライセンスはこの中から購入する必要があります。

https://www.capturingreality.com/Product#Buy

image.png

ショッピングカートに入れます。今回は最安の3カ月(99ユーロ:12,535 円*12月22日時点)を選択しています。

image.png

許諾画面

image.png

支払い画面1

image.png

ここでも住所を入力します。

支払い方法は4種類選べます

image.png

支払い画面2

image.png


インストール

プラグインが発表された16.5の当時は、専用のインストーラーが用意されており、

houdini_rc_plugin_16.5-0.6.exe

を実行させてインストールしていました。しかし、現在は Game Development Toolsetに内包されたので、 Game Development Toolsetの更新を行うことで同様の機能がインストールされます。

https://www.sidefx.com/tutorials/game-dev-toolset-installation/

まず、インストールしていない状態では「rc」と検索しても何も出ません。

image.png

シェルフからGame development toolsetを追加します。

image.png

追加するとスイッチらしきボタンが出ます。

image.png

押すとバージョンの選択を迫られます。

image.png

最新のpre-releaseを確認したい場合はgithubを確認してみてください。(恐ろしい更新頻度ですね、主に2人で回しているとは思えない)

https://github.com/sideeffects/GameDevelopmentToolset/releases

image.png

Updateボタンを押して成功するとSuccessコンソールが表示されます。再起動しろと言っています。

image.png

なぜ再起動するかというと、Houdini.envが書き換わったからです。


Houdini.env

# GAMES DEVELOPMENT TOOLSET 

HOUDINI_PATH = $APPDATA\SideFX\GameDevToolset\17.0\1.98;$HOUDINI_PATH
PATH = $APPDATA\SideFX\GameDevToolset\17.0\1.98\bin;$PATH

再起動するとrcで呼び出せていますね。

image.png

シェルフにももろもろ配置されていますが、有償のRCはシェルフには無いようです。

image.png

大成功、、、と思いきや、落とし穴もあります。

チュートリアルをよく読むと

https://www.sidefx.com/tutorials/reality-capture-plugin-open-beta/

RCから始まるノードの候補が2つしか出ていない場合はトラブルシューティングを見ろと言っています。

出ない理由は、プラグインファイルを含むHOUDINI_PATHとPATHの設定ができていないか、

DLL読み込みエラーの可能性があると言っています。

最も一般的な理由はHoudini自体とのバイナリの違いです。なので最新のデイリービルドを持っていることを確認してください。

Houdiniが最新でないからという可能性が一番大きそうです。

image.png

houdini-17.0.439を選択してダウンロードしました。

すると、、動作して、、、あれ?

もう一度GameDevelopmentToolsetの中を見るとdsoファイルが見当たりません。

これは、、どうなってるんだろう。わかりません。

*後日追記します

ここから先は問題が解決してから記載します。


5月28日追記

いろいろ忙しくて、後日追記しますと書いていましたが、、半年保留にしてしまいました。

1月4日にcommitされていますね。(Toolset:1.105 → Toolset:1.106のバージョンアップで修正されています)

image.png

やはり、dsoがなかったことが原因だったようです。

治ったかどうかは、githubのcommitから確認できます。

githubでイシューを出すと修正が早いと思います。


再インストール

Toolset:1.163でもう一度入れなおしてみます。すると5つのノードが入っています。

復活.PNG


RC_Register_Images(Beta)

まずは画像登録から行います。RC_Register_Images(Beta)を追加します。

sop_rc_register_images1ノードができるとエラーの状態になっています。

image.png

Add Imagesから画像を選択します。

選択した画像が登録されました。

60.PNG


RC_Alignimages(Beta)

rc_alignimages1ノードもまた、エラーの状態です。

image.png

まず、Get Licenseボタンを押します。

するとブラウザが立ち上がるので、登録したライセンスのアドレスとパスワードを入力します。

image.png

*自動で立ち上がるブラウザが好みでない場合はコンソールからコピペします

image.png

すると、アクティベーションの期限を指定しろ画面が出てきます。Periodは7日間がデフォルトになっています。

この期間はほかのコンピュータで、このライセンスは使えないことを認めろとですので、Yesを選択します。

image.png

Yesを選択するとAcitiveが押せるようになるのでActivateします。

image.png

Houdini画面を再確認するとエラーが消えています。

無事、ライセンスのアクティベーションができたようです。

image.png

次に、Align Imagesを行います

image.png

一瞬固まりますが、処理が完了するとHoudiniにポイントクラウドが現れます!(感動!)

image.png

しかし、周りにゴミがあるので、削除する必要があります。

image.png

ここでは、普通にpoint選択してdelete(blastSOP)を行い、

image.png

Delete Non Selectedで必要な分だけ残します。

image.png

最後にboxにつなげてBoundingBoxを作ります。


RC_Create Model

Align Imagesの結果を左に、BoundingBoxを右に入力します。

image.png

そしてCreateModel

image.png

Houdini上では何も起きていないように見えますが、処理が走っています。

HoudiniConsoleを眺めるしかないの気長に待ちましょう。

処理ごとにログは出るのですが、処理が本当に走っているのかどうか、プログレスバーがないので辛い時間です。

別のソフトに依頼をしているだけなので難しいのはわかりますが、あと何分で出来るのかわからないのは精神的につらいです。


RC_Texture_Model

なにはともあれ、出力されました。

しかし、まだ終わっていません。

まだ頂点カラーからテクスチャへの変換が残っています。

image.png

RC_Texture_ModelノードはCdから、テクスチャ(shop_materialpath)への変換を行ってくれます。

Texture Modelのボタンを押して数分待ちます。

image.png

そしてようやく完成です。

deki.PNG

写真とhipファイル

https://drive.google.com/open?id=1qbfMJk58uZkRfkHE7I1D9BLIDW_g28Sk


注意点

・僕のPCの問題かもしれませんが、CreateModelやTexture Modelの処理を行っても何も出力されないことがありました。

バックグラウンドでの処理がたまっているのか、止まっているのかわかりませんが、PCを再起動してもう一度作るとうまくいきました。

・キャッシュには注意してください。例えば同プロジェクトファイルで同じくRCの処理を行っている場合、例えばリンゴのキャプチャを行った場合、キャッシュが上書きされる可能性があります。例えばプロジェクトと同じ階層を見てもらえればわかる通り、rctest_textured.1001.png、rctest_textured.obj、rctest_textured.mtlというようにhip名+○○という命名がデフォルトになっています。

・たまに応答なしになることがあるので、こまめな保存を!

速度やUI的には、当たり前のことですが、本家のソフトを使った方が安定しており、素早く作ることができます。

今後もう少し安定したら、連続して自動で複数のフォトグラメトリを作ったりするフローが作れるかもしれません。


RealityCapture本体

時間がない場合は、RealityCapture本体を立ち上げてフォトグラメトリを作っていきます。

基本的な操作の流れは左から右に流れていく形となります。

image.png


1.Add imagery

まずInputsで素材(360度から撮った写真)を読み込み


2.Process

AlignImagesで写真から点群を出力するための計算を行います。

そしてCalculateModelsでポリゴン化、Textureでテクスチャをbakeさせます。


3.Export

一連の流れが終わったらMeshとして出力します。出力結果は1枚のテクスチャ画像とobjファイル、mtlファイルです。

本当はここの一連の流れがこの5つのノードで可能になります。

dailyOK.PNG


Houdiniに読み込み

Houdiniには普通にfileSOPでobjを読み込み、マテリアルに出力された画像を割り当てます。

地面が少しくっついてしまったので、Clipノードで切ってレンダリングします。

image.png


Detangle

2つ目が「Detangle」ですDetangleの意味は、もつれた[絡んだ]という意味です。

DetangleSOPはHoudini17でVellumのコリジョンパイプラインの一部として実装されました。

この機能は、ラインとサーフェスの衝突を検出してお互いに重ならないように避けてくれます。

Entagmaで紹介されていて知った方が多いのではないでしょうか。

https://vimeo.com/294388853


DetangleSOP概要

このSOPはすさまじい威力です。基本的な動作はrestSOPを置いて、detangleSOPのPreviousPositionにrestと入れるだけという超簡単さ。

image.png

image.png

▲右がDetangleを適用した状態(お互いが道を譲りあってます)

これでOK。すごい!

では、ある程度形状を保持した形でほつれを作るにはどうすればいいでしょうか。

例えば最初に大雑把に上の図のようなメッシュを先に作っておいて後からBooleanで切り取る方法などが考えられます。

しかし、今回はこの手法は使用できません。なぜならチキンラーメンの場合、インスタント麺が圧縮された結果あの形になっているからです。断面が表面に来るのではなく、ねじ曲がった形状が表面に来る必要があります。

image.png


Detangleチキンラーメン

これから作成するノードの全体像はこちら。hipファイルはこちら

image.png

まず、最終的な形状(ガイド)をCubeとmountainから作成します。卵のポケットはBooleanで作成します。

image.png

image.png

ガイドを1.5倍にしたらscatterで点群を作成して、addでつなぎます。ここでresampleをかけるとぐしゃぐしゃになった1本のラインが作成できます。

image.png

VOPでnoiseをかけて揺らぎを作ったらnoiseで崩れた形を元のガイドの形に戻します。

戻すために今回はrayのMinimumDistanceを利用します。注意点としてMinimumDistanceはサーフェス上にすべて

集まってしまうのでせっかく内部で絡まった状態がなくなり、サーフェスに吸着してしまいます。

image.png

そこで、Groupのバウンディングボックスでガイド外にあるポイントだけサーフェスに吸着させます。

これで準備完了です。

ここで登場するのがDetangleです。サーフェスに密集してライン同士が衝突している状況から麺がほつれたような状態に変えてくれます。

image.png

しかし、現時点では麺は1本しかありません。1本うどんならこれでいいのですが、今回はチキンラーメンのためどこかで麺を同じ長さで分割する必要があります。

今回は、Groupのrange機能を使って麺を分割していきます。

image.png

最後に、polysplineからポリゴンに変換します。polywireだと麺が丸くなってしまうので、麺の断面を作成してSweepを行います。sweepでカラー情報を移行させる場合は、一度point colorにpromoteする必要があります。

image.png

やりました!Detangleチキンラーメンこれで完成です。*本当はもっと美味しそうにマテリアルを追い込みたかったですが時間切れになりました…。

今回はチキンラーメンとして使いましたが、例えば同じ要領で対象に対してワイヤーを這わせることが簡単にできるので、ぜひDetangleを活用して遊んでみてください。

以上!