Let's Apple Vision Pro! Sampleから学ぶPolySpatialのXR機能紹介
こんにちは、サイバーエージェントのXR研究所のイワケンです。
「社内外にXRを啓蒙し、事業のタネを作る」をミッションにXRの体験会、勉強会、プロトタイピング、開発プロジェクトなどを行っています。
この記事では、UnityのPolySpatialのSampleからvisionOS向けのXR機能の紹介を行います。(社内visionOS勉強会で発表した内容をZennに記事化しました)
実装方法については概要のみの紹介とさせていただきます。
Apple Vision Proでの実機での動作も共有します。
Mixed RealityのSample
開発環境
私が検証した開発閑居はこちらです。
ツール | バージョン |
---|---|
Apple M2,Sonoma | 14.4.1 |
Unity | 2022.3.18f1 |
PolySpatial | 1.1.6 |
Xcode | 15.3 |
visionOS | 1.2 |
ドキュメントはこちら。PolySpatial visionOS 1.1.6の場合
- An Apple Silicon Mac
- Unity2022.3.18以上
- Xcode 15.2以上
- visionOS 1.0以上
Unity PolySpatial開発の前提の話
Unity PolySpatialとは
UnityでvisionOS向けアプリを作成するためのパッケージです。
visionOS向けのプロジェクトのビルドをUnityエディタから行います。
- ① Mixed Reality
- Volume
- Immersive Space
- ② Virtual Reality - Fully Immersive
- ③ Windowed Apps
のアプリパターンを作成できます。
引用:UNITE2023 Unity PolySpatial + visionOS について知っておきたいすべてのこと
本記事では ②Mixed Reality に該当するアプリパターンのSampleを紹介します。
VolumesとSpacesの違い
引用:WWDC2023,Get started with building apps for spatial computing
Apple Vision ProにはVolumesとSpacesの2つのアプリパターンがあります。
-
① Volumes (Shared,Bounded)
- 箱型で他のアプリと共存できる
- ARkitの機能は使えない
- 入力は3DTouchに限定
-
② Spaces (Exclusive,Unbounded)
- そのアプリ単体の空間になる
-
ARkitの機能が使用可能
- 平面検知
- ハンドトラッキング
- etc...
Sampleを眺めてXR機能紹介
Sampleの習得の仕方
Package Managerを通じて、もしくはmanifest.jsonに直接書き込む形で
{
"dependencies": {
"com.unity.polyspatial": "1.1.6",
"com.unity.polyspatial.visionos": "1.1.6",
"com.unity.polyspatial.xr": "1.1.6",
...
}
}
を追加します。するとPackage ManagerにPolySpatial系のパッケージが追加されます。
PolySpatialのSampleを選ぶとSampleをimportできます!
SampleのScene一覧
- Balloon Gallery (紹介)
- CharacterWalker
- ImageTracking (紹介)
- Manipulation (紹介)
- Meshing
- MixedReality (紹介)
- ProjectLauncher
- SpatialUI
- SwiftUI
- XRIDebug
Sampleには以上のSceneが含まれています。本記事ではXR機能を説明するために4つのSceneを取り上げて説明します。
- Balloon Gallery
- ImageTracking
- Manipulation
- MixedReality
Balloon Gallery
概要
- Sharedモード
- 風船を3DTouchしたら割る
- 注視+ピンチによる選択
- 直接タッチによる選択
実装ポイント
3DTouchの実装
参考になるポイントは
-
UnityEngine.InputSystem.EnhancedTouch.Touch
のTouch.activeTouches
でタッチ情報を獲得 -
Unity.PolySpatial.InputDevices
のEnhancedSpatialPointerSupport.GetPointerState()
にてvisionOSのタッチ情報を取得 -
InputSystem.LowLevel
の-
SpatialPointerKind.IndirectPinch
で注視+ピンチによる選択 -
SpatialPointerKind.Touch
で直接タッチによる選択
-
using Unity.PolySpatial.InputDevices;
using UnityEngine;
using UnityEngine.InputSystem.EnhancedTouch;
using UnityEngine.InputSystem.LowLevel;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;
public class GalleryInputManager : MonoBehaviour{
void OnEnable()
{
EnhancedTouchSupport.Enable();
}
void Update()
{
var activeTouches = Touch.activeTouches;
if (activeTouches.Count > 0)
{
var primaryTouchData = EnhancedSpatialPointerSupport.GetPointerState(activeTouches[0]);
if (activeTouches[0].phase == TouchPhase.Began)
{
// allow balloons to be popped with a poke or indirect pinch
if (primaryTouchData.Kind == SpatialPointerKind.IndirectPinch || primaryTouchData.Kind == SpatialPointerKind.Touch)
{
var balloonObject = primaryTouchData.targetObject;
if (balloonObject != null)
{
if (balloonObject.TryGetComponent(out BalloonBehavior balloon))
{
balloon.Pop();
}
}
}
}
}
}
}
Manipulation
概要
- Sharedモード
- 注視したら色が変わる
- つまむと掴める
実装ポイント
オブジェクトを注視すると色が変わる機能
- VisionOSHoverEffectコンポーネント
- PolySpatial Componentの1つ。対象のオブジェクトに付与する
- 目線を注視すると色が変わる。
- MeshRendererとColliderのComponentが必要
- 実装の中身は見れない (注視先の情報は取得できない)
ImageTracking
概要
- Exclusive/Unboundedモード
- 画像を認識したら、オブジェクトを生成し追従する
実装ポイント
- ARFoundationのARTracked Image ManagerでOK
- PolySpatial特有の実装はなし
MixedReality
概要
- Exclusive/Unboundedモード
- 壁や床を平面検出
- ハンドトラッキング
- ピンチしたらオブジェクト生成
実装ポイント
平面検知はARFoundation
- ARFoundationのARPlaneManagerコンポーネントを追加するだけ
ハンドトラッキングはXRHands
- 26個の関節のTransformを取得可能
- Sampleでは、親指のTipと人差し指のTipの距離を毎フレーム計算し、一定の距離以下ならObjectを生成する実装
https://docs.unity3d.com/Packages/com.unity.xr.hands@1.4/manual/hand-data/xr-hand-data-model.html
目線は取得できないけど、カメラの向きは取れる
- Cameraのpositionから、Cameraのforward方向にRayを生成する実装
[SerializeField]
Transform m_CameraTransform;
[SerializeField]
GameObject m_HeadPoseReticle;
GameObject m_SpawnedHeadPoseReticle;
RaycastHit m_HitInfo;
void Update()
{
if (Physics.Raycast(new Ray(m_CameraTransform.position, m_CameraTransform.forward), out m_HitInfo))
{
if (m_HitInfo.transform.TryGetComponent(out ARPlane plane))
{
m_SpawnedHeadPoseReticle.transform.SetPositionAndRotation(m_HitInfo.point, Quaternion.FromToRotation(m_SpawnedHeadPoseReticle.transform.up, m_HitInfo.normal));
}
}
}
まとめ
- Unity PolySpatialでは3種類のアプリパターンを開発できる
- ① Mixed Reality
- ② Virtual Reality - Fully Immersive
- ③ Windowed Apps
- Mixed Realityアプリは、Shared(Bounded)モードとExclusive(Unbounded)モードがあり、Exclusive(Unbounded)モードではARkitの機能が使用可能
- 機能開発については、XR汎用パッケージ
- ARFoundation
- Input System
- XR Hands
- を活用しつつ、visionOS固有の機能はPolySpatialを使用する
Discussion