122.1K Views
October 11, 23
スライド概要
Oculus Integration V57以降を利用する方法です。
内容
・基本のVRアプリをBuilding Blocksで作成する手順
・Passthroughで表示
・Scene Managerでの現実空間のメッシュの利用
・Depth APIでオクルージョン表示
対応バージョンは下記のとおり
・Unity2022対応
・Integration 57対応
Meta Quest開発 -Interaction SDKの使い方-も参考にしてください。
META XR SDK(V57)でQUESTアプリを開発 BUILDING BLOCKS/SCENE MANAGER/DEPTH API
大久保 聡 Mail [email protected] Twitter @followapp
環境構築 環境設定については、PluginとProject Settingsの一部を入れていますが、細かな部分は解説されて いるHomeページがたくさんありますので省略します。 プロジェクトはURPで作成しています。 検証済みのバージョンの組み合わせは下記の通りです。 Unity 2022.3.10f1 Oculus Inetgration 57.0 Oculus XR Plugin 4.1.1/4.1.2
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
PLUGINのインポート① Oculus IntegrationをImportします。
PLUGINのインポート② Oculus IntegrationをImportします。
PLUGINのインポート③ Oculus IntegrationをImportします。 このプロジェクトのソースファイル の中に は、変 更され たAPIを参 照して いるも のがあ ります 。これ らは自 動的に 更新す るこ とができます。アップデートする前 に、プ ロジェ クトの バック アップ を取る ことを お勧め します 。これ らのフ ァイル をアッ プ デートしますか?
PLUGINのインポート④-1 Oculus XR PluginをUnity Registryからインポート。V4.1.1以降が表示されない場合は次ページを 参考にしてください。
PLUGINのインポート④-2 4.1以降で正式にQuest3対応されているので、パッケージマネージャーに4.1が無い場合はgit URLを 指定してインポートしてください。
PROJECT設定① Project Settingsを開き、XR Plug-in Managementの設定もいい感じに終わらせます。
プロジェクト設定② ターゲットデバイスを設定します。
OCULUS PROJECT SETUP TOOL Project SettingsのOculusにあるChecklistを確認し、Outstanding IssuesとRecommended Itemsを確認する。WindowsプラットフォームとAndroidプラットフォームの推奨項目をチェックし 対応します。
URP用マテリアルに変換 WindowからRender Pipeline Convertを開き Material Upgradeをチェックし、Initialize And Convertを押下します。 Convert Assetsを押下します。
BUILDING BLOCKSで基本のシーン作成 メニューからBuilding Blocksを開きます。
CAMERA RIGを配置する 頭の部分に相当するCamera RigをドラッグアンドドロップでHierarchyに配置します。
原点を床位置に設定する。 Camera Rigを選択し、OVR ManagerのOrigin TypeをFloor Levelに設定します。
HAND TRACKINGを配置する 手に相当するHand TrackingをドラッグアンドドロップでHierarchyに配置します。
SYNTHETIC HANDSを配置する Synthetic HandsをドラッグアンドドロップでHierarchyに配置します。
手でつかめるアイテムを配置する 手でつかめるアイテム、GrabbableをドラッグアンドドロップでHierarchyに配置します。 シーン上でGrabbable Itemを、つかみやすい位置に移動させます。
QUEST LINKでPCに接続し実行 USBケーブル(Air Link)でパソコンにQuestを接続します。 UnityのPlayボタンを押下し実行します。ハンドトラッキングで手が表示され、掴めるオブジェクトが 手でつかむことが確認できます。
コントローラーを使う場合 コントローラに相当するController TrackingをドラッグアンドドロップでHierarchyに配置します。
PASSTHROUGHをオリジナルのシーンに組み込む BUILDING BLOCKSを使う場合
CAMERA RIGを配置する 頭の部分に相当するCamera RigをドラッグアンドドロップでHierarchyに配置します。
パススルーを使う Background PassthroughをドラッグアンドドロップでHierarchyに配置します。
パススルーをOCULUS LINK経由で利用する場合 パソコンのOculusアプリの設定でOculus Link経由でのパススルーにチェックをいれる必要がありま す。
実行して確認する ビルドする場合は、QuestをUSBケーブルで接続しBuild And Runで実機で動作確認します。 Quest Linkを利用する場合は、USBでPCに接続(もしくはAir Link)しPlayを押下します。
PASSTHROUGHをオリジナルのシーンに組み込む
パススルーの設定 OVRCameraRigのOVRManagerコンポーネントで、Enable Passthroughにチェックします。 …
OVR PASSTHROUGH LAYERを追加 OVRCameraRigに、OVR Passthrough Layerコンポーネントを追加します。
OCULUS PC側の設定 パススルーをビルドせずUnity Editor上で確認する場合、Occulusアプリの設定を変更する必要があり ます。
OVR PASSTHROUGH LAYERの追加 カメラにOVR Passthrough Layerを追加し、PlacementをUnderlayに設定します。 CameraのSolid Colorを透明に設定にします。
参考:PLACEMENTについて OVR Passthrough LayerのPlacementは、表示順が下記の通りとなります。Overlayの場合は、CG が背面に回ってしまいますし、Underlayの時に背景があるとパススルーが表示されません。 パススルー CG 背景 Overlay CG 背景 パススルー Underlay
オーバーレイタイプの変更するときはこちら Placementの切り替えは、 overlayTypeを設定することで変更可能。 [SerializeField] private OVRPassthroughLayer passThroughLayer; passThroughLayer.overlayType = OVROverlay.OverlayType.None; passThroughLayer.overlayType = OVROverlay.OverlayType.Underlay; passThroughLayer.overlayType = OVROverlay.OverlayType.Overlay;
ビルドして実行 QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。 Unity Editor上で実行する場合は、オキュラスアプリのβ機能をオンにします。Quest LinkでPCに接 続しPlayを押下します。
パススルーのサンプルプログラム Oculus Integrationの中にサンプルプログラムが含まれています。面白い使い方したものもあり参考 になります。 Lighting : 懐中電灯のサンプル
PASSTHROUGHを動的に切り替える
動的にパススルーオン・オフの切り替え 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; }
ISINSIGHT PASSTHROUGH ENABLEの問題 isInsightPassthroughEnabledの切り替えで画面が固まる現象発生しました。その場合は textureOpacity を透明にして回避します。 visible = !visible; if (visible) { passThroughLayer.textureOpacity = 0; } else { passThroughLayer.textureOpacity = 1; }
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設定時の色が影響する
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; }
SCENE MANAGERを使う シーンモデルの利用
シーンの作成 Quesで設定したシーンモデル利用して、現実空間の形状に沿ったメッシュを取得するアプリを作成し ます。現実空間の壁に穴をあけたり、床にものを置いたりすることができるようになります。 新しいシーンで試します、Camera RigとBackground PassthroughをHierarchyにドラッグアンド ドロップします。
パーミッションの設定 [BB] Camera RigをHierarchyで選択し。OVR ManagerのScene Supprtを有効にします。
OVR SCENE MANAGERを追加 OVRSceneManagerを検索し、Hierarchyにドラッグアンドドロップします。
空間の表示用PREFABの設定 HierarchyのOVRSceneManagerを選択し、InspectorでPlaneとVolumeのPrefabを設定します。 表示用と非表示用のサンプルとなるPrefabが用意されているので、そちらを使います。 Assets/Oculus/SampleFramework/Usage/SceneManager/Prefabsから下記のように設定を行 います。 空間のメッシュを表示する場合 空間のメッシュを表示しない場合
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
INVISIBLE PLANE / INVISIBLE VOLUMEの中身 Prefabの中身は、OVR Scene AnchorとColliderだけのGame Objectです。 Invisible Volume Invisible Plane
ビルドして実行 QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。 下記は、現実世界の壁にメッシュが重なって表示されている様子です。ルーム設定で定義したセマン ティックタイプ(壁やテーブルなど)ごとにシーンアンカー(PlaneまたはVolume)が設置されています。
空間表示用のメッシュのオーバーライド Prefab Overridesで指定すれば、Questで設定したセマンティックタイプごとに表示するメッシュの 見た目を変更することができます。机や、壁、ベッドなどだけ別の見た目に変更することが可能です。
セマンティックタイプを調べる 準備で結果を表示するテキストを表示するキャンバスを用意します。CammeraRigの下の CenterEyeAnchorの下にCanvasとText(TextMeshPro)を配置します。
セマンティックタイプを調べる 空のGame Objectを作成し、名前をCheckSemanticTypeとします。 C# Scriptを作成、CheckSemanticTypeとします。
セマンティックタイプを調べる
作成した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;
}
}
セマンティックタイプを調べる CheckSemanticTypeに作成したスクリプトを追加します。 Controller Transformに、右手のアンカー、作成したTextを設定します。
ビルドして実行 QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。 右コントローラーで指し示した先のセマンティックタイプが表示されます。 ※OVRSceneManagerには、Invisible Volume / Invisible Planeを指定してもらうと全体に当たり判定(Colliderが設定さ れている)があるので、差し示しやすいです。
シーンアンカーを全部取得する
シーンマネージャが正常に読み込まれた場合(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))
{…
}
}
}
}
DEPTH APIを試す 空間の奥行情報の利用したオクルージョン
空間の奥行情報の利用 現実の空間での奥行情報を利用して、CGのオブジェクトの手前に現実のものがあった場合に、現実の ものの向こう側に隠す処理(オクルージョン)を行います。より現実と融合したオブジェクトの表示が可 能となり、MRアプリでの仮想と現実の溶け込み具合を向上させることが可能です。 深度(TOF)カメラのあるQuest3でのみ利用可能です。 パススールを使う場合GPU パフォーマンスが 17% 低く、CPU パフォーマンスが 14% 低くなりま す。Depth APIを利用するとさらにパフォーマンスが悪くなるので注意が必要です。 https://developer.oculus.com/blog/start-developing-Meta-Quest-3-tips-performance-mixed-reality/
ソフトとハードオクルージョン エッジが目立つハードオクルージョンと、GPUパワーをより使うソフトウェアオクルージョンがあり ます。 https://github.com/oculus-samples/Unity-DepthAPI
実験的機能の有効化 QuestをUSBケーブルで接続します。 コマンドプロンプトを起動し、下記コマンドを実行します。 adb shell setprop debug.oculus.experimentalEnabled
GITからソースを取得 コマンドプロンプトを開き下記にgitコマンドでサンプルソースを取得します。 git lfs install git clone https://github.com/oculus-samples/Unity-DepthAPI
UNITYプロジェクトを開く URP版のプロジェクトを開きます。Gitで取得したソースにある下記のパスをUnityで開きます。 \DepthAPI\Unity-DepthAPI\DepthAPI-URP OcclusionTogglerシーンを開きます。
プラットフォームの切替 Androidプラットフォームを選択肢、Switch Platformボタンを押下します。
ビルドして実行 QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。 実験的機能が利用可能に設定されていない場合、確認のダイアログが表示されますのでYes, enableを 選択します。
オクルージョンモードの切替え Aボタンを押下で、オクルージョン無し、ハードウェアオクルージョン、ソフトウェアオクルージョン を切り替えできます。 左コントローラーのStartボタンを押下するともう一つのシーンに切り替わります。 オクルージョンなし ハードウェアオクルージョン ソフトウェアオクルージョン
DEPTH APIをオリジナルのシーンに組み込む
オクルージョンの組み込み方 新しいシーンで試します、Camera RigとBackground PassthroughをHierarchyにドラッグアンド ドロップします。 Main Cameraを削除します。
DEPTH OCCLUSIONの追加 Packages/Depth API/Runtime/Core/Prefabsにある、EnvironmentDepthOcclusionをシーン に配置します。
OCCLUSION TYPEの設定 HierarchyのEnvironmentDepthOcclusionを選択し、InspectorでOcclusion Typeを指定します。
オクルージョン対象のオブジェクトの設定 シーン上に、手でさえぎれる位置にCubeを追加し配置します。 新規にマテリアルを作成します。作成したマテリアルのShaderをMeta/Depth/URP/Occlusion Lit を設定します。作成したCubeのマテリアルにこのマテリアルを設定します。
作成したシーンをビルドに組み込む Build Settingsを開き、ビルドに含めるシーンに作成したシーンを組み込みます。他のシーンにチェッ クが入っている場合、そのチェックを外します。
ビルドして実行 QuestをUSBケーブルで接続し、Build And Runで実機で動作確認します。現状、DepthはQuest3 かつ実機でしか取得できません。
OCCLUSION用のSHADERの補足 OcclusionのShaderは、CGの手前に物があった場合に透けるというShaderです。Occlusionの Shaderの後ろに、非OcclusionのShaderを配置すると、現実空間でCGの手前に物があった場合、そ こが透明になります。下記の場合はその部分に青色が表示されます。 Occlusion NonOculusion Shader Shader Underlay パススルー