Mixed Reality natywnej międzyoptymacyjnie w a unity
Każda Mixed Reality otrzymuje przestrzeń HolographicSpace przed rozpoczęciem odbierania danych aparatu i renderowania ramek. Aparat Unity zajmuje się tymi krokami, obsługą obiektów Holographic i wewnętrznym aktualizowaniem w ramach pętli renderowania.
Jednak w zaawansowanych scenariuszach może być konieczne uzyskanie dostępu do podstawowych obiektów natywnych, takich jak HolographicCamera i bieżący obiekt HolographicFrame.
WindowsMixedRealityUtilities
Przestrzeń nazw:Microsoft.MixedReality.Toolkit.WindowsMixedReality
Type:WindowsMixedRealityUtilities
Zestaw MRTK udostępnia już rozsyłane typy w starszej wersji usług WSA i zestawu XR SDK za pośrednictwem klasy WindowsMixedRealityUtilities .
public static HolographicFrame CurrentHolographicFrame { get; }
public static SpatialCoordinateSystem SpatialCoordinateSystem { get; }
public static SpatialInteractionManager SpatialInteractionManager { get; }
Unmarshaling native pointers (Unmarshaling native pointers)
Po uzyskaniu obiektu z IntPtr
jednej z powyższych metod (nie jest to wymagane dla mrTK) użyj poniższych fragmentów kodu, aby zaa marshalować je do zarządzanych obiektów.
Jeśli używasz witryny Microsoft.Windows. MixedReality.DotNetWinRT można skonstruować zarządzany obiekt z natywnego wskaźnika przy użyciu FromNativePtr()
metody :
var worldOrigin = Microsoft.Windows.Perception.Spatial.SpatialCoordinateSystem.FromNativePtr(spatialCoordinateSystemPtr);
W przeciwnym razie użyj Marshal.GetObjectForIUnknown()
funkcji i rzutuj na typ, którego potrzebujesz:
#if ENABLE_WINMD_SUPPORT
var worldOrigin = Marshal.GetObjectForIUnknown(spatialCoordinateSystemPtr) as Windows.Perception.Spatial.SpatialCoordinateSystem;
#endif
Konwertowanie między systemami współrzędnych
Unity używa układu współrzędnych po lewej stronie, a interfejsy API percepcji Windows używają systemów współrzędnych po prawej stronie. Aby przekonwertować te dwie konwencje, można użyć następujących pomocników:
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);
}
}
Korzystanie z danych natywnych dla systemu HolographicFrame
Uwaga
Zmiana stanu obiektów natywnych odebranych za pośrednictwem obiektu HolographicFrameNativeData może spowodować nieprzewidywalne zachowanie i renderowanie artefaktów, zwłaszcza jeśli aparatu Unity również powoduje ten sam stan. Na przykład nie należy wywołać biblioteki HolographicFrame.UpdateCurrentPrediction. W innym przypadku przewidywanie, że aparat Unity renderuje tę ramkę, nie będzie zsynchronizowane z oczekiwaną postawą Windows, co zmniejszy stabilność hologramów.
Jeśli potrzebujesz dostępu do interfejsów natywnych na potrzeby renderowania lub debugowania, użyj danych z rozszerzenia HolographicFrameNativeData w natywnych wtyczkach lub kodzie C#.
Oto przykład użycia funkcji HolographicFrameNativeData w celu uzyskania przewidywania bieżącej ramki dla czasu fotonów przy użyciu rozszerzeń zestawu XR SDK.
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;
}