Как мне использовать Microsoft Scene Understanding SDK и hololens2, чтобы выровнять сцену Unity с физической комнатой игрока?

Изменить: это закрыто, потому что ему нужно больше деталей, но люди продолжают его голосовать. Так что я сделаю все возможное, чтобы добавить немного. Этот вопрос был плохо отформатирован, так как на самом деле было 2 вопроса. 1) Как исправить этот код из документации? 2) Как мне выровнять сцену единства с физическим пространством игрока?

Мне кажется, что №1 был сосредоточен на ответе, но №2 был вопросом заголовка. Мои основные проблемы заключались в том, что создаваемая сетка окклюзии была неровной / не плоской, из-за чего столкновения между голограммами и полом были очень шаткими. В итоге я создал базовое меню с голограммой куба перед игроком. Затем игроку было приказано опустить куб, пока он не сядет на пол равномерно. Затем я убедился, что все голограммы не опускаются ниже установленного значения, либо с помощью плоскостей столкновения, либо с помощью кода. Надеюсь, эта идея поможет кому угодно. Спасибо!

Когда игрок загружается в сцену единства в Hololens2, плоскость этажа единства не соответствует физическому полу. С hololens2 и MRTK происхождение сцены Unity привязано к голове игрока и имеет значение 0,0,0.

Я пытаюсь использовать Microsoft Scene Understanding SDK, чтобы установить положение Y среды Unity Scene на пол в физической комнате. В настоящее время я могу получить доступ к объекту сцены пола, но когда я пытаюсь выполнить часть 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

Фрагмент кода

Я попытался сделать предложение Эрнандо - MSFT

Использование


person NCarlson    schedule 20.11.2020    source источник
comment
Пожалуйста, не размещайте изображения кода / ошибок / данных. Вместо этого разместите код / ​​ошибки / данные как текст в блоке кода. См. Как мне задать хороший вопрос?   -  person Scratte    schedule 24.11.2020
comment
Спасибо за ваш вклад. Хорошего дня.   -  person NCarlson    schedule 24.11.2020


Ответы (2)


По сравнению с документация, вы пропустили свойство Value и вызвали метод ToUnity() непосредственно на объекте sceneToWorld. Это может быть причиной проблемы.

var sceneToWorldUnity = sceneToWorld.ToUnity();

=>

var sceneToWorldUnity = sceneToWorld.Value.ToUnity();
person Hernando - MSFT    schedule 23.11.2020
comment
Большое спасибо за помощь! Я пробовал это, но все еще не могу вызвать ToUnity (). Просмотрите мои изменения в сообщении. - person NCarlson; 23.11.2020
comment
Я заметил, что ваш список директив using не включает класс NumericsConversionExtensions, похоже, вы не добавляли этот вспомогательный класс в проект. Фактически, согласно документации, вы должны сначала добавить этот вспомогательный класс для преобразования между этими двумя соглашениями, вы можете использовать следующий код: Преобразование между системами координат. - person Hernando - MSFT; 24.11.2020
comment
Это сработало! Большое спасибо! - person NCarlson; 24.11.2020

Эрнандо - Предложения 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 пространственного уровня данных. На самом деле это работает относительно хорошо, но это определенно не самое точное решение.

person NCarlson    schedule 24.11.2020