[visionOS] 最もシンプルな完全没入空間を試すサンプルコード

2023年9月28日 所 友太 / @tokorom

image

ぼくがやりたかったのはシンプルに完全没入空間 immersiveStyle = FullImmersionStyle になにか表示するというだけなのですが、それなのに地味にはまったため記事にしています。

完全没入空間とは

日本語訳が正しいかわかりませんが、パススルー領域が全くない360度全面が1つのアプリで覆われた空間が完全没入空間です。

visionOSならではのUIであるため、なにかしら試してみたいかたも多いのではないでしょうか。

Appleのサンプルでは宇宙空間に没入するデモがあります。

image

最もシンプルなサンプルがほしい!

このAppleのサンプルを動かせばことが済む話でもあるのですが、このサンプルでも地球や月などのコンテンツを読み出してRealityViewに設置するなどしなければならず、RealityKitに慣れていない僕にとってはこれでも冗長かなあという感覚でした。

僕からすると未知のファイルなどがなにもなく、単に目の前に四角形が1つ出る程度の最もシンプルなものが欲しかったんです。

それをベースにちょっとずつ自分で実験をしていければ、と。

これが最低限の3ファイルだ!

app.swift

アプリのエントリポイントです。

import SwiftUI

@main
struct SimplestFullImmersionApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }

        ImmersiveSpace(id: "ImmersiveSpace") {
            ImmersiveView()
        }
        .immersionStyle(selection: .constant(.full), in: .full)
    }
}

ContentView.swift

初期表示されるWindowのViewです。

import SwiftUI

struct ContentView: View {
    @Environment(\.openImmersiveSpace) var openImmersiveSpace

    var body: some View {
        Button("Open Immersive Space") {
            Task {
                await openImmersiveSpace(id: "ImmersiveSpace")
            }
        }
    }
}

ここは本来はエラーハンドリングや dismissImmersiveSpace にも対応するほうが良いですが、最小限にするため削ってあります。

ImmersiveView.swift

これが今回のメインコンテンツ。 完全没入空間で表示するViewです。

import SwiftUI
import RealityKit

struct ImmersiveView: View {
    var body: some View {
        RealityView { content in
            let entity = Entity()
            content.add(entity)
            let box = ModelEntity(mesh: .generateBox(size: 0.5))
            box.position = .init(x: 0.5, y: 1.5, z: -0.5)
            entity.addChild(box)
        }
    }
}

以上のコードが完全没入空間に箱を表示するための最低限のコードだと思います。

positionについて

positionは自分の足元が x: 0, y: 0, z: 0 になるとのことなので、

としてみています。

僕は初心者すぎてこの position がわかっておらず「addしたはずの箱が表示されない!」とずっとはまっていました…

まとめ

この最低限の3つのコードをvisionOSシミュレータで動かすと、

image

のようにピンクの縞の謎の箱が目の前に現れずはずです!

これをベースに完全没入空間でいろいろと遊んでいければと考えています。

このコードはBuild&Run可能なプロジェクトとして

https://github.com/tokorom/SimplestFullImmersion

に置いてあります。

Related Entries
Latest Entries
すべての記事一覧をみる