Solaris,USD,instancerを使った作例(.hip)

この記事はHoudini Advent Calendar 2020 13日目の記事です。

2018年のアドカレから12/13に投稿し、気づけば3回目になりました。
毎回コードはほとんど出てこないポエムです。

今回はHoudini18から登場したSolarisとUSDを使った背景シーン作成について試してみました。
USDの価値は構造にあると知りつつ、見た目よりの話です。

![スクリーンショット 2020-12-13 125318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/4966b934-f1e1-5aae-f48b-6c6d10143172.jpeg)


##想定読者
Houdiniを使う次のような人にちょうどいいかなと思います。

- 「Solarisが気になるけど役に立つのかわからん」
- 「何か試したいけどUSDよくわからん」
- 「公式チュートリアルも面倒そう」
- 「簡単に試せる.hipないのか」

作例.hipは記事の最後にあります。
こんなことができるのね、と感じてもらえると嬉しいです。

##この記事で使っている内容
1. LOPでのオブジェクト読込み（作成）
- Variantの作成
- Instancerによる配置
- Referenceによる合成

![スクリーンショット 2020-12-13 151220.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/e71e5285-a1eb-b80f-1c68-61c02673f7dd.jpeg)


画像のようなシーンを作成します。
解説で足りない部分は、.hipファイルを参考にしてもらえたら。

※Redshiftを使っていますが、ベータ版でありドキュメントにもあまり情報がないので解説していません。
　KarmaもUSDとSolarisに関する基本的な部分は同様だと思います。

####参考にした情報

- [SOLARISでUSDファイルを開く(fereria.github.io)](https://fereria.github.io/reincarnation_tech/10_Houdini/11_SOLARIS/01_solaris_open_usd/)
- [SideFX公式 SOLARIS](https://www.sidefx.com/ja/products/houdini/solaris/)
- [Pixar公式 Introduction to USD](https://graphics.pixar.com/usd/docs/index.html) 
- [CGwiki](https://www.tokeru.com/cgwiki/index.php?title=HoudiniLops#Variants)

チュートリアルを一通りするとUSDとSolarisの雰囲気がわかりますが、階層や読み込みの強さなど多くの要素があり、使うために必要な情報量が多い印象です。
「なんでこうなってるの」という部分が出てきたときに、その都度調べていくスタイルだと負担が少ないと思います。


###作業環境
Houdini indie 18.5.351
Redshift 3.0.33

Windows 10 home
CPU RYZEN 9 4900H
memory 40GB
GPU RTX2060 6GB



##1.LOPでのオブジェクト読込み（作成）
###作業スペース変更
まず作業スペースをSolarisに切り替えます。
![スクリーンショット 2020-12-13 104647.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/3e6cf108-5776-7af5-d741-44761551f3f6.jpeg)

###SolarisへUSDファイルを配置（読み込み）
HoudiniではSOPで作成したオブジェクトを読み込むこともできますし、LOP内でSOPを作成することもできます。
LOPノードでSOPで作成する**SOP Create**を使ってみます。
![スクリーンショット 2020-12-13 130934.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/5dac0dc3-94f3-af0f-27d6-521b1503039d.jpeg)

内部はGeomertyコンテキストなのでSOPノードが使えます。
![スクリーンショット 2020-12-13 131103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/880a9d61-8227-7f05-031c-3cfc64acc6bd.jpeg)
プリミティブな木を作ってみました。
![スクリーンショット 2020-12-13 131130.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/1297e86f-a594-5908-9436-cd274c02f4d8.jpeg)
もう一つ丸い形状でも作りました。
![スクリーンショット 2020-12-13 131957.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/b107a7e3-6a46-ecd6-6dd3-8e92008643da.jpeg)

##2.Variantの作成
variantの使い方は[CGwiki](https://www.tokeru.com/cgwiki/index.php?title=HoudiniLops#Variants)を踏襲しています。
不明なところは参照してみてください。

###Add Variantの追加
**Add Variant**ノードを追加し、左側入力に**Primitive**を、右側入力に作成した2つのprim（オブジェクト）をに接続します。
下に**Explore variants**を接続します。
![スクリーンショット 2020-12-13 132322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/07ed15cf-b44f-38d2-3d60-f6e08ba99c11.jpeg)

###Variantの確認
**Explore Variants**ノードのModeをExplore Variantsを選択すると、Variantに設定したprimが並べて表示されます。
アセットの確認に便利です。
![スクリーンショット 2020-12-13 133051.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/a10ebce1-8181-01dd-97ac-0114039783d1.jpeg)
![スクリーンショット 2020-12-13 133107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/5e0468ee-c0aa-1860-5ffa-4162dfe02ebf.jpeg)


##3.Instancerによる配置
###Duplicateの追加
**Instancer**による複製のために**Duplicate**ノードを追加します。
![スクリーンショット 2020-12-13 133645-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/9cbefcac-69d1-919f-3e40-4662eff692fd.jpeg)

**Duplicate**ノードからModify Source PrimitiveのSource Primitive are first duplicatesを選択、Primitive DefinitionのReference Type Make Instanceableにチェックを入れます。
![スクリーンショット 2020-12-13 133816.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/e64fe9a0-3ffb-c83f-ba1d-544b2fdb32cc.jpeg)
Total NumberはVariantの数に応じて増減させます。
今回は2つなのでそのままです。
![スクリーンショット 2020-12-13 141814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/c89d6450-d209-18fe-0fb7-d10580da2136.jpeg)


さらに下に**Set Variant**と**Instancer**を接続します。
![スクリーンショット 2020-12-13 133645.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/3711034d-660d-3eaf-ca12-282e35568354.jpeg)
**Set Variant**ノードのPrimitivesに**Add Variant**の_trees*_を入力し、Variant Setはmodelを選択します。
![スクリーンショット 2020-12-13 135337.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/ec92a627-65ea-ce68-be0c-a1b2374ace5d.jpeg)
**Instancer**ノードのTarget Points、 Location SourceをExternal SOPにし、SOP Pathにインスタンスを配置するポイントを指定します。
続いて、Prototype SourceにSecond inputを選択し、Prototype Primitivesに_trees*_を入力します。
![スクリーンショット 2020-12-13 135528.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/4b430062-ec99-614e-2b04-16957b94c98c.jpeg)

ここでは別の**SOP Create**を作り、HeightField内にScatter pointsを指定しました。
![スクリーンショット 2020-12-13 153919.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/c709e30e-7db6-f8c5-bf70-7300041d2716.jpeg)

![スクリーンショット 2020-12-13 143321.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/5dec60d2-1a20-64cc-bc84-5dc0614c803a.jpeg)




これで**Instancer**による配置ができていると思います。
![スクリーンショット 2020-12-13 141838.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/7c1edf37-2a50-f09a-8be7-aa1909b8d489.jpeg)


次は、地形と木が分かれた状態なので合成します。

##4.Referenceによる合成
SOPとは異なり、LOPではオブジェクトの追加に複数の手法があります。
手法による違いは他の記事を参照してください。

今回は**Reference**ノードを使用します。
**Reference**ノードを作成し、地形の**SOP Create**ノードを左側の入力に接続し、**Instancer**ノードを右側の入力に接続します。

![スクリーンショット 2020-12-13 142715.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/4dbb15e4-b66b-94f1-e3f9-0d2dc1a15cd7.jpeg)

CompositonのReference TypeをReference From Multi-inputにします。
![スクリーンショット 2020-12-13 142806.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/61c5e575-012c-e49b-e8a2-0a1e7e111c62.jpeg)

地形とインスタンスが合成されました。
![スクリーンショット 2020-12-13 144327.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233336/33e41e77-18f4-565b-9930-6171d3c73b61.jpeg)


##おわりに
USDを使用すると大量のオブジェクト、複雑なシーンを効率的に管理できる一方、使用するための考え方の理解がハードルになっている感もあります。
Solarisを使用することでノードベースで視覚的な理解の助けになると思います。

極力シンプルな内容にすることで多くの人に触れてもらい、知見が拡大していくことを願っています。

###.hipファイル
作例のhipファイル(zip)です。
[201213_advent_calendar.hiplc](http://www.thespidersthread.com/wp-content/uploads/2020/12/201213_advent_calendar.zip)
※クリックでダウンロードできない場合、新しいタブで開くとできるかもです。

ファイルをダウンロードした方は、ぜひ**Scene Graph Tree**を開いてからノードを追ってみてください。
項目ごとの増減・変化が一覧できるので、USDの強みである構造化の理解がしやすいです。
（SOPでいうところの**Geomerty Spread Sheet**みたいに使っています）