Meta XR SDK(V57)でQuestアプリを開発

106.5K Views

October 11, 23

スライド概要

Oculus Integration V57以降を利用する方法です。
内容
・基本のVRアプリをBuilding Blocksで作成する手順
・Passthroughで表示
・Scene Managerでの現実空間のメッシュの利用
・Depth APIでオクルージョン表示
対応バージョンは下記のとおり
・Unity2022対応
・Integration 57対応
Meta Quest開発 -Interaction SDKの使い方-も参考にしてください。

profile-image

XR(VR/AR)のエバンジェリスト。XR技術で世界を変えていきましょう。 https://majimajiwaroze.connpass.com/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

META XR SDK(V57)でQUESTアプリを開発 BUILDING BLOCKS/SCENE MANAGER/DEPTH API

2.

大久保 聡 Mail ovjang@gmail.com Twitter @followapp

3.

環境構築  環境設定については、PluginとProject Settingsの一部を入れていますが、細かな部分は解説されて いるHomeページがたくさんありますので省略します。  プロジェクトはURPで作成しています。  検証済みのバージョンの組み合わせは下記の通りです。  Unity 2022.3.10f1 Oculus Inetgration 57.0 Oculus XR Plugin 4.1.1/4.1.2

4.

META XR SDK(V59)について  Oculus Integrationは、今後Meta XR SDKに置き換わっていきます。そちらの導入方法は別資料に まとめています。そちらの資料も参考にしてください。 https://www.docswell.com/s/Ovjang/5Q846J-MetaXRSDK60 https://www.docswell.com/s/Ovjang/KLLYLG-MetaXRSDK62

5.

PLUGINのインポート①  Oculus IntegrationをImportします。

6.

PLUGINのインポート②  Oculus IntegrationをImportします。

7.

PLUGINのインポート③  Oculus IntegrationをImportします。 このプロジェクトのソースファイル の中に は、変 更され たAPIを参 照して いるも のがあ ります 。これ らは自 動的に 更新す るこ とができます。アップデートする前 に、プ ロジェ クトの バック アップ を取る ことを お勧め します 。これ らのフ ァイル をアッ プ デートしますか?

8.

PLUGINのインポート④-1  Oculus XR PluginをUnity Registryからインポート。V4.1.1以降が表示されない場合は次ページを 参考にしてください。

9.

PLUGINのインポート④-2  4.1以降で正式にQuest3対応されているので、パッケージマネージャーに4.1が無い場合はgit URLを 指定してインポートしてください。

10.

PROJECT設定①  Project Settingsを開き、XR Plug-in Managementの設定もいい感じに終わらせます。

11.

プロジェクト設定②  ターゲットデバイスを設定します。

12.

OCULUS PROJECT SETUP TOOL  Project SettingsのOculusにあるChecklistを確認し、Outstanding IssuesとRecommended Itemsを確認する。WindowsプラットフォームとAndroidプラットフォームの推奨項目をチェックし 対応します。

13.

URP用マテリアルに変換  WindowからRender Pipeline Convertを開き Material Upgradeをチェックし、Initialize And Convertを押下します。  Convert Assetsを押下します。

14.

BUILDING BLOCKSで基本のシーン作成  メニューからBuilding Blocksを開きます。

15.

CAMERA RIGを配置する  頭の部分に相当するCamera RigをドラッグアンドドロップでHierarchyに配置します。

16.

原点を床位置に設定する。  Camera Rigを選択し、OVR ManagerのOrigin TypeをFloor Levelに設定します。

17.

HAND TRACKINGを配置する  手に相当するHand TrackingをドラッグアンドドロップでHierarchyに配置します。

18.

SYNTHETIC HANDSを配置する  Synthetic HandsをドラッグアンドドロップでHierarchyに配置します。

19.

手でつかめるアイテムを配置する  手でつかめるアイテム、GrabbableをドラッグアンドドロップでHierarchyに配置します。  シーン上でGrabbable Itemを、つかみやすい位置に移動させます。

20.

QUEST LINKでPCに接続し実行  USBケーブル(Air Link)でパソコンにQuestを接続します。  UnityのPlayボタンを押下し実行します。ハンドトラッキングで手が表示され、掴めるオブジェクトが 手でつかむことが確認できます。

21.

コントローラーを使う場合  コントローラに相当するController TrackingをドラッグアンドドロップでHierarchyに配置します。

22.

PASSTHROUGHをオリジナルのシーンに組み込む BUILDING BLOCKSを使う場合

23.

CAMERA RIGを配置する  頭の部分に相当するCamera RigをドラッグアンドドロップでHierarchyに配置します。

24.

パススルーを使う  Background PassthroughをドラッグアンドドロップでHierarchyに配置します。

25.

パススルーをOCULUS LINK経由で利用する場合  パソコンのOculusアプリの設定でOculus Link経由でのパススルーにチェックをいれる必要がありま す。

26.

実行して確認する  ビルドする場合は、QuestをUSBケーブルで接続しBuild And Runで実機で動作確認します。  Quest Linkを利用する場合は、USBでPCに接続(もしくはAir Link)しPlayを押下します。

27.

PASSTHROUGHをオリジナルのシーンに組み込む

28.

パススルーの設定  OVRCameraRigのOVRManagerコンポーネントで、Enable Passthroughにチェックします。 …

29.

OVR PASSTHROUGH LAYERを追加  OVRCameraRigに、OVR Passthrough Layerコンポーネントを追加します。

30.

OCULUS PC側の設定  パススルーをビルドせずUnity Editor上で確認する場合、Occulusアプリの設定を変更する必要があり ます。

31.

OVR PASSTHROUGH LAYERの追加  カメラにOVR Passthrough Layerを追加し、PlacementをUnderlayに設定します。  CameraのSolid Colorを透明に設定にします。

32.

参考:PLACEMENTについて  OVR Passthrough LayerのPlacementは、表示順が下記の通りとなります。Overlayの場合は、CG が背面に回ってしまいますし、Underlayの時に背景があるとパススルーが表示されません。 パススルー CG 背景 Overlay CG 背景 パススルー Underlay

33.

オーバーレイタイプの変更するときはこちら  Placementの切り替えは、 overlayTypeを設定することで変更可能。 [SerializeField] private OVRPassthroughLayer passThroughLayer; passThroughLayer.overlayType = OVROverlay.OverlayType.None; passThroughLayer.overlayType = OVROverlay.OverlayType.Underlay; passThroughLayer.overlayType = OVROverlay.OverlayType.Overlay;

34.

ビルドして実行  QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。  Unity Editor上で実行する場合は、オキュラスアプリのβ機能をオンにします。Quest LinkでPCに接 続しPlayを押下します。

35.

パススルーのサンプルプログラム  Oculus Integrationの中にサンプルプログラムが含まれています。面白い使い方したものもあり参考 になります。 Lighting : 懐中電灯のサンプル

36.

PASSTHROUGHを動的に切り替える

37.

動的にパススルーオン・オフの切り替え Skybox / Fog / Postprocessingなどを利用しているProjectで、パススルーのオン・オフを切り替えま す。  isInsightPassthroughEnabledを切り替えるだけ  Fogも切っておく visible = !visible; [SerializeField] private Material sky; if (visible) // パススルーの切り替え { OVRManager.instance.isInsightPassthroughEnabled = true; RenderSettings.fog = falses; } else { OVRManager.instance.isInsightPassthroughEnabled = false; RenderSettings.fog = true; }

38.

ISINSIGHT PASSTHROUGH ENABLEの問題  isInsightPassthroughEnabledの切り替えで画面が固まる現象発生しました。その場合は textureOpacity を透明にして回避します。 visible = !visible; if (visible) { passThroughLayer.textureOpacity = 0; } else { passThroughLayer.textureOpacity = 1; }

39.

SKYBOX利用時のパススルーの問題  Placement の表示順によりSkyboxが透けません。Skyboxのマテリアルをnullに置き換えることで回 避します。 visible = !visible; if (visible) { passThroughLayer.textureOpacity = 0; RenderSettings.skybox = sky; } else { passThroughLayer.textureOpacity = 1; RenderSettings.skybox = null; }  Skybox利用時も、パススルー画面でSolidColorの影響を受ける問題がありました。その場合には Solid Colorの設定を黒(0,0,0,0:透明)にしてから、Skyboxの設定を選ぶことで回避します。 Skyboxにしているのに Solid Color設定時の色が影響する

40.

POST PROCESSING利用時のパススルーの問題  Post Processing利用時にパススルーが効かなくなります。  パススルー時には、ポストプロセスを切る設定をすることで回避します。 [SerializeField] private UniversalAdditionalCameraData cameraData; if (visible) { passThroughLayer.textureOpacity = 0; RenderSettings.skybox = sky; cameraData.renderPostProcessing = true; } else { passThroughLayer.textureOpacity = 1; RenderSettings.skybox = null; cameraData.renderPostProcessing = false; }

41.

SCENE MANAGERを使う シーンモデルの利用

42.

シーンの作成  Quesで設定したシーンモデル利用して、現実空間の形状に沿ったメッシュを取得するアプリを作成し ます。現実空間の壁に穴をあけたり、床にものを置いたりすることができるようになります。  新しいシーンで試します、Camera RigとBackground PassthroughをHierarchyにドラッグアンド ドロップします。

43.

パーミッションの設定  [BB] Camera RigをHierarchyで選択し。OVR ManagerのScene Supprtを有効にします。

44.

OVR SCENE MANAGERを追加  OVRSceneManagerを検索し、Hierarchyにドラッグアンドドロップします。

45.

空間の表示用PREFABの設定  HierarchyのOVRSceneManagerを選択し、InspectorでPlaneとVolumeのPrefabを設定します。 表示用と非表示用のサンプルとなるPrefabが用意されているので、そちらを使います。  Assets/Oculus/SampleFramework/Usage/SceneManager/Prefabsから下記のように設定を行 います。 空間のメッシュを表示する場合 空間のメッシュを表示しない場合

46.

PLANE / VOLUMEの中身  Volume Prefabの中身は、OVR Scene Anchor/OVR VolumeがついているGame Objectです。  Plane Prafabの中身は、 OVR Scene Anchor/Volume and Plane SwitcherがついているGame Objectです。どちらも1m×1m×1mのサイズでこれが基本形ですね。 Volume Plane

47.

INVISIBLE PLANE / INVISIBLE VOLUMEの中身  Prefabの中身は、OVR Scene AnchorとColliderだけのGame Objectです。 Invisible Volume Invisible Plane

48.

ビルドして実行  QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。 下記は、現実世界の壁にメッシュが重なって表示されている様子です。ルーム設定で定義したセマン ティックタイプ(壁やテーブルなど)ごとにシーンアンカー(PlaneまたはVolume)が設置されています。

49.

空間表示用のメッシュのオーバーライド  Prefab Overridesで指定すれば、Questで設定したセマンティックタイプごとに表示するメッシュの 見た目を変更することができます。机や、壁、ベッドなどだけ別の見た目に変更することが可能です。

50.

セマンティックタイプを調べる  準備で結果を表示するテキストを表示するキャンバスを用意します。CammeraRigの下の CenterEyeAnchorの下にCanvasとText(TextMeshPro)を配置します。

51.

セマンティックタイプを調べる  空のGame Objectを作成し、名前をCheckSemanticTypeとします。  C# Scriptを作成、CheckSemanticTypeとします。

52.
[beta]
セマンティックタイプを調べる
 作成したCheckSemanticTypeスクリプトを開きます。
using
using
using
using

System.Collections;
System.Collections.Generic;
TMPro;
UnityEngine;

void Update()
{
var position = controllerTransform.position;
var rotation = controllerTransform. rotation;

public class CheckSemanticType : MonoBehaviour
{
[SerializeField]
private Transform controllerTransform;

if (Physics.Raycast(new Ray(position, rotation * Vector3.forward), out raycastHit, 15))
{
GameObject objectHit = raycastHit.transform.gameObject;
OVRSemanticClassification semanticClassification =
objectHit?.GetComponentInParent<OVRSemanticClassification>();

[SerializeField]
private TextMeshProUGUI text = null;

if (semanticClassification != null && semanticClassification.Labels?.Count > 0)
{
text.text = semanticClassification.Labels[0];
} else
{
text.text = "";
}
} else
{
text.text = "";
}

private RaycastHit raycastHit;

}
}

53.

セマンティックタイプを調べる  CheckSemanticTypeに作成したスクリプトを追加します。  Controller Transformに、右手のアンカー、作成したTextを設定します。

54.

ビルドして実行  QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。  右コントローラーで指し示した先のセマンティックタイプが表示されます。 ※OVRSceneManagerには、Invisible Volume / Invisible Planeを指定してもらうと全体に当たり判定(Colliderが設定さ れている)があるので、差し示しやすいです。

55.
[beta]
シーンアンカーを全部取得する
 シーンマネージャが正常に読み込まれた場合(SceneModelLoadedSuccessfully)に、

SemanticClassificationを探します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetAllSceneModel : MonoBehaviour
{
[SerializeField]
private OVRSceneManager ovrSceneManager;
private void Awake()
{
ovrSceneManager.SceneModelLoadedSuccessfully += onAnchorsLoaded;
}

private void onAnchorsLoaded()
{
var classifications = FindObjectsByType<OVRSemanticClassification>(FindObjectsSortMode.None);
foreach (var classification in classifications)
{
// sceneAnchorの処理を記述
if (classification.Contains(OVRSceneManager.Classification.Floor))
{…
}
}
}
}

56.

DEPTH APIを試す 空間の奥行情報の利用したオクルージョン

57.

空間の奥行情報の利用  現実の空間での奥行情報を利用して、CGのオブジェクトの手前に現実のものがあった場合に、現実の ものの向こう側に隠す処理(オクルージョン)を行います。より現実と融合したオブジェクトの表示が可 能となり、MRアプリでの仮想と現実の溶け込み具合を向上させることが可能です。  深度(TOF)カメラのあるQuest3でのみ利用可能です。  パススールを使う場合GPU パフォーマンスが 17% 低く、CPU パフォーマンスが 14% 低くなりま す。Depth APIを利用するとさらにパフォーマンスが悪くなるので注意が必要です。 https://developer.oculus.com/blog/start-developing-Meta-Quest-3-tips-performance-mixed-reality/

58.

ソフトとハードオクルージョン  エッジが目立つハードオクルージョンと、GPUパワーをより使うソフトウェアオクルージョンがあり ます。 https://github.com/oculus-samples/Unity-DepthAPI

59.

実験的機能の有効化  QuestをUSBケーブルで接続します。  コマンドプロンプトを起動し、下記コマンドを実行します。 adb shell setprop debug.oculus.experimentalEnabled

60.

GITからソースを取得  コマンドプロンプトを開き下記にgitコマンドでサンプルソースを取得します。 git lfs install git clone https://github.com/oculus-samples/Unity-DepthAPI

61.

UNITYプロジェクトを開く  URP版のプロジェクトを開きます。Gitで取得したソースにある下記のパスをUnityで開きます。 \DepthAPI\Unity-DepthAPI\DepthAPI-URP  OcclusionTogglerシーンを開きます。

62.

プラットフォームの切替  Androidプラットフォームを選択肢、Switch Platformボタンを押下します。

63.

ビルドして実行  QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。 実験的機能が利用可能に設定されていない場合、確認のダイアログが表示されますのでYes, enableを 選択します。

64.

オクルージョンモードの切替え  Aボタンを押下で、オクルージョン無し、ハードウェアオクルージョン、ソフトウェアオクルージョン を切り替えできます。 左コントローラーのStartボタンを押下するともう一つのシーンに切り替わります。 オクルージョンなし ハードウェアオクルージョン ソフトウェアオクルージョン

65.

DEPTH APIをオリジナルのシーンに組み込む

66.

オクルージョンの組み込み方  新しいシーンで試します、Camera RigとBackground PassthroughをHierarchyにドラッグアンド ドロップします。  Main Cameraを削除します。

67.

DEPTH OCCLUSIONの追加  Packages/Depth API/Runtime/Core/Prefabsにある、EnvironmentDepthOcclusionをシーン に配置します。

68.

OCCLUSION TYPEの設定  HierarchyのEnvironmentDepthOcclusionを選択し、InspectorでOcclusion Typeを指定します。

69.

オクルージョン対象のオブジェクトの設定  シーン上に、手でさえぎれる位置にCubeを追加し配置します。  新規にマテリアルを作成します。作成したマテリアルのShaderをMeta/Depth/URP/Occlusion Lit を設定します。作成したCubeのマテリアルにこのマテリアルを設定します。

70.

作成したシーンをビルドに組み込む  Build Settingsを開き、ビルドに含めるシーンに作成したシーンを組み込みます。他のシーンにチェッ クが入っている場合、そのチェックを外します。

71.

ビルドして実行  QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。現状、DepthはQuest3 かつ実機でしか取得できません。

72.

OCCLUSION用のSHADERの補足  OcclusionのShaderは、CGの手前に物があった場合に透けるというShaderです。Occlusionの Shaderの後ろに、非OcclusionのShaderを配置すると、現実空間でCGの手前に物があった場合、そ こが透明になります。下記の場合はその部分に青色が表示されます。 Occlusion NonOculusion Shader Shader Underlay パススルー