visionOSのSwiftUIとARKitとRealityKitの関係
はじめに
2024年にAppleからVision Proというヘッドマウントディスプレイ(以下、HMD)が発売されます。そのVision Proに搭載されているのがvisionOSです。
ここではvisionOSで開発を行うために必要な情報をまとめていきます。
なお、書いている内容はAppleから公開されているWorld Wide Developer Conference(以下、WWDC)の動画や、Design Guidelinesに書かれている内容を参考にしています。ページの最後に参考にしたWebページのURLを貼っています。詳しく知りたい方は参考先のURLも見てみてください。
visionOSでアプリを開発していく上で、幾つかのフレームワークのことを理解しておく必要があります。それぞれのフレームワークの役割を理解しておくと、実現したい事に対してどのフレームワークを調べれば良いのか分かるようになります。
今回はvisionOSでアプリ開発する際に覚えておきたい3つのフレームワークSwiftUI、ARKit、RealityKitについての説明していきます。
SwiftUI
SwiftUIはvisionOSだけではなく、iPhoneやiPadなどAppleが提供するデバイスでウィンドウやボタン、テキストをレイアウトするためのユーザーインターフェースフレームワークです。
例えば、ウィンドウにテキストと画像を表示して選択されたら別のウィンドウを開くような2DアプリであればSwiftUIだけでvisionOSのアプリ開発が可能です。
// SwiftUIでテキストを表示する
struct ContentView: View {
var body: some View {
Text("Hello, world!")
}
}
また、visionOSのウィンドウにはドラッグやウィンドウを閉じるアクションが既にあります。その為、SwiftUIだけで作られたアプリでもvisionOSの視線トラッキングやジェスチャーにも対応しています。
ARKit
ARKitはカメラが捉えた現実世界の空間をリアルタイムに認識します。例えば、壁に貼られている絵画や、部屋に置かれた机や本棚など、パススルーで見えている現実世界のオブジェクトを認識するにはARKitを使います。
3Dモデルのボールが現実世界の壁に当たって跳ね返るゲームを作るには、壁を認識する必要があります。机の上に3Dモデルの花瓶を置くにも、机と空間上の位置を認識する必要があります。
ARKitは空間認識だけではなく、もっと高度なことも可能です。例えば、顔の表情や人の動きをトラッキングして3Dモデルに反映する様なことも可能です。
Reality Kit
Reality Kitは現実空間に3Dモデルを配置するためのフレームワークです。ARKitと連携することで、現実世界の机の上(ARKit)に、3Dモデルのボール(Reality Kit)を配置することができます。
// SwiftUIの中にRealityViewを使って3Dモデルを表示する
struct ContentView: View {
var body: some View {
RealityView { content in
let earthEntity = await EarthEntity()
content.add(earthEntity)
}
}
}
SwiftUIと連携すれば、ウィンドウ(SwiftUI)の中に3Dモデルの衛星(Reality Kit)を表示することも可能です。SwiftUIとRealityKitの連携はとても簡単で、SwfitUIの中にRealityViewをネストしてその内側に3Dモデルを追加するだけです。
Reality Kitには3Dモデル意外にも、空間からどの様に音を出すのかを決めるSpatial Audioや、3Dモデルの当たり判定のためのCollision detectionなどの要素があります。
まとめ
SwiftUI,ARKit,RealityKitのそれぞれの関係性や役割を覚えておくと、実現したいアプリに対して何を調べて学習すれば良いのか分かるようになります。更に、オリジナルの3Dモデルを作成するにはBlendar(3DCG制作ソフト)を使ってUSDZ形式のファイルで書き出してXCodeに取り込む必要があります。
まずは基礎的な概念をしっかり理解してから次のステップに進んでいきましょう。
あとがき
visionOSについて現時点で書ける範囲での本を書きました。2023/11/12(日)の技術書典15で販売するのでよろしければ。
visionOSの開発をみんなで勉強するためのvisionOS Developer Communityを始めました!