Unity での座標系Coordinate systems in Unity

Windows Mixed Reality は、大規模なエクスペリエンススケールのアプリをサポートしています。また、向きのみのアプリや、部屋規模のアプリによって配置されたアプリを拡張できます。Windows Mixed Reality supports apps across a wide range of experience scales, from orientation-only and seated-scale apps up through room-scale apps. HoloLens では、さらに一歩進めて、世界規模のアプリを構築できます。これにより、ユーザーは5メートルを超えて、ビルのフロア全体を調べることができます。On HoloLens, you can go further and build world-scale apps that let users walk beyond 5 meters, exploring an entire floor of a building and beyond.

Unity で mixed reality エクスペリエンスを構築するための最初の手順は、アプリが対象とするエクスペリエンススケールを決定することです。Your first step in building a mixed reality experience in Unity is to determine which experience scale your app will target.

向きのみまたは取り付けられたスケールエクスペリエンスの構築Building an orientation-only or seated-scale experience

名前空間: UnityEngine.XRNamespace: UnityEngine.XR
種類: XRDeviceType: XRDevice

向きのみまたは取り付けられたスケールエクスペリエンスを構築するには、Unity を固定の追跡領域の種類に設定する必要があります。To build an orientation-only or seated-scale experience, you must set Unity to the Stationary tracking space type. これにより、Unity のワールド座標系が、参照の静止フレームを追跡するように設定されます。This sets Unity's world coordinate system to track the stationary frame of reference. 静止の追跡モードでは、アプリの起動時に、カメラの既定の場所 (前方が Z) の直前にあるエディターに配置されたコンテンツがユーザーの前に表示されます。In the Stationary tracking mode, content placed in the editor just in front of the camera's default location (forward is -Z) will appear in front of the user when the app launches.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

名前空間: UnityEngine.XRNamespace: UnityEngine.XR
種類: InputTrackingType: InputTracking

360度のビデオビューアーのような純粋な向きのみのエクスペリエンス(位置指定更新によって錯覚が無駄になる) については、XR を設定できます。InputTracking。 disablePositionalTrackingを true にします。For a pure orientation-only experience such as a 360-degree video viewer (where positional head updates would ruin the illusion), you can then set XR.InputTracking.disablePositionalTracking to true:

InputTracking.disablePositionalTracking = true;

挿入された元の recenter を後で使用できるように、固定されたスケールエクスペリエンスの場合は、XR を呼び出すことができます。InputTracking. Recenterメソッド:For a seated-scale experience, to let the user later recenter the seated origin, you can call the XR.InputTracking.Recenter method:

InputTracking.Recenter();

大規模または部屋規模のエクスペリエンスを構築するBuilding a standing-scale or room-scale experience

名前空間: UnityEngine.XRNamespace: UnityEngine.XR
種類: XRDeviceType: XRDevice

大規模または部屋規模のエクスペリエンスを実現するには、フロアを基準としたコンテンツを配置する必要があります。For a standing-scale or room-scale experience, you'll need to place content relative to the floor. ユーザーが定義したフロアレベルのオリジンとオプションの部屋の境界を表す 空間ステージ を使用して、ユーザーのフロアについては、最初の実行時に設定します。You reason about the user's floor using the spatial stage, which represents the user's defined floor-level origin and optional room boundary, set up during first run.

Unity が世界の座標系をフロアレベルで運用していることを確認するには、Unity を RoomScale tracking space 型に設定し、セットが成功することを確認します。To ensure that Unity is operating with its world coordinate system at floor-level, you can set Unity to the RoomScale tracking space type, and ensure that the set succeeds:

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • Settrackingspace 型によって true が返された場合、Unity は、そのワールド座標系を正常に切り替えて、参照のステージフレームを追跡します。If SetTrackingSpaceType returns true, Unity has successfully switched its world coordinate system to track the stage frame of reference.
  • Settrackingspace 型から false が返された場合、Unity は参照のステージフレームに切り替えることができませんでした。ユーザーが環境にフロアを設定していない可能性があります。If SetTrackingSpaceType returns false, Unity was unable to switch to the stage frame of reference, likely because the user has not set up even a floor in their environment. これは一般的ではありませんが、別の部屋にステージが設定されていて、ユーザーが新しいステージを設定せずに現在の部屋にデバイスを移動した場合に発生する可能性があります。This is not common, but can happen if the stage was set up in a different room and the device was moved to the current room without the user setting up a new stage.

アプリで RoomScale の追跡領域の種類が正常に設定されると、y = 0 平面に配置されたコンテンツがフロア上に表示されます。Once your app successfully sets the RoomScale tracking space type, content placed on the y=0 plane will appear on the floor. (0, 0, 0) の原点は、部屋のセットアップ中にユーザーがそこしたフロア上の特定の場所になります。これは、セットアップ中に接続されていた前方方向を表す-Z です。The origin at (0, 0, 0) will be the specific place on the floor where the user stood during room setup, with -Z representing the forward direction they were facing during setup.

名前空間: UnityEngine. XRNamespace: UnityEngine.Experimental.XR
種類: 範囲Type: Boundary

スクリプトコードでは、TrackedArea の境界の種類を指定して、境界ポリゴンを取得するために、XR 型の TryGetGeometry メソッドを呼び出すことができます。In script code, you can then call the TryGetGeometry method on your the UnityEngine.Experimental.XR.Boundary type to get a boundary polygon, specifying a boundary type of TrackedArea. ユーザーが境界を定義している場合 (頂点の一覧を取得した場合)、ユーザーにルームスケールエクスペリエンスを提供するのが安全であることがわかっています。ユーザーは、作成したシーンを周囲に移動できます。If the user defined a boundary (you get back a list of vertices), you know it is safe to deliver a room-scale experience to the user, where they can walk around the scene you create.

ユーザーが境界を操作すると、境界が自動的に表示されることに注意してください。Note that the system will automatically render the boundary when the user approaches it. アプリでは、境界自体をレンダリングするためにこの多角形を使用する必要はありません。Your app does not need to use this polygon to render the boundary itself. ただし、この境界多角形を使用してシーンオブジェクトをレイアウトすることで、ユーザーがテレを使用して物理的にオブジェクトに接続できるようにすることができます。However, you may choose to lay out your scene objects using this boundary polygon, to ensure the user can physically reach those objects without teleporting:

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

世界規模でのエクスペリエンスの構築Building a world-scale experience

名前空間: UnityEngine.XR.WSANamespace: UnityEngine.XR.WSA
種類: WorldAnchorType: WorldAnchor

ユーザーが 5 m を超えることができるようにする HoloLens の真のワールドスケールエクスペリエンスでは、ルームスケールエクスペリエンスに使用されるもの以外の新しい手法が必要になります。For true world-scale experiences on HoloLens that let users wander beyond 5 meters, you'll need new techniques beyond those used for room-scale experiences. 使用する主な手法の1つとして、空間アンカーを作成して、ユーザーがローミングした距離に関係なく、物理的な場所にあるホログラムのクラスターを正確にロックし、後のセッションで再びそれらのホログラムを見つけることができます。One key technique you'll use is to create a spatial anchor to lock a cluster of holograms precisely in place in the physical world, regardless of how far the user has roamed, and then find those holograms again in later sessions.

Unity では、 WorldAnchor Unity コンポーネントをユーザーオブジェクトに追加することによって、空間アンカーを作成します。In Unity, you create a spatial anchor by adding the WorldAnchor Unity component to a GameObject.

ワールドアンカーの追加Adding a World Anchor

ワールドアンカーを追加するには、実際の世界で固定する変換を使用して、game オブジェクトで addcomponent () を呼び出します。To add a world anchor, call AddComponent() on the game object with the transform you want to anchor in the real world.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

これで完了です。That's it! このゲームオブジェクトは、物理的な世界の現在の場所に固定されるようになりました。物理的な配置を確保するために、Unity のワールド座標が少し時間をかけて若干調整されていることがわかります。This game object will now be anchored to its current location in the physical world - you may see its Unity world coordinates adjust slightly over time to ensure that physical alignment. この固定された場所を今後のアプリセッションで再び見つけるには、永続化を使用します。Use persistence to find this anchored location again in a future app session.

ワールドアンカーの削除Removing a World Anchor

他のユーザーが物理的な場所をロックし、このフレームを移動したくない場合は、ワールドアンカーコンポーネントで Destroy を呼び出すことができます。If you no longer want the GameObject locked to a physical world location and don't intend on moving it this frame, then you can just call Destroy on the World Anchor component.

Destroy(gameObject.GetComponent<WorldAnchor>());

このフレームを移動する場合は、代わりに DestroyImmediate を呼び出す必要があります。If you want to move the GameObject this frame, you need to call DestroyImmediate instead.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

ワールド固定のオブジェクトの移動Moving a World Anchored GameObject

ワールドアンカーがある間は、このオブジェクトを移動できません。GameObject's cannot be moved while a World Anchor is on it. このフレームを移動する必要がある場合は、次のことを行う必要があります。If you need to move the GameObject this frame, you need to:

  1. ワールドアンカーコンポーネントを直ちに破棄するDestroyImmediate the World Anchor component
  2. オブジェクトを移動するMove the GameObject
  3. 新しいワールドアンカーコンポーネントを、このオブジェクトに追加します。Add a new World Anchor component to the GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Locatability の変更の処理Handling Locatability Changes

WorldAnchor は、ある時点で物理的な世界では特定できないことがあります。A WorldAnchor may not be locatable in the physical world at a point in time. このような場合、Unity は、固定されたオブジェクトの変換を更新しません。If that occurs, Unity will not be updating the transform of the anchored object. これは、アプリの実行中にも変更される可能性があります。This also can change while an app is running. Locatability の変更を処理できないと、オブジェクトが世界の正しい物理的な場所に表示されません。Failure to handle the change in locatability will cause the object to not appear in the correct physical location in the world.

Locatability の変更について通知するには、次のようにします。To be notified about locatability changes:

  1. OnTrackingChanged イベントのサブスクライブSubscribe to the OnTrackingChanged event
  2. イベントを処理しますHandle the event

Ontrackingchangedイベントは、基になる空間アンカーが、状態が "可能" から "見つからない" の間で変化するたびに呼び出されます。The OnTrackingChanged event will be called whenever the underlying spatial anchor changes between a state of being locatable vs. not being locatable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

次に、イベントを処理します。Then handle the event:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

アンカーはすぐに配置されることがあります。Sometimes anchors are located immediately. この場合、addcomponent() がを返すと、アンカーのこの islocated プロパティは true に設定されます。In this case, this isLocated property of the anchor will be set to true when AddComponent() returns. その結果、OnTrackingChanged イベントはトリガーされません。As a result, the OnTrackingChanged event will not be triggered. クリーンパターンでは、アンカーをアタッチした後、最初の IsLocated 状態を使用して OnTrackingChanged ハンドラーを呼び出すことができます。A clean pattern would be to call your OnTrackingChanged handler with the initial IsLocated state after attaching an anchor.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

デバイス間でのアンカーの共有Sharing anchors across devices

Azure 空間アンカーを使用して、ローカル WorldAnchor から持続性のあるクラウドアンカーを作成できます。これにより、アプリは複数の HoloLens、IOS、Android デバイスで検索できます。You can use Azure Spatial Anchors to create a durable cloud anchor from a local WorldAnchor, which your app can then locate across multiple HoloLens, iOS and Android devices. 複数のデバイスで共通の空間アンカーを共有することにより、各ユーザーは、同じ物理的な場所でそのアンカーを基準としてレンダリングされたコンテンツを表示できます。By sharing a common spatial anchor across multiple devices, each user can see content rendered relative to that anchor in the same physical location. これにより、リアルタイム共有エクスペリエンスを実現できます。This allows for real-time shared experiences.

Unity で共有エクスペリエンスの構築を開始するには、5分間のAzure 空間アンカー unity クイックスタートをお試しください。To get started building shared experiences in Unity, try out the 5-minute Azure Spatial Anchors Unity quickstarts.

Azure 空間アンカーを使用して実行した後は、 Unity でアンカーを作成して見つけることができます。Once you're up and running with Azure Spatial Anchors, you can then create and locate anchors in Unity.

関連項目See Also