Unity 'de karma gerçeklik yerel birlikte çalışması

Her karma gerçeklik uygulaması, kamera verilerini almaya ve çerçeveleri işlemeye başlamadan önce bir HolographicSpace alır . Unity 'de, altyapı sizin için bu adımları ele alır, Holographic nesnelerini işleyebilir ve kendi oluşturma döngüsünün bir parçası olarak dahili olarak güncellerler.

Bununla birlikte, Gelişmiş senaryolarda, Holographiccamera ve geçerli holographicframegibi temel alınan yerel nesnelere erişim almanız gerekebilir.

WindowsMixedRealityUtilities

Ad alanı:Microsoft. Mixedreality. Toolkit. WindowsMixedReality
Yazın:windowsmixedrealityutilities

MRTK, Windowsmixedrealityutilities sınıfı aracılığıyla hem eski wsa hem de XR SDK genelinde zaten marshalled türleri sağlar.

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

Yerel işaretçilerin sıralaması kaldırılıyor

IntPtrYukarıdaki yöntemlerden birini aldıktan sonra (MRTK için gerekli değildir), bunları yönetilen nesneler için sıralamak üzere aşağıdaki kod parçacıklarını kullanın.

Microsoft. Windows kullanıyorsanız. MixedReality. Dotnetwınrt, yöntemini kullanarak yerel bir işaretçiden yönetilen bir nesne oluşturabilirsiniz :

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

Aksi takdirde, öğesini kullanın Marshal.GetObjectForIUnknown() ve istediğiniz türe dönüştürün:

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

Koordinat sistemleri arasında dönüştürme

Unity, bir sol taraf koordinat sistemi kullanır, Windows perception apı 'leri sağ elli koordinat sistemleri kullanır. Bu iki kural arasında dönüştürme yapmak için aşağıdaki yardımcıları kullanabilirsiniz:

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);
    }
}

HolographicFrame yerel verilerini kullanma

Not

HolographicFrameNativeData aracılığıyla alınan yerel nesnelerin durumunun değiştirilmesi, özellikle Unity 'nin aynı durum ile ilgili nedenlerle öngörülemeyen davranış ve işleme yapıtları oluşmasına neden olabilir. örneğin, holographicframe. updatecurrenttahmin ' i çağırmamalıdır, aksi takdirde Unity 'nin bu kareyle birlikte oluşturduğu poz tahmini, Windows beklediği pozlarla eşitlenmemiş ve bu da hologram kararlılığınıazaltacaktır.

Oluşturma veya hata ayıklama amacıyla yerel arabirimlere erişmeniz gerekiyorsa, yerel eklentilerinizde veya C# kodunuzda HolographicFrameNativeData verilerini kullanın.

XR SDK uzantılarını kullanarak, Photon saatine yönelik geçerli çerçevenin tahminini almak için HolographicFrameNativeData 'i nasıl kullanabileceğinizi gösteren bir örnek aşağıda verilmiştir.

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;
}

Ayrıca Bkz.