Microsoft SceneUnderstanding SDKとhololens2を使用してUnityシーンをプレーヤーの物理的な部屋に合わせるにはどうすればよいですか?[閉まっている]

Nov 20 2020

プレイヤーがHololens2のユニティシーンにロードすると、ユニティフロアプレーンが物理フロアと一致しません。hololens2とMRTKを使用すると、Unityシーンの原点はプレイヤーの頭が0,0,0にロックされます。

Microsoft SceneUnderstanding SDKを使用して、UnityScene環境のY位置を物理的な部屋の床に設定しようとしています。現在、フロアシーンオブジェクトにアクセスできますが、SpatialCoordinateSystem部分を実行しようとすると、.ToUnity()メソッドを使用して4x4マトリックスを変換できません。vector3 .ToUnity()呼び出しを.ToUnityVector3();に変更する必要がありました。しかし、私はマトリックスのための同様の方法を見つけることができません。

このドキュメントに記載されている.ToUnity()メソッドは非推奨ですか?何かへの参照がありませんか?(参考のために画像を参照してください)

この特定の問題、またはユニティシーンをHololens2ユーザーの物理的環境に合わせるという全体的な課題のいずれかで、ここでの支援に大いに感謝します。

私はここで提供される情報に従っています https://docs.microsoft.com/en-us/windows/mixed-reality/develop/platform-capabilities-and-apis/scene-understanding-sdk

回答

2 Hernando-MSFT Nov 23 2020 at 07:20

ドキュメントと比較すると、Valueプロパティを見逃しToUnity()、sceneToWorldオブジェクトで直接メソッドを呼び出しました。これが問題の原因である可能性があります。

var sceneToWorldUnity = sceneToWorld.ToUnity();

=>

var sceneToWorldUnity = sceneToWorld.Value.ToUnity();
1 NCarlson Nov 24 2020 at 15:57

Hernando-MSFTの提案は、不足しているToUnity()参照を私に役立てました。すべてのシーンホログラムを床に揃えるという課題はまだ残っていますが、これは進歩です!ヘルナンドありがとうございます!

基本的に、マトリックスデータにアクセスするために.valueを追加してから、この名前空間を実装する必要がありました。

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

また、実行時に剛体とコライダーを備えた立方体をドロップして、空間データフロアのY値を決定してみました。これは実際には比較的うまく機能しているように見えますが、間違いなく最も正確な解決策ではありません。