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

#メリークリスマス！
この記事は　[HoudiniApprenticeAdventCalendar2018](https://qiita.com/advent-calendar/2018/happrentice)　２５日目の記事です。

クリスマスといえば、クリスマスチキンですよね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/58bb46c8-7e10-485e-4400-df7b0edd739f.png)
NHKの朝ドラ「まんぷく」もチキンラーメンですし。
＊見ていない方に説明すると、主人公たちに色々苦労があった後に世界初のインスタントラーメンであるチキンラーメンを発明するというお話です。

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

#チキンラーメンの形状を考察する
チキンラーメンの形状ですが、３Dモデリングしたくもない、異形の構造をしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/edb07ff7-be52-9357-88b8-a84f57065b6e.png)
ポリゴン数どうするのか、形状を簡単にしてノーマルマップかディスプレイスメントで疑似的な形状を作るのか、、もしくは麺1本1本モデリング職人の温もりを感じる手作業で行うのか。
Googleで「chicken　ramen　obj」とか「instant chicken noodle fbx」で探してもなかなか見つかりません。札幌一番のようなモデルはありましたが、6$かかります。3Dモデル１つ買うと札幌一番が５回食べれます。(＊そもそもチキンラーメンを作ろうとしているから札幌一番のモデルだと違いますよね)
https://www.turbosquid.com/3d-model/instant-noodles
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/c3e09c03-4601-faa7-7fb7-243266a844cc.png)


じゃあどうするのか。
今回は、２つのアプローチから攻めたいと思います。

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

Houdini16.5から高品質なフォトグラメトリソフトのRealityCaptureと連携できるようになりました。
ただ、Houdiniインストール直後そのままで使用できるわけではありません。RealityCaptureも別途購入する必要があります（←重要！）
一連のインストールからリンゴを作るまでのチュートリアルは以下のサイトにあります。

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

RealityCaptureの日本語での導入方法については、
[インディゾーンHoudini情報日本語ブログ](http://houdini.indyzone.jp/blog/reality-capture-plugin-%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%99%E3%83%BC%E3%82%BF/)
にあります(この時は16.5の説明なので今と若干異なります)。同じような内容になりますが、購入手順を紹介します。

##RealityCaptureの購入
Steamからも購入できますが、StreamのライセンスだとHoudiniとの連携で動作しないので注意してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/1082097f-7ce3-96f3-fe0f-fc4cff579ffa.png)
9月に試したときはHoudiniから連携しようとした際にこの画面で止まって認証ができませんでした。（今は違うのかもしれませんが、試す勇気がないので検証は勘弁してください）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/268b433d-bc5a-5ec3-bb30-20b9fd1061c0.png)


なので本家本元から正式ルートで購入する必要があります。
まずcapturingreality.comに行き、capturingreality社のアカウントを作る必要があります。
https://www.capturingreality.com/My

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/4d5d245f-24ef-8e9a-da97-67ad55dde0d5.png)
当然ですが、名前や住所は英語で入力してください。日本語から英語に変換してくれる便利なサイトもあります。
http://judress.tsukuenoue.com/

登録が完了したら、サインインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/c9c38742-1505-e5d8-c4ca-370dea9d056c.png)

サインインすると、「You have no active license.」お前は何のライセンスも持ってないと言われます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/04bc1524-bf1f-b16f-6c4c-13330f58ad3d.png)

ライセンスはこの中から購入する必要があります。
https://www.capturingreality.com/Product#Buy
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/feefd4bc-cbe8-383e-37c9-f36f9f0ce556.png)

ショッピングカートに入れます。今回は最安の3カ月(99ユーロ：12,535 円＊12月22日時点)を選択しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/64e7bedb-1732-7988-6fc6-edd2da180169.png)

許諾画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/ec5606ec-a7de-bd34-dac5-27d413124503.png)

支払い画面１
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/7183c3b5-9c72-6bd8-e7fd-57e74815b105.png)
ここでも住所を入力します。

支払い方法は4種類選べます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/53aa2e18-d78d-23f6-1f06-4b6c89578e15.png)


支払い画面２
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/e22ccced-f1ac-99d8-f70c-ae40d9de05d3.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](https://qiita-image-store.s3.amazonaws.com/0/151589/1e7e7f18-c5bb-17b1-3625-9838a8378ad6.png)
シェルフからGame development toolsetを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/e2badea1-0a0f-9ece-3388-3e1a645ac57e.png)

追加するとスイッチらしきボタンが出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/62e0ae03-c9a7-3958-dee3-eef37684fdd3.png)
押すとバージョンの選択を迫られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/1875c4b1-aa6e-6ecd-729f-00b424cfef39.png)
最新のpre-releaseを確認したい場合はgithubを確認してみてください。（恐ろしい更新頻度ですね、主に２人で回しているとは思えない）
https://github.com/sideeffects/GameDevelopmentToolset/releases
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/8bbdd954-6a28-6749-1fae-6db1021c7220.png)

Updateボタンを押して成功するとSuccessコンソールが表示されます。再起動しろと言っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/a824ef02-62ad-656a-7155-c63a164228c1.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](https://qiita-image-store.s3.amazonaws.com/0/151589/8ecd4f90-387f-305f-0075-bd0cceaa3fc4.png)
シェルフにももろもろ配置されていますが、有償のRCはシェルフには無いようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/dc914b83-43d8-187e-2037-6734eb227f6f.png)
大成功、、、と思いきや、落とし穴もあります。
チュートリアルをよく読むと
https://www.sidefx.com/tutorials/reality-capture-plugin-open-beta/
RCから始まるノードの候補が２つしか出ていない場合はトラブルシューティングを見ろと言っています。

出ない理由は、プラグインファイルを含むHOUDINI_PATHとPATHの設定ができていないか、
DLL読み込みエラーの可能性があると言っています。
最も一般的な理由はHoudini自体とのバイナリの違いです。なので最新のデイリービルドを持っていることを確認してください。

Houdiniが最新でないからという可能性が一番大きそうです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/7a1f2500-f43a-4f2c-191c-cd8aa3047ab7.png)

houdini-17.0.439を選択してダウンロードしました。
すると、、動作して、、、あれ？
もう一度GameDevelopmentToolsetの中を見るとdsoファイルが見当たりません。
これは、、どうなってるんだろう。わかりません。

~~＊後日追記します
ここから先は問題が解決してから記載します。~~

#5月28日追記
いろいろ忙しくて、後日追記しますと書いていましたが、、半年保留にしてしまいました。
1月4日にcommitされていますね。（Toolset：1.105　→　Toolset：1.106のバージョンアップで修正されています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a47af269-f89d-0a5d-9c9e-106bbbc323bc.png)
やはり、dsoがなかったことが原因だったようです。

治ったかどうかは、githubのcommitから確認できます。
githubでイシューを出すと修正が早いと思います。

##再インストール
Toolset：1.163でもう一度入れなおしてみます。すると５つのノードが入っています。
![復活.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2a47c3fb-31d9-9515-54e1-a43e605a9dba.png)

## RC_Register_Images(Beta)
まずは画像登録から行います。RC_Register_Images(Beta)を追加します。
sop_rc_register_images1ノードができるとエラーの状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/bcd457d1-71ff-78f7-9bba-849848050424.png)

Add Imagesから画像を選択します。
選択した画像が登録されました。
![60.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b0214737-4941-1fb0-7795-7ebb0c68f324.png)

## RC_Alignimages(Beta)
rc_alignimages1ノードもまた、エラーの状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cd892a9d-791f-13bf-3f9c-8e90379032b2.png)
まず、Get Licenseボタンを押します。
するとブラウザが立ち上がるので、登録したライセンスのアドレスとパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4005e790-80cf-9874-395d-dd778f01f07a.png)

*自動で立ち上がるブラウザが好みでない場合はコンソールからコピペします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a529bca5-f257-c40e-4b25-b4dd18249a44.png)


すると、アクティベーションの期限を指定しろ画面が出てきます。Periodは7日間がデフォルトになっています。
この期間はほかのコンピュータで、このライセンスは使えないことを認めろとですので、Yesを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/50cef825-7b13-c987-4572-e9561a97aa6e.png)
Yesを選択するとAcitiveが押せるようになるのでActivateします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/eeecc094-ba4a-d284-c6a5-fedb13a233d1.png)

Houdini画面を再確認するとエラーが消えています。
無事、ライセンスのアクティベーションができたようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/efc7f77b-fc1e-dde2-827e-5ec9597b8508.png)

次に、Align Imagesを行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/23ad880b-6825-2095-73be-f5fd895c48bc.png)
一瞬固まりますが、処理が完了するとHoudiniにポイントクラウドが現れます！（感動！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ebcf14cd-c3c6-314d-d401-bb9e050970cb.png)
しかし、周りにゴミがあるので、削除する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6fd3a54b-1a82-a18b-275e-193c0a651bac.png)

ここでは、普通にpoint選択してdelete（blastSOP）を行い、 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8b691354-247d-5229-e66d-65977841351b.png)

Delete Non Selectedで必要な分だけ残します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0f55eceb-05fe-36ab-a4e2-3030e3175279.png)
最後にboxにつなげてBoundingBoxを作ります。

## RC_Create Model
Align Imagesの結果を左に、BoundingBoxを右に入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/60088e04-46ab-3c77-9181-afe85431615a.png)
そしてCreateModel
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e7fbf589-37c9-39dd-9080-e791d1f5817f.png)
Houdini上では何も起きていないように見えますが、処理が走っています。
HoudiniConsoleを眺めるしかないの気長に待ちましょう。
処理ごとにログは出るのですが、処理が本当に走っているのかどうか、プログレスバーがないので辛い時間です。
別のソフトに依頼をしているだけなので難しいのはわかりますが、あと何分で出来るのかわからないのは精神的につらいです。

## RC_Texture_Model
なにはともあれ、出力されました。
しかし、まだ終わっていません。
まだ頂点カラーからテクスチャへの変換が残っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b2aceb44-17da-48c0-1b42-f1662fbcd4c2.png)

RC_Texture_ModelノードはCdから、テクスチャ(shop_materialpath)への変換を行ってくれます。
Texture Modelのボタンを押して数分待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/89f63971-3b6e-870e-cf16-6bb9f7952d42.png)

そしてようやく完成です。
![deki.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5ba56389-6d1b-5395-2a90-c04dcf74fea7.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](https://qiita-image-store.s3.amazonaws.com/0/151589/8c9e7586-f997-7b9a-24bd-e5d85dab5a16.png)

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

###2.Process
AlignImagesで写真から点群を出力するための計算を行います。
そしてCalculateModelsでポリゴン化、Textureでテクスチャをbakeさせます。

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

本当はここの一連の流れがこの５つのノードで可能になります。
![dailyOK.PNG](https://qiita-image-store.s3.amazonaws.com/0/151589/76baeda8-f816-a930-18d3-8e9f4484caea.png)


###Houdiniに読み込み
Houdiniには普通にfileSOPでobjを読み込み、マテリアルに出力された画像を割り当てます。
地面が少しくっついてしまったので、Clipノードで切ってレンダリングします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/8c85a87f-f853-c228-81f9-d69ff989b522.png)


#Detangle
２つ目が「Detangle」ですDetangleの意味は、もつれた［絡んだ］という意味です。
DetangleSOPはHoudini17でVellumのコリジョンパイプラインの一部として実装されました。
この機能は、ラインとサーフェスの衝突を検出してお互いに重ならないように避けてくれます。
Entagmaで紹介されていて知った方が多いのではないでしょうか。
https://vimeo.com/294388853
##DetangleSOP概要
このSOPはすさまじい威力です。基本的な動作はrestSOPを置いて、detangleSOPのPreviousPositionにrestと入れるだけという超簡単さ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/01259730-3601-fdca-124b-f47d363255fa.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/b7052801-6999-e656-5613-9463b0cc4a36.png)
▲右がDetangleを適用した状態(お互いが道を譲りあってます)

これでOK。すごい！

では、ある程度形状を保持した形でほつれを作るにはどうすればいいでしょうか。
例えば最初に大雑把に上の図のようなメッシュを先に作っておいて後からBooleanで切り取る方法などが考えられます。

しかし、今回はこの手法は使用できません。なぜならチキンラーメンの場合、インスタント麺が圧縮された結果あの形になっているからです。断面が表面に来るのではなく、ねじ曲がった形状が表面に来る必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/2e00fc2c-ece1-397e-0630-c7dc0b574820.png)

##Detangleチキンラーメン
これから作成するノードの全体像はこちら。hipファイルは[こちら](https://drive.google.com/open?id=1D4dW5nCFpeX43gWUExwwWYcrrfrmONss)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/70c4f140-f470-958b-2d61-22c8b000e9b5.png)

まず、最終的な形状(ガイド)をCubeとmountainから作成します。卵のポケットはBooleanで作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/fd3249c6-cea8-1f32-9844-c61787d144d2.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/138af3a4-7171-e3dc-02ee-88b03a12e9cf.png)


ガイドを1.5倍にしたらscatterで点群を作成して、addでつなぎます。ここでresampleをかけるとぐしゃぐしゃになった1本のラインが作成できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/d79abbe6-0f87-28d6-2e52-1dedca560c5a.png)


VOPでnoiseをかけて揺らぎを作ったらnoiseで崩れた形を元のガイドの形に戻します。
戻すために今回はrayのMinimumDistanceを利用します。注意点としてMinimumDistanceはサーフェス上にすべて
集まってしまうのでせっかく内部で絡まった状態がなくなり、サーフェスに吸着してしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/245723ec-3465-ee21-a3d8-f8262f6aa1ce.png)
そこで、Groupのバウンディングボックスでガイド外にあるポイントだけサーフェスに吸着させます。
これで準備完了です。
ここで登場するのがDetangleです。サーフェスに密集してライン同士が衝突している状況から麺がほつれたような状態に変えてくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/958c618b-60fe-a930-fe63-5ccc8af08298.png)

しかし、現時点では麺は1本しかありません。1本うどんならこれでいいのですが、今回はチキンラーメンのためどこかで麺を同じ長さで分割する必要があります。
今回は、Groupのrange機能を使って麺を分割していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/9e64cbb4-9c86-19a4-0957-ff3fcf9f1aad.png)


最後に、polysplineからポリゴンに変換します。polywireだと麺が丸くなってしまうので、麺の断面を作成してSweepを行います。sweepでカラー情報を移行させる場合は、一度point colorにpromoteする必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151589/8d8c5cf7-ff32-ce62-0866-d332373a0456.png)


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

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

以上！