Mixed Reality native interop in Unity

Elke Mixed Reality app ontvangt een HolographicSpace voordat deze cameragegevens en renderingframes begint te ontvangen. In Unity zorgt de engine voor deze stappen, die Holographic-objecten verwerken en intern bijwerken als onderdeel van de renderlus.

In geavanceerde scenario's moet u echter mogelijk toegang krijgen tot de onderliggende systeemeigen objecten, zoals de HolographicCamera en het huidige HolographicFrame.

WindowsMixedRealityUtilities

Naamruimte: Microsoft.MixedReality.Toolkit. WindowsMixedReality
Type: WindowsMixedRealityUtilities

MRTK biedt al gedringeerde typen voor zowel verouderde WSA als XR SDK via de klasse WindowsMixedRealityUtilities.

public static HolographicFrame CurrentHolographicFrame { get; }
public static SpatialCoordinateSystem SpatialCoordinateSystem { get; }
public static SpatialInteractionManager SpatialInteractionManager { get; }

Overzicht van native aanwijzers

Nadat u de hebt ontvangen van een van de bovenstaande methoden (niet nodig voor MRTK), gebruikt u de volgende codefragmenten om ze te vereendigen IntPtr naar beheerde objecten.

Als u Microsoft.Windows. MixedReality.DotNetWinRTkunt u een beheerd object maken op basis van een native aanwijzer met behulp van de FromNativePtr() methode :

var worldOrigin = Microsoft.Windows.Perception.Spatial.SpatialCoordinateSystem.FromNativePtr(spatialCoordinateSystemPtr);

Anders gebruikt u Marshal.GetObjectForIUnknown() en cast u naar het type dat u wilt:

#if ENABLE_WINMD_SUPPORT
var worldOrigin = Marshal.GetObjectForIUnknown(spatialCoordinateSystemPtr) as Windows.Perception.Spatial.SpatialCoordinateSystem;
#endif

Converteren tussen co├Ârdinatensystemen

Unity maakt gebruik van een linkshandig co├Ârdinaatsysteem, terwijl Windows Perception-API's rechtshandige co├Ârdinaatsystemen gebruiken. Als u wilt converteren tussen deze twee conventies, kunt u de volgende helpers gebruiken:

namespace NumericsConversion
{
    public static class NumericsConversionExtensions
    {
        public static UnityEngine.Vector3 ToUnity(this System.Numerics.Vector3 v) => new UnityEngine.Vector3(v.X, v.Y, -v.Z);
        public static UnityEngine.Quaternion ToUnity(this System.Numerics.Quaternion q) => new UnityEngine.Quaternion(q.X, q.Y, -q.Z, -q.W);
        public static UnityEngine.Matrix4x4 ToUnity(this System.Numerics.Matrix4x4 m) => new UnityEngine.Matrix4x4(
            new Vector4( m.M11,  m.M12, -m.M13,  m.M14),
            new Vector4( m.M21,  m.M22, -m.M23,  m.M24),
            new Vector4(-m.M31, -m.M32,  m.M33, -m.M34),
            new Vector4( m.M41,  m.M42, -m.M43,  m.M44));

        public static System.Numerics.Vector3 ToSystem(this UnityEngine.Vector3 v) => new System.Numerics.Vector3(v.x, v.y, -v.z);
        public static System.Numerics.Quaternion ToSystem(this UnityEngine.Quaternion q) => new System.Numerics.Quaternion(q.x, q.y, -q.z, -q.w);
        public static System.Numerics.Matrix4x4 ToSystem(this UnityEngine.Matrix4x4 m) => new System.Numerics.Matrix4x4(
            m.m00,  m.m10, -m.m20,  m.m30,
            m.m01,  m.m11, -m.m21,  m.m31,
           -m.m02, -m.m12,  m.m22, -m.m32,
            m.m03,  m.m13, -m.m23,  m.m33);
    }
}

Native HolographicFrame-gegevens gebruiken

Notitie

Het wijzigen van de status van de native objecten die worden ontvangen via HolographicFrameNativeData kan onvoorspelbaar gedrag en renderingartefacten veroorzaken, met name als Unity ook redenen heeft voor diezelfde status. U moet bijvoorbeeld HolographicFrame.UpdateCurrentPrediction niet aanroepen, anders is de voorspelling van de houding die Unity met dat frame wekt, niet meer gesynchroniseerd met de houding die Windows verwacht, waardoor de stabiliteit van hologrammenwordt verkleind.

Als u toegang nodig hebt tot native interfaces voor rendering- of foutopsporingsdoeleinden, gebruikt u gegevens van HolographicFrameNativeData in uw native invoegingen of C#-code.

Hier is een voorbeeld van hoe u HolographicFrameNativeData kunt gebruiken om de voorspelling van het huidige frame voor fotontijd op te halen met behulp van de XR SDK-extensies.

using System;
using System.Runtime.InteropServices;

public static bool GetCurrentFrameDateTime(out DateTime frameDateTime)
{
#if ENABLE_WINMD_SUPPORT
    IntPtr holographicFramePtr = UnityEngine.XR.WindowsMR.WindowsMREnvironment.CurrentHolographicRenderFrame;

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

    frameDateTime = DateTime.MinValue;
    return false;
}

Zie ook