Maya で複雑な形状のオブジェクトを大量にレンダリングする方法

#はじめに
妹の結婚式のオープニングムービーとして、3DCGアニメーションを作成しました。
https://vimeo.com/275186052

![https://vimeo.com/275186052](https://qiita-image-store.s3.amazonaws.com/0/74764/c717a45e-babe-8667-76f3-c2dc6ed2f644.png)

本稿では、この動画の作成時に利用した、形状の異なる大量のレゴブロックを物理シミュレーションさせる方法について紹介します。

![Jun-16-2018 22-11-21.gif](https://qiita-image-store.s3.amazonaws.com/0/74764/27962e55-b0fe-10f0-b342-415a33d1ffc2.gif)


#準備

##利用するツール
* Maya 2017 update5
* MtoA 2.1.0.2（Arnold Core 5.0.2.3）

##モデルの準備
シミュレーションに使用するレゴブロックのモデルを5種類用意します。

![Screen_Shot_2018-06-15_at_12_28_09.png](https://qiita-image-store.s3.amazonaws.com/0/74764/d0f3b53b-5a8f-685b-88af-aeb21daee210.png)

#実現方法

大量のレゴブロックを床に散らばらせる映像を実現するために、２つの工程について説明します。

* スタンドインの作成
* シミュレーションの作成

##スタンドインの作成

レゴブロックのモデルを大量に Maya シーンに配置していくと、シーン内の頂点数が増大するため、シーンが重くなり作業効率が低下します。この問題に対策するため、Arnold の**スタンドイン**という機能を利用します。スタンドインを簡単に説明すると、大量の頂点の読み込みをレンダリングまで先送りするための機能です。スタンドインの詳細については、Arnold の[公式マニュアル](https://support.solidangle.com/pages/viewpage.action?pageId=74941146)で説明されています。

![https://support.solidangle.com/pages/viewpage.action?pageId=74941146](https://qiita-image-store.s3.amazonaws.com/0/74764/e0ee6046-ce2b-64cc-5936-bcb84e4c066c.png)

###ass ファイルの書き出し
スタンドインを作成するために、まずはブロックのメッシュデータを **ass(Arnold Scene Source)ファイル** として出力します。ass ファイルとは、Arnold が読み込める形式のシーンファイルです。レゴブロックを選択した状態で メニューから「Arnold → StandIn → Export」を選択します。

![Screen_Shot_2018-06-15_at_15_47_17.png](https://qiita-image-store.s3.amazonaws.com/0/74764/9ca6f53c-38bd-8269-a649-2f69e66aa562.png)

今回はブロックの形状だけ書き出すため、書き出し設定を以下のように変更します。

![Screen_Shot_2018-06-15_at_15_50_37.png](https://qiita-image-store.s3.amazonaws.com/0/74764/a843bb8e-b08a-81da-67b5-1f77b5e0821e.png)

この手順で全てのブロックの ass ファイルを出力します。

###ass ファイルの読み込み
スタンドインを作成するため、ブロックの形状を模したキューブを用意します。このキューブはあとで衝突判定にも使用するので、できるだけブロックの形状に似せる必要があります。

![Screen Shot 2018-06-15 at 12.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/74764/74b15732-c177-e502-15df-002dfc3e0b53.png)

次に、キューブに ass ファイルを割り当てます。キューブを選択して Attribute Editor を開きます。

![Screen Shot 2018-06-15 at 16.03.34.png](https://qiita-image-store.s3.amazonaws.com/0/74764/15ffaea0-90b3-5d19-ac1a-00af0149bf89.png)

Attribute Editor の Arnold の項目を以下のように指定します。

![Screen_Shot_2018-06-15_at_16_03_34.png](https://qiita-image-store.s3.amazonaws.com/0/74764/97769569-9c08-318e-ea1a-2cc22735c122.png)


適切にスタンドインが作成されているか、レンダリングして確認します。テスト用のライトを配置して、キューブにマテリアルを割り当ててから、メニューから Arnold → Render を選択します。

![Screen Shot 2018-06-15 at 16.00.48.png](https://qiita-image-store.s3.amazonaws.com/0/74764/a52e36cb-52a3-b183-a8bf-25d1b9c8933d.png)

問題なくレンダリングできたら、他のサイズのブロックについても同様にスタンドインを作成します。

##シミュレーションの作成

スタンドインを作成できたので、次にこのブロックをたくさんシーンに配置して、床に散らばせるようにセットアップします。物理シミュレーションには **Bullet** を使用します。

###インスタンスの配置

シミュレーションに使用するスタンドインをシーンに配置していきます。このとき、通常のコピーではなくインスタンスコピーを使用します。こうすることで通常のコピーよりもメモリ消費が抑えられます。
インスタンスコピーを実行するには、メニューから Edit → Duplicate Special を選択します。

![Screen_Shot_2018-06-16_at_18_08_39.png](https://qiita-image-store.s3.amazonaws.com/0/74764/27034d23-243b-2bc7-dfae-dca230c774ed.png)

**Geometory Type** は **Instance** を選択して、コピーするメッシュを選択した状態で Apply します。

![Screen_Shot_2018-06-16_at_18_09_48.png](https://qiita-image-store.s3.amazonaws.com/0/74764/a66550f0-8424-3467-c4d6-1567afc6590e.png)

ある程度ブロックをランダムに配置して、ブロックを転がす床を用意します。

![Screen Shot 2018-06-16 at 18.26.07.png](https://qiita-image-store.s3.amazonaws.com/0/74764/88cd8d99-833e-2211-ccf5-085b4f76e0ea.png)

全てのブロックを選択し、メニューから Bullet → Active Rigid Body を選択します。

![Screen_Shot_2018-06-16_at_11_59_55.png](https://qiita-image-store.s3.amazonaws.com/0/74764/918962aa-84e5-85d8-3001-802b697f11cb.png)

オプションは以下のように設定します。

![Screen_Shot_2018-06-16_at_18_38_28.png](https://qiita-image-store.s3.amazonaws.com/0/74764/fd3dfac5-2d10-e28b-ea54-cca973fb6204.png)

床のメッシュを選択し、メニューから Bullet → Passive Rigid Body を選択します。

![Screen_Shot_2018-06-16_at_18_45_35.png](https://qiita-image-store.s3.amazonaws.com/0/74764/ca4906c9-bf09-9e86-2198-35e41912f289.png)


オプションは以下のように設定します。

![Screen_Shot_2018-06-16_at_18_41_30.png](https://qiita-image-store.s3.amazonaws.com/0/74764/d551597c-a914-daf0-0e88-ef92638c4772.png)

この状態でアニメーションを実行してみます。

![Jun-16-2018 18-54-03.gif](https://qiita-image-store.s3.amazonaws.com/0/74764/d6785927-79ab-0c2c-0045-a47963b865a8.gif)

ブロックと床のマテリアルをセットアップしてレンダリングすると以下のようになります。

![Jun-16-2018 22-16-00.gif](https://qiita-image-store.s3.amazonaws.com/0/74764/c5a77f31-c474-79f5-8341-3b7812526b35.gif)


##おわりに
今回はスタンドインと Bullet を使用して、レゴブロックのアニメーションを作成してみました。
制作した動画では、ブロックを積み上げて文字を作成していますが、こちらは **MASH** というツールの Distribute ノードを使用して制作しています。文字をメッシュ化したものに対して、スタンドインを配分させています。Distribute ノードの分かりやすい日本語チュートリアルがありますので、[Maya太郎の記事](http://maya.indyzone.jp/2016/10/12/maya2017-mash%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%9D%E3%83%AA%E3%82%B4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%82%92%E3%83%9C%E3%82%AF%E3%82%BB%E3%83%AB%E5%8C%96/)を参照してください。