2024/3/22
Apple Vision Pro (visionOS) で床と壁と天井を認識してモデルを配置する方法(サンプルコード&Xcodeプロジェクト付)
Appleの新しい空間コンピューターデバイス『Apple Vision Pro』とは
AppleがAR、VR、XR技術を搭載した新しい空間コンピューターデバイス『Apple Vision Pro』を発表しました。『Apple Vision Pro』について以下をご覧ください。
https://ar-marketing.jp/apple-glass-release/
日本初、アカデミー賞ノミネート映画の世界に没入体験できるApple Vision Pro アプリ開発から渋谷PARCOの展示サポートまで、すべて株式会社OnePlanetが手掛けました!
第96回アカデミー賞 11部門ノミネートされた映画『哀れなるものたち』(配給:ウォルト・ディズニー・ジャパン株式会社様)の世界に没入体験できるApple Vision Proのアプリの開発から渋谷PARCOでの展示サポートまで株式会社OnePlanetが手掛けました!
詳細は右のリンク先ページを御覧ください。https://1planet.co.jp/news/Twd0qMjt
はじめに
Apple Vision Pro(visionOS)の床、壁、天井を認識して3Dモデルを配置する方法について説明します。
動作検証した環境
Apple M2 Max
Xcode 15.3 (15E204a)
Apple Vision Pro (visionOS 1.1) (※)
(※)Apple Vision Proは日本国内でまだ発売前のデバイスです。本デバイス(無線設備)は電波法に則り、法に定める特別な条件下でのみ使用が認められた特例制度に基づき提供いたします。この条件に違反することなく、法令を遵守します。【届出番号】01-20240207-07-917395
プロジェクト作成
visionOSプロジェクトでInitial SceneをWindow、Immersive Space RendererをRealityKit、Immersive Space を Mixedにします。
3Dモデルの用意
https://developer.apple.com/jp/augmented-reality/quick-look/
床、壁、天井に1体のの3Dモデルを配置するため、3パターンのUSDZ形式の3Dモデルを使用します。
App.swift
import SwiftUI
import RealityKit
@main
struct VisionOS_AnchorSampleApp: App {
var body: some SwiftUI.Scene {
WindowGroup {
ContentView()
}
ImmersiveSpace(id: "ImmersiveSpace") {
RealityView { content in
let wallAnchor = AnchorEntity(.plane(.vertical, classification: .wall, minimumBounds: [1,1]))
content.add(wallAnchor)
let cellAnchor = AnchorEntity(.plane(.horizontal, classification: .ceiling, minimumBounds: [1,1]))
content.add(cellAnchor)
let floorAnchor = AnchorEntity(.plane(.horizontal, classification: .floor, minimumBounds: [1,1]))
content.add(floorAnchor)
if let entity = try? await Entity(named: "tv_retro") {
let radians = -90 * Float.pi / 180.0
entity.transform.rotation = simd_quatf(angle: radians, axis: SIMD3<Float>(1,0,0))
entity.scale = [0.01, 0.01, 0.01]
wallAnchor.addChild(entity)
}
if let entity = try? await Entity(named: "toy_car") {
let radians = -90 * Float.pi / 180.0
entity.transform.rotation = simd_quatf(angle: radians, axis: SIMD3<Float>(0,1,0))
entity.scale = [0.04, 0.04, 0.04]
cellAnchor.addChild(entity)
}
if let entity = try? await Entity(named: "toy_drummer_idle") {
entity.scale = [0.05, 0.05, 0.05]
floorAnchor.addChild(entity)
}
}
}
}
}
床、壁、天井の3種類のAnchorEntityを生成後、USDZ形式の3Dモデルを読み込んでEntityのインスタンスとして生成後、AnchorEntityにEntityをaddChildしています。3Dモデルのデフォルトスケールが大きいためスケール調整を行ってます。また、壁(.wall)のAnchorEntity生成時は、.verticalとしており、壁(.wall)に配置する3Dモデルは壁の反対側に向きを変更し、天井(.ceiling)に配置する3Dモデルは上下反転させてます。
実行
ImmersiveSpaceに切り替わったタイミングでApple Vision Pro を装着したユーザーが天井、壁、平面が頭を向けるとAnchorEntityが生成され3Dモデルが配置されます。
今回、作成したプロジェクトは以下のGithubのリポジトリにあります。
https://github.com/tokufxug/VisionOS-AnchorSample
お問い合わせ
ARに関するご依頼・ご相談など、お気軽にお問い合わせください。(※営業を目的としたお問い合わせはご遠慮ください。)
XR エンジニア
徳山 禎男
SIerとして金融や飲料系など様々な大規模プロジェクトに参画後、2020年にOnePlanetに入社。ARグラスを中心とした最先端のAR技術のR&Dや、法人顧客への技術提供を担当。過去にMagic Leap 公式アンバサダーを歴任。
View More