Aracılığıyla paylaş


Unity'de yerel birlikte çalışma Karma Gerçeklik

Her Karma Gerçeklik uygulama, kamera verilerini almaya ve çerçeveleri işlemeye başlamadan önce bir HolographicSpace alır. Unity'de altyapı bu adımları sizin için üstlenir, Holographic nesnelerini işler ve işleme döngüsünün bir parçası olarak dahili olarak güncelleştirmeyi sağlar.

Ancak, gelişmiş senaryolarda HolographicCamera ve geçerli HolographicFrame gibi temel alınan yerel nesnelere erişmeniz gerekebilir.

WindowsMixedRealityUtilities

Ad Alanı: Microsoft.MixedReality.Toolkit.WindowsMixedReality
Tür: WindowsMixedRealityUtilities

MRTK, WindowsMixedRealityUtilities sınıfı aracılığıyla hem eski WSA hem de XR SDK'sı genelinde önceden hazırlanmış türler sağlar.

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

Yerel işaretçileri özetleme

Yukarıdaki yöntemlerden birinden (MRTK için gerekli değildir) öğesini aldıktan IntPtr sonra, yönetilen nesnelere sıralamak için aşağıdaki kod parçacıklarını kullanın.

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

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

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

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

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

Unity sol elle kullanılan bir koordinat sistemi kullanırken, Windows Algı API'leri sağ el koordinat sistemlerini 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 de aynı durumla ilgili neden olduğu durumlarda öngörülemeyen davranışlara ve işleme yapıtlarına neden olabilir. Örneğin, HolographicFrame.UpdateCurrentPrediction'ı çağırmamalısınız, aksi takdirde Unity'nin bu çerçeveyle oluşturduğu poz tahmini, Windows'un beklediği pozla eşitlenmemiş olur ve bu da hologram kararlılığını azaltır.

İşleme veya hata ayıklama amacıyla yerel arabirimlere erişmeniz gerekiyorsa, yerel eklentilerinizde veya C# kodunuzda HolographicFrameNativeData'daki verileri kullanın.

Burada, XR SDK uzantılarını kullanarak geçerli çerçevenin foton süresi tahminini almak için HolographicFrameNativeData'nın nasıl kullanılacağına ilişkin bir örnek 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: