Проблема с пространственным отображением Hololens

При использовании пространственного картирования я получаю сообщение об ошибке:

void Update()
{
    if (mappingEnabled)
    {
        foreach (GameObject surface in surfaces.Values)
        {
            surface.GetComponent<MeshRenderer>().enabled = DrawVisualMeshes;
        }

        if (surfaceWorkOutstanding == false && surfaceDataQueue.Count > 0)
        {
            SurfaceData smsd = surfaceDataQueue.Dequeue();
            surfaceWorkOutstanding = Observer.RequestMeshAsync(smsd, Observer_OnDataReady);
        }
    }
}

Последняя строка получает исключение ArgumentNullException. Код является частью руководств по hololens, поэтому там нет ничего моего.

Авария происходит, даже если я не делаю никаких действий, а просто смотрю по сторонам.

Аргумент null находится внутри структуры smsd;

-       $exception  {"Value cannot be null.\r\nParameter name: dataRequest.outputMesh"} System.ArgumentNullException

Любые идеи?


person Everts    schedule 16.08.2016    source источник
comment
Является ли surfaces.Values списком или массивом?   -  person Programmer    schedule 16.08.2016
comment
Нет, surfaces — это словарь, а Values ​​возвращает объект ValueCollection, поэтому, скорее всего, просто ICollection. Тем не менее, проблема не исходит от этого объекта. SurfaceData — это структура, содержащая MeshFilter, WorldAnchor и MeshCollider. Он заполняется при обновлении наблюдателя, но по какой-то причине он равен нулю.   -  person Everts    schedule 16.08.2016


Ответы (1)


Цитата с сайта MS:

Визуализируйте пространственную поверхность с последней сеткой и (необязательно) используйте ее для физических столкновений и рейкастов. Важно подтвердить, что содержимое SurfaceData не равно нулю.

Это просто означает, что вы должны проверить, является ли smsd null перед вызовом и передачей его в функцию Observer.RequestMeshAsync.

if (mappingEnabled)
    {
        foreach (GameObject surface in surfaces.Values)
        {
            surface.GetComponent<MeshRenderer>().enabled = DrawVisualMeshes;
        }

        if (surfaceWorkOutstanding == false && surfaceDataQueue.Count > 0)
        {
            SurfaceData smsd = surfaceDataQueue.Dequeue();
            if (smsd.outputMesh == null || smsd.outputCollider == null || smsd.outputAnchor == null) { return; }
            {
                surfaceWorkOutstanding = Observer.RequestMeshAsync(smsd, Observer_OnDataReady);
            }
        }
    }
person Programmer    schedule 17.08.2016
comment
smsd — это структура, поэтому она не может быть нулевой. Нулевой объект является ссылкой на сетку внутри структуры. Кажется, это плохой дизайн сценария, поскольку они полностью изменили его на новую реализацию. Думаю, я читал, что у него утечка памяти. - person Everts; 17.08.2016
comment
Я не знал, что SurfaceData это структура. Тем не менее, если вы заглянете внутрь, вы, скорее всего, найдете данные сетки. Вы должны проверить, является ли это null, как Microsoft сказал на своем сайте, прежде чем передавать его в функцию RequestMeshAsync. Я считаю, что это должно решить проблему. - person Programmer; 17.08.2016
comment
да, это то, что я сделал и, кажется, работает на данный момент. Где-то я читал ветку, в которой говорилось, что текущий код на учебном веб-сайте hololens (тот, который я использую) не работает и был обновлен, так что это звучит как временный взлом. Но сойдет для быстрой демонстрации. Спасибо. Я обновлю ваш ответ, когда найду ссылку. - person Everts; 17.08.2016
comment
Hololens все еще новый, а API уже около 6 месяцев, поэтому я ожидаю, что вы столкнетесь с новыми проблемами. Это нормально. Просто сообщите об ошибке в Microsoft, когда столкнетесь с подобными проблемами. Вы можете перейти здесь для получения последнего примера кода. Я видел что-то об исправлениях ошибок в разделе комментариев. - person Programmer; 17.08.2016