Reality Composer詳細解説〜〜Xcode11時代のARコンテンツ開発

#はじめに
WWDC2019で公開されたReality Composerのセッションを聞いて、「これは便利ですね！アップルさん、さすがかよ！」って思いながら、早速Reality Composerをいじってみました（記事を書くのが遅いけどね…）。
**本稿では、Reality Composerの各機能の解説と実際に使ってみった感想をまとめました。**

#Reality Composerとは？
>AR体験のプロトタイプやコンテンツ制作を誰でも簡単に行えるようになりました。それをXcodeを使用してAppに組み込んだり、AR Quick Lookにエクスポートしたりできます。Reality Composerを使用すると、iOSおよびMac上でアニメーションやインタラクションを作成して、3Dコンテンツの魅力を高めることができます。

[apple developer](https://developer.apple.com/jp/augmented-reality/reality-composer/)より引用

ざっくり言うと、**Reality ComposerはARコンテンツを開発するためのツールです**。
GUIで操作可能なので、ARコンテンツ開発のハードルをだいぶ下げました。特に、ARオブジェクトのアニメーションの作成はコードを書かずに、マウスクリックだけでかなり高い精度のアニメーションを実現できるようになりました。

このツールはxcodeに組み込んだバージョンとiOSアプリのバージョンがあり、本稿ではiPadアプリバージョンのReality Composerを使って、詳細な機能について解説していきます。

#ARシーンの基本要素
![スクリーンショット 2019-08-30 15.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/775d925d-4054-3cb4-a336-31042589792c.png)
Anchor：水平面、画像などの参照物
Objects：ARオブジェクト
Behaviors：ARオブジェクトの動作、アニメーション
Physics World：現実空間

ARシーンは以上4つの要素に分解することができます。その中で、現実空間も含めて、reality composerがすべての要素を制御できます。本稿では、それぞれの要素の角度からreality composerの機能を紹介します。

##Anchor
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/3c7c1083-980e-47a5-04f4-5718956b2f67.png)

選択できるアンカーは、水平面検出、垂直平面検出、画像検出、顔検出、物体検出の５種類です。現時点でアップルが持っているマーカー型とマーカーレス型AR技術に全て対応しています。

##Objects
読み込まれた3dオブジェクトの場所、形、外観、重さなどのパラメーターを制御できます。
###コンテンツライブラリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/f271cbfa-657d-d431-8868-8733b7a5c140.png)
コンテンツライブラリから外部の3dオブジェクトの読み込みやアプリ内に用意してある数百種類の3dオブジェクトをARシーンに取り入れることができます。

###Transform

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/6223e04d-bdc1-ae76-c4eb-b08668507dea.png)
トランスフォームはオブジェクトの座標、回転角度やサイズの比例をいじる機能です。これらのパラメーターは右パネルのテキストボックスか、直接左のシーンの中で調整できます。unityやblenderなどのコンテンツ開発ツールを使い慣れた方にとってはとてもお馴染みがある画面でしょう。

###外観
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/de123d0d-c090-ff18-4f9b-9a480e5cdc2c.png)
オブジェクトの素材は見た目だけに影響しています。素材の変更により、オブジェクトの密度や摩擦係数などが変わったりすることはしません。また、オブジェクトの形と大きさや角の丸さもこちらで設定します。

###物理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/b2688bd9-d07c-c2ad-dfe4-bc07a051de0f.png)
「含める」はオブジェクトの物理設定のon/offボタンです。これをoffにすると、オブジェクトが幽霊のように、他のオブジェクトや平面とぶつかっても透過してしまう。

「モーションタイプ」は"固定"と"ダイナミック"の2パターンがあり、オブジェクトの座標を変えることができるかどうかを意味しています。ゲームで例えると、樹木と橋のような景観は”固定”にするべき、モンスターは”ダイナミック”にしたほうがいいでしょう。

物理設定の「素材」は外観設定の「素材」と真逆で、ここの「素材」を変えても、見た目が変わらず、オブジェクトの密度、摩擦係数や弾性の大きさが変わります。

「衝突する図形」で、オブジェクトの衝突判定の形状を設定します。”自動”に設定すると、オブジェクトの凹凸により衝突判定の形状が自動的に適用され、一見めっちゃ便利そうですが、オブジェクトの形が複雑な場合は計算量もそれなりに大きくなるので、要注意です。


##Behavior
オブジェクトの動作やアニメーションは以下三つの角度から制御できます。
トリガー：アニメーション発動の条件
アクション：アニメーションの種類
アクションシーケンス：複数のアニメーションのgroupingやlooping

###トリガー
![スクリーンショット 2019-09-03 11.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/51e6eba7-4ce6-0c87-86ae-5119aae4f079.png)
アニメーションの発動条件は上図の5種類あります。

Start：シーンのロードが完了した時点で発動
Tap：オブジェクトがタップされたら発動
Proximity：カメラがオブジェクトにある距離まで接近したら発動
Collision：指定されたオブジェクトとぶつかったら発動
Notification：コードで通知を書いて、発動条件を決める（例えば、UIボタンが押されたらオブジェクトに通知して、アニメーションを発動）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/e706b19d-8565-7a1f-d86c-7d642e98806b.png)
ビヘイビアのテンプレートからトリガーとアクションを追加します。

###アクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/1f7cc579-588c-75c5-e622-f93cfdd86711.png)
オブジェクトに追加できるアクション： 1.強調 2.表示 3.隠す 4.移動 5.回転 6.拡大縮小 7.力を加える 8.オービット 9.回転 10.シーンの変更 11.サウンド再生 12.環境音再生 13.ミュージック再生 14.待機 15.USDZアニメーション 16.カメラを見る 17.通知

11,12,13がわざわざサウンド、環境音、ミュージックの再生に分ける理由はまだ理解できていないですが、分かったらまた追記します。

15のUSDZアニメーションはUSDZファイル作成時に作ったアニメーションのことを指しています。

###アクション・シーケンス
![スクリーンショット 2019-09-03 15.56.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/b6046bd2-bc2d-b50f-5d64-c28d1b30a4f6.png)
アクション・シーケンスとは一つのオブジェクトに対して一連のアクションによって構成されるアクション群のことです。上図のようにgrouping & loopingしているアクション1~5は一つのアクション・シーケンスといいます。

また、exclusiveアクション・シーケンスを定義することができます。exclusiveと定義されたアクション・シーケンスが開始すると、他の再生中のexclusiveアクション・シーケンスが自動で止まります。exclusiveとして定義していないアクション・シーケンスには影響されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/5acfcc53-b1d8-ed40-0021-e903c8d838c7.png)
drag & dropでアクションのグルーピングが簡単にできてしまう。

##Physics World
###シーンの物理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/9b0787dc-0dc2-c88e-4537-264eeb50f7f1.png)
シーンはオブジェクトと同じく物理の定義ができます。衝突するかどうかと平面の素材による弾性と摩擦係数以外に、シーンの重力の大きさも調整できます。

#ARモード
今まで紹介した機能は他の3dコンテンツ開発ツールもできるかもしれませんが、こちらの機能だけのためでも、reality composerを試してみる意義があると思います。

開発途中のプロジェクトでもARモードに切り替えて、実際にARオブジェクトがどのように映っているのか、アニメーションの動きが自然なのかを確認できます。ARコンテンツの微調整のために、毎回アプリをbuildし直さなくても実機テストができてしまいます！

しかも、それだけではなく、プロジェクトファイルをairdropやメールなどで他人と共有し、プロジェクトをAR QuickLookみたいに他のデバイスで確認することもできます。

![realityc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259387/a24c86f4-160d-4a20-5683-d44035398c56.gif)


#終わりに
Reality Composerを使えば、これからiOS側のARコンテンツ開発はかなり省力且つ加速されるでしょう。
機能の紹介は以上です。何かご不明点やご意見がありましたら、ぜひコメントを書いていただければと思います。