RealityKit の説明と SceneKit との違いについて考える (Xcode 11.0 Beta 1)
3DCG レンダリングと AR 補助機能を持った RealityKit が発表された。
RealityKit の説明をしつつ、最後に SceneKit との違いを考えてみる。
今回はコードでの説明はないので注意。
現状 Beta 版であるため公開されている情報からのまとめ。
以下の情報に関しては今後変更される可能性がある。
RealityKit とは
RealityKit は Metal 新たにつくられた 3DCG レンダリングを行うビューで ARKit 共に使用し AR 体験を手軽に体験するコンテンツを作成することができる。
ノードベースでシーンを作成するのではなく、ゲームなどで使用される Entity Component System でシーンがつくられている。
RealityKit が現状サポートされている OS
iOS と macOS(UIKit for Mac)
Reality Composer アプリ用に macOS でも動くようになっているのだと思われ。
そのため tvOS は対応されていないのではないかと予想される。
というか、Apple TV HD は Apple A8 なので、サブディビジョンサーフェイスなど RealityKit で実装されている機能が動作しない。
RealityKit の主な機能
- Entity Component System でのシーン構造
- Reality Composer アプリで作成したシーンアセット
- 立方体や球やカプセル型などのシェイプや USDZ を使用したカスタムシェイプ
- 物理ベースやアンリットのマテリアル
- カメラとライト
- アニメーションと物理シミュレーション
- 空間オーディオ
- 画像、オブジェクト、フェイス、ボディトラッキング設定
- 多人数で AR を体験する為のデバイス間での同期
RealityKit のシーン構造
RealityKit のシーン構造は、基点となる View である ARView があり、View にはシーンが設定され、シーンには ARKit 使用されているようなアンカーを設定し、そこにエンティティを設定することができる。
(RealityKit のアンカー自体もエンティティではある)
ビューを除くと主な要素は以下のものとなる。
- シーン
- エンティティ
- コンポーネント
- リソース(reality ファイル、USDZ、画像、効果音や音楽)
RealityKit のエンティティ
エンティティとは機能を設定したコンポーネントを集めた塊で、SceneKit でいうノード、Unity でいう GameObject のこと。
AR アンカーもエンティティにぶら下がるコンポーネントとして扱っており、 エンティティをエンティティの入れ子にすることができる。
RealityKit で用意されているコンポーネント
エンティティに対してコンポーネントはなんらかの機能を付加し、
エンティティ設定時に、移動、回転、拡大縮小の設定やアニメーションを行う Transform のコンポーネントは必ず設定されている。
以下、RealityKit で用意されているコンポーネント。
- AR アンカー
- ジオメトリを表示するモデル
- カメラやライト
- 物理シミュレーション、物理アニメーション
- 物理ボディ、物理判定(コリジョン)
- ボディトラッキング
- トリガーボリューム
AR アンカー
シーン直下にはエンティティではなく1つ以上のアンカーを置くことになる。
基本的はこれまでの ARKit で設定してきたようにモデルを置くか、画像、物、顔、人のトラッキングを行う。
人のトラッキングのみ、ボディトラッキングのコンポーネントでジョイント(ボーン)を設定し使用する。
モデル
USDZ で読み込んだジオメトリか、RealityKit で用意されている立方体、球、カプセル、頂点を設定した自前のシェイプを表示する。
USDZ の方がマテリアルの設定が多いため、基本的には USDZ を使う形になると思われる。
また、移動、回転、拡大縮小や衝撃、トルクなど物理動きを与えたアニメーション、物理ボディ、物理判定はここで行う。
シェイプ
RealityKit で用意されているシェイプは立方体、球、カプセルのみ。
それ以外は自前で作る必要がある。
モデルのマテリアル
種類は以下の3つ。
- 物理ベースマテリアルの SimpleMaterial
- シェーディングせずにベタ塗りで表示する UnlitMaterial
- 領域内にあるモデルを隠し背景画像を表示する OcclusionMaterial
SimpleMaterial は baseColor (diffuse, albedo), metallic, roughness のみでテクスチャ画像か、数値 (Float) が設定可能
UnlitMaterial はテレビ画面など光っているものに向いており、
OcclusionMaterial は机の下からモデルを出したい場合、モデルを OcclusionMaterial で設定したモデルでおおうことで表示されなり、
OcclusionMaterial のモデルから離れた部分から表示される。
カメラやライト
カメラは PerspectiveCamera のみ存在しており、カメラモードを nonAR に設定するとデバイスのカメラを使用しなくなる。
nonAR は VR 用や Reality Composer で使用しているものだと思われる。
ライトはポイント、スポット、ディレクショナルライトのみ設定が可能。
設定することがあまりないかもしれないが影を表示しないようにすることも可能。
物理シミュレーション関連
一般的な物が設定できるが、物理フィールドが設定できないため、基本的には重力のみの物理シミュレーションと考えてよい。
物理ボディの動作設定は static、kinematic、dynamic。 SceneKit の過去記事を参照。
マテリアルで摩擦係数、反発係数を設定できる。
物理ボディの形状は用意されているシェイプを使用するか自前で生成する。
物理判定は SceneKit 同じ用に Began、Updated、Ended で評価され、CollisionGroup で物理判定へのフィルターができる。
トリガーボリューム
物理判定のみを持つエンティティ。
何かの当たり判定やこの領域にキャラが入った時に何かするなど、モデルを必要としない場合の物理判定。
RealityKit でその他の設定
音
AudioPlaybackController に音を設定して、再生やループ、停止、一時停止、音量やリバーブなどをエンティティに設定する。
3D 環境で再生される為、鳴らしているエンティティから近くに行くと音が大きくなり、遠ざかると音が小さくなる。
コンプリートハンドラーから再生完了後に任意の命令を実行が可能。
デバイス間での同期
Bluetooth を使用した Multipeer Connectivity を使用しデバイス間での同期させることができる。
基本的には ARKit でやってるように ARSession を端末間で渡し合う。
ビュー (ARView)
以下設定できるもの。
- ARKit の ARSession
- 空間音響
- 物理シミュレーションの原点
- ヒットテストやレイキャスト
- エンティティへのジェスチャー(移動、回転、拡大縮小など)
- タッチ、キーボードのダウンアップ、マウス設定、
- 表示されているビューを画像にするスナップショット
- デバッグオプション
- 表示機能を有効・無効にするレンダーオプション
レンダーオプションで設定できるもの
- 光の自動調整
- カメラゲイン(ノイズを乗せるエフェクト)
- 被写界深度
- 平面に投影させる影
- モーションブラー
- HDR
- フェイスオクルージョン
- ピープルオクルージョン
Reality Composer
RealityKit のシーンファイルを構築するためのアプリで、reality という名のカスタムファイルが作成できる。
また、タップ、接近、物理接触字の処理、シーンスタート時などにビヘイビアとしてトリガーや動きや操作(アクション)を設定することができる。
アプリでシーンのリソースとして読み込んだり、
作成したものを iOS、iPadOS 端末でプレビューしたり、QuickLook での表示が可能で、
一部ユーザー操作とデバイス間の同期以外はだいたい設定できる模様。
詳しい操作はこちら(英語だがスクリーショットが多いので雰囲気がなんとなくわかると思われる)
また、reality ファイルはバイナリを埋め込んだ zip ファイルと予想される。
scn や USDZ ではないっぽいので他との互換性はないと思われる。
互換性があるのであれば、WWDC のセッション内で言うはずなので。
SceneKit との違い
SceneKit は ARKit よりも前に作成されており汎用的な 3DCG レンダリングやその操作するもの。
RealityKit は AR 用かつ手軽に作成できるようつくられたもので、現状は SceneKit より機能が絞られている。
また、SceneKit は設定されている機能のほとんどがカスタマイズ可能だが、RealityKit で可能なものは、カスタムモデルとコンポーネントぐらい。
現状 RealityKit は主に AR 用、SceneKit は 汎用的な 3D 用だと考えて良いと思われる。
以下、違いをまとめてみる
SceneKit | RealityKit | |
---|---|---|
学習コスト | 高い | 低い |
ビルトインジオメトリ | 多い | 少ない |
マテリアルとパラメーター | 多い | 少ない |
エリアライト | ○ | × |
SS Reflection | ○ | × |
SSAO | ○ | × |
ライトプローブ | ○ | × |
リフレクションプローブ | ○ | × |
物理フィールド | ○ | × |
パーティクル | ○ | × |
モーフ アニメーション | ○ | × |
コンストレイント | ○ | × |
背景画像 | ○ | × |
カスタムシェーダー | ○ | × |
マルチパスレンダリング | ○ | × |
SpriteKit | ○ | × |
2Dオーバーレイ | ○ | × |
エディタ | Scene Editor | Reality Composer |
エディタでのビヘイビア追加 | × | ○ |
シーンファイル拡張子 | scn, scnz | reality |
対応 OS | iOS, macOS, tvOS, watchOS | iOS, macOS |
対応言語 | Objective-C, Swift | Swift |
まとめ
RealityKit は、機能的に SceneKit よりも劣るものの、Reality Composer の発展も含めて今後有力な開発環境にと思われる。
今後や来年の WWDC でどのような機能が実装されるかで、Apple プラットフォームで新しい汎用の 3D レンダラーになる可能性もあり楽しみである。