STL ファイルを動的に読み込んで、Oculus Quest で操作する
STL ファイルを動的に読み込んで、Qculus Quest で回転や移動をして眺められるようにします。
STL ファイルは pb_Stl を使用させていただき、Qculus Quest で回転や移動は MRTK (Mixed Reality Toolkit) を使用します。
STL ファイルはパソコンと接続した時に置けるようにするため、/sdcard/Android/data/[パッケージ名]/files/ から、STL ファイルを読み込みます。
環境
- Unity 2019.4.22f1
- pb_Stl 1.0.0
- Mixed Reality Toolkit Foundation 2.5.3
- Oculus Integration 25.0
- Oculus XR Plugin 1.8.1
Oculus Quest MRTK のセットアップ
-
プロジェクトの初期化と最初のアプリケーションの配置 - Mixed Reality | Microsoft Docs の [シーンを作成して構成する] までを手順通りに行い、Unity プロジェクトを作成します。
- [ビルド プラットフォームを切り替える] や [2.追加のプロジェクト設定を構成する] は必要ありませんが、記載を簡略化するために参照としています。
-
OculusQuestMRTK | Microsoft Docs の [Using the Oculus XR SDK Data Provider] までの手順通りに行い、Qculus Quest で MRTK を使用できるようにします。
- [Using the Oculus XR SDK Data Provider] の 2 では、[Device Manager Profile] に [OculusXRSDKDeviceManagerProfile] を設定します。
- [Ovr Camera Rig Prefab] と [Local Avatar Prefab] が [None (Game Object)] になっている場合は、[Mixed Reality Toolkit] > [Utilities] > [Oculus] > [Integrate Oculus Integration UnityModules] を再度実行します。
- [Using the Oculus XR SDK Data Provider] の 2 では、[Device Manager Profile] に [OculusXRSDKDeviceManagerProfile] を設定します。
pb_Stl のセットアップ
- pb_Stl の Install の手順通りに pb_Stl をインストールします。
STL ファイル読み込みスクリプトの追加
-
[Hierarchy] ウィンドウで [Create Empty] から空のオブジェクトを作成します。
-
名前を「RuntimeStlLoader」にします。
-
RuntimeStlLoader オブジェクトを選択した状態で、Inspector ウィンドウの [Add Component] から [C# Script] を追加します。
-
ファイル名を「RuntimeStlLoader」とします。
-
RuntimeStlLoader.cs のソースコードを下記のようにします。
RuntimeStlLoader.csusing Microsoft.MixedReality.Toolkit.UI; using Microsoft.MixedReality.Toolkit.UI.BoundsControl; using Microsoft.MixedReality.Toolkit.Utilities; using Parabox.Stl; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; public class RuntimeStlLoader : MonoBehaviour { [SerializeField] private Material material; private readonly List<GameObject> spawnedObjects = new List<GameObject>(); public void Load() { string stlPath = Directory.GetFiles(Application.persistentDataPath, "*.stl").FirstOrDefault(); if (string.IsNullOrEmpty(stlPath)) { Debug.LogError("Not found stl file."); return; } Mesh[] meshes = Importer.Import(stlPath); if (meshes.Length < 1) { return; } GameObject parentGameObject = new GameObject(); parentGameObject.transform.position = new Vector3(0, -0.6f, 2); foreach (Mesh mesh in meshes) { GameObject gameObject = new GameObject(); MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>(); meshFilter.mesh = mesh; MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>(); meshRenderer.material = material; gameObject.transform.parent = parentGameObject.gameObject.transform; } parentGameObject.AddComponent<BoundsControl>(); ObjectManipulator objectManipulator = parentGameObject.AddComponent<ObjectManipulator>(); objectManipulator.TwoHandedManipulationType = TransformFlags.Move | TransformFlags.Rotate; spawnedObjects.Add(parentGameObject); } public void Clear() { foreach (GameObject gameObject in spawnedObjects) { Destroy(gameObject); } } }
-
[Assets] ウィンドウで stl のオブジェクトに設定する任意の Material を作成します。
-
[Hierarchy] ウィンドウで RuntimeStlLoader オブジェクトを選択した状態で、Inspector ウィンドウの [RuntimeStlLoader] の [Material] に任意の Material を設定します。
スクリプトの呼び出しメニューを追加
-
[Project] ウィンドウで、 [Packages] > [Mixed Reality Toolkit Foundation] > [SDK] > [Features] > [UX] > [Prefabs] > [Menus] にある [NearMenu3x1] プレハブを [Hierarchy] ウィンドウにドラッグします。
-
オブジェクトの名前を「Menu」に変更します。
-
Menu オブジェクトの Position を X = 0、Y = 0.4、Z = 0 にします。
-
SolverHandler コンポーネントの [Tracked Target Type] を [Head] に設定します。
-
RadialView コンポーネントの横にあるチェックボックスをオンにして、既定で有効になるようにします。
-
Menu オブジェクトを展開し、[ButtonCollection] > [ButtonOne] 選択し、名前を「LoadStL」にします。
-
LoadStl オブジェクトを選択し、[Inspector] ウィンドウの [Button Config Helper] を下記のように変更します。
- [Main Label Text] を「Load STL」にします。
- [On Click ()] に RuntimeStlLoader オブジェクトをドラッグアンドドロップして、RuntimeStlLoader.Load を選択します。
- Icon は任意のアイコンを選択します。
-
[ButtonCollection] > [ButtonThree] 選択し、名前を「Clear」にします。
-
Clear オブジェクトを選択し、[Inspector] ウィンドウの [Button Config Helper] を下記のように変更します。
- [Main Label Text] を「Clear」にします。
- [On Click ()] に RuntimeStlLoader オブジェクトをドラッグアンドドロップして、RuntimeStlLoader.Clear を選択します。
- Icon は任意のアイコンを選択します。
実行
-
OculusQuestMRTK | Microsoft Docs の [Build and deploy your project to Oculus Quest] の [3. Change the deployment to Android] まで手順通りに行います。
-
[Edit] > [Project Settings...] を選択し、[Project Settings] ウィンドウを開きます。
-
[Player] > [Other Settings] > [Write Permission] を [External (SDCard)] に変更します。
- [Write Permission] を [External (SDCard)] にすることによって、Application.persistentDataPath の参照先が /data/data/ から /sdcard/Android/data/ に変わります。
- [Write Permission] を [External (SDCard)] にすることによって、Application.persistentDataPath の参照先が /data/data/ から /sdcard/Android/data/ に変わります。
-
OculusQuestMRTK | Microsoft Docs の [Build and deploy your project to Oculus Quest] の [4. Ensure that the Oculus Quest is selected as the applicable run device] 移行を行い実行します。
-
Oculus Quest と パソコンを接続し、/sdcard/Android/data/[パッケージ名]/files/ に任意の STL ファイルを置きます。
-
Menu オブジェクトの LoadStl を選択すると STL ファイルが読み込まれ表示されます。
トラブルシューティング
- Error building Player: BuildFailedException: Oculus Utilities Plugin with OpenXR only supports linear lighting. Please set 'Rendering/Color Space' to 'Linear' in Player Settings
- OpenXR を使用する予定はないので、下記の手順で OpenXR を無効化します。
- [Projects] ウィンドウで、[Assets] > [Oculus] > [VR] > [Plugins] > [プラグインバージョン] > [AndroidOpenXR] > [OVRPlugin] を選択します。
- [Inspector] ウィンドウで、[Android] のチェックを外します。
- [Projects] ウィンドウで、[Assets] > [Oculus] > [VR] > [Plugins] > [プラグインバージョン] > [AndroidUniversal] > [OVRPlugin] を選択します。
- [Inspector] ウィンドウで、[Android] にチェックをします。
- OpenXR を使用する予定はないので、下記の手順で OpenXR を無効化します。
Discussion