Unity で混合の実際のネイティブ オブジェクトMixed Reality native objects in Unity

取得、HolographicSpaceはアプリがカメラのデータを受信して、レンダリングを開始する前にすべての複合現実のフレームします。Getting a HolographicSpace is what every Mixed Reality app does before it starts receiving camera data and rendering frames. Unity では、エンジンのこれらの手順 Holographic オブジェクトを処理して、レンダリング ループの一部として内部的に更新できます。In Unity, the engine takes care of those steps for you, handling Holographic objects and updates internally as part of its render loop.

ただし、高度なシナリオで必要があります、基になるネイティブ オブジェクトにアクセスするなど、 HolographicCameraと現在HolographicFrameします。However, in advanced scenarios you may need to get access to the underlying native objects, such as the HolographicCamera and current HolographicFrame. UnityEngine.XR.XRDeviceはどのようなネイティブ オブジェクトへのアクセスを提供します。UnityEngine.XR.XRDevice is what provides access to these native objects.

XRDeviceXRDevice

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

XRDeviceを使用して、基になるネイティブ オブジェクトへのアクセスを取得することができます、 GetNativePtrメソッド。The XRDevice type allows you to get access to underlying native objects using the GetNativePtr method. 異なるプラットフォーム間で異なります GetNativePtr が返されます。What GetNativePtr returns varies between different platforms. ユニバーサル Windows プラットフォームで、Windows Mixed Reality XR SDK を対象とする場合は、XRDevice.GetNativePtr は、次の構造へのポインター (IntPtr) を返します。On the Universal Windows Platform, when targeting the Windows Mixed Reality XR SDK, XRDevice.GetNativePtr returns a pointer (IntPtr) to the following structure:

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
struct HolographicFrameNativeData
{
    public uint VersionNumber;
    public uint MaxNumberOfCameras;
    public IntPtr ISpatialCoordinateSystemPtr; // Windows::Perception::Spatial::ISpatialCoordinateSystem
    public IntPtr IHolographicFramePtr; // Windows::Graphics::Holographic::IHolographicFrame 
    public IntPtr IHolographicCameraPtr; // // Windows::Graphics::Holographic::IHolographicCamera
}

Marshal.PtrToStructure メソッドを使用して HolographicFrameNativeData に変換することができます。You can convert it to HolographicFrameNativeData using Marshal.PtrToStructure method:

var nativePtr = UnityEngine.XR.XRDevice.GetNativePtr();
HolographicFrameNativeData hfd = Marshal.PtrToStructure<HolographicFrameNativeData>(nativePtr);

IHolographicCameraPtr IntPtr MaxNumberOfCameras を等しい長さの UnmanagedType.ByValArray としてマーシャ リングの配列ですIHolographicCameraPtr is an array of IntPtr marshaled as UnmanagedType.ByValArray with a length equal to MaxNumberOfCameras

HolographicFrameNativeData を使用します。Using HolographicFrameNativeData

注意

HolographicFrameNativeData 経由で受信したネイティブ オブジェクトの状態を変更することがあります予測不可能な動作とレンダリング アーティファクト、特に Unity は、同じ状態に関しても理由します。Changing the state of the native objects received via HolographicFrameNativeData may cause unpredictable behaviour and rendering artifacts, especially if Unity also reasons about that same state. たとえば、HolographicFrame.UpdateCurrentPrediction を呼び出す必要はありませんそうしないと同期して Windows を指定してください、姿勢が削減されます Unity は、そのフレームをレンダリングするポーズ予測になりますホログラム安定性For example, you should not call HolographicFrame.UpdateCurrentPrediction, or else the pose prediction that Unity renders with that frame will be out of sync with the pose that Windows is expecting, which will reduce hologram stability.

HolographicFrameNativeData からデータを使用するには、ネイティブ インターフェイスへのアクセスがレンダリングまたはデバッグのためのネイティブのプラグインで、必要な場合またはC#コード。You can use data from HolographicFrameNativeData when access to native interfaces is required for rendering or debugging purposes, in your native plugins or C# code.

Photon 時間の現在のフレームの予測を取得する HolographicFrameNativeData を使用する方法の例を示します。Here is an example of how you can use HolographicFrameNativeData to get the current frame's prediction for photon time.

using System;
using System.Runtime.InteropServices;

public static bool GetCurrentFrameDateTime(out DateTime frameDateTime)
{
#if (!UNITY_EDITOR && UNITY_WSA) || ENABLE_WINMD_SUPPORT
    IntPtr nativeStruct = UnityEngine.XR.XRDevice.GetNativePtr();

    if (nativeStruct != IntPtr.Zero)
    {
        HolographicFrameNativeData hfd = Marshal.PtrToStructure<HolographicFrameNativeData>(nativeStruct);

        if (hfd.IHolographicFramePtr != IntPtr.Zero)
        {
            var holographicFrame = (Windows.Graphics.Holographic.HolographicFrame)Marshal.GetObjectForIUnknown(hfd.IHolographicFramePtr);
            frameDateTime = holographicFrame.CurrentPrediction.Timestamp.TargetTime.DateTime;
            return true;
        }
    }

#endif

    frameDateTime = DateTime.MinValue;
    return false;
}

関連項目See Also