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 の m を超える説明できる世界規模のアプリをビルドできます。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 での複合現実エクスペリエンスを構築する最初の手順を判断するためにはスケールが発生するアプリが対象です。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;

取り付けられているスケール エクスペリエンス、ユーザーに後で戻します取り付けられていない配信元を呼び出すことができます、 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. ユーザーの理解を使用して 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.

Floor レベルでの世界の座標系と Unity が動作しているためには、領域の種類を追跡 RoomScale に Unity を設定およびセットが成功したことを確認できます。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.
}
  • Unity が追跡するために、世界の座標系を正常に切り替え SetTrackingSpaceType が true を返す場合、ステージ座標系します。If SetTrackingSpaceType returns true, Unity has successfully switched its world coordinate system to track the stage frame of reference.
  • SetTrackingSpaceType 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.Experimental.XRNamespace: UnityEngine.Experimental.XR
種類: 境界Type: Boundary

スクリプトのコードでできますを TryGetGeometry メソッドを呼び出している、境界の多角形を取得する UnityEngine.Experimental.XR.Boundary 型 TrackedArea の境界の種類を指定します。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. ただし、この境界の多角形を使用して、ユーザーが teleporting せず、それらのオブジェクトを物理的に到達することを確認する、シーン オブジェクトをレイアウトすることができます。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

True の世界規模でユーザーが 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を GameObject に Unity コンポーネント。In Unity, you create a spatial anchor by adding the WorldAnchor Unity component to a GameObject.

世界のアンカーを追加します。Adding a World Anchor

世界のアンカーを追加するには、呼び出す 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

場合は不要になった、GameObject を現実世界の場所にロックして、このフレームを移動することを意図せず、世界のアンカー コンポーネントで破棄だけ呼び出すことができます。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>());

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

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

GameObject を固定する世界を移動Moving a World Anchored GameObject

GameObject は、世界アンカーが中に移動することはできません。GameObject's cannot be moved while a World Anchor is on it. このフレームの GameObject を移動する必要がある場合は、する必要があります。If you need to move the GameObject this frame, you need to:

  1. DestroyImmediate World アンカー コンポーネントDestroyImmediate the World Anchor component
  2. GameObject を移動します。Move the GameObject
  3. 新しい世界アンカー コンポーネントを GameObject に追加します。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. アンカーの場合は、このいけませんプロパティを設定する場合に true の例では、AddComponent() を返します。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. クリーンなパターンは、アンカーをアタッチした後はいけませんの初期状態で 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.

5 分間試して、Unity での共有エクスペリエンスの構築を開始、空間アンカー Unity の Azure クイック スタートします。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