🌟

【Swift】iOS 18以降のRealityKit【AR】

に公開

なにができるようになるのか

iOSアプリでAR(拡張現実)を扱える。

基本コード

import SwiftUI
import RealityKit

struct ContentView : View {
    var body: some View {
        RealityView {
            // モデルを作成
            let model = Entity()
            let mesh = MeshResource.generateBox(
                size: 0.1,
                cornerRadius: 0.005
            )
            let material = SimpleMaterial(
                color: .gray,
                roughness: 0.15,
                isMetallic: true
            )
            
            model.components.set(
                ModelComponent(
                    mesh: mesh,
                    materials: [material]
                )
            )
            model.position = [0, 0.05, 0]

            // modelをAnchorEntityに設置
            let anchor = AnchorEntity(
                .plane(
                    .horizontal,
                    classification: .any,
                    minimumBounds: SIMD2<Float>(0.2, 0.2)
                )
            )
            anchor.addChild(model)

            // AnchorEntityをViewに紐づける
            $0.(anchor)
            $0.camera = .spatialTracking
        }
        .edgesIgnoringSafeArea(.all)
    }
}

主な登場人物

RealityKit

ARに関する開発を行うためのフレームワーク。
関連情報を漁っていると「ARKit」なるものも出てくるが、こちらはRealityKitに含まれている。

  • ARKit:ARに関する基本的な操作
  • RealityKit:よりリッチなAR開発

RealityView

3Dコンテンツをアプリで表示するためのView。iOS 18〜
(iOS 17以前向けで開発したい場合はUIKitベースのARViewを使う。)

既成の3Dモデルを使いたい場合

  1. 3Dモデルを用意してプロジェクトに配置
    • USDZファイル(.usdz)が相性よし
    • 普段リソースを入れるAssets.xcassetsではなく、プロジェクト全体の方へ格納する

2. ModelEntity(named:)で呼び出す

import SwiftUI
import RealityKit

struct ContentView : View {
    var body: some View {
        RealityView {
            if let model = try? await ModelEntity(named: "modelName") {
                model.scale = [0.002, 0.002, 0.002]
                $0.add(model)
            }
            content.camera = .spatialTracking
        }
        .edgesIgnoringSafeArea(.all)
    }
}

Discussion