【问题标题】:Hololens Spatial mapping issueHololens 空间映射问题
【发布时间】:2016-08-16 13:35:13
【问题描述】:

在使用空间映射时,我在以下位置收到错误:

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

有什么想法吗?

【问题讨论】:

  • surfaces.Values是列表还是数组?
  • 无,表面是一个字典,而 Values 返回一个 ValueCollection 对象,因此很可能只是一个 ICollection。不过,问题并不来自这个对象。 SurfaceData 是一个包含 MeshFilter、WorldAnchor 和 MeshCollider 的结构。当观察者更新时它被填充,但由于某种原因它是空的。

标签: c# unity3d hololens


【解决方案1】:

引用MS site:

使用最新的网格渲染空间表面并(可选)使用 它用于物理碰撞和射线投射。确认这一点很重要 SurfaceData 的内容不为空。

这只是意味着您必须在调用并将其传递给Observer.RequestMeshAsync 函数之前检查smsd 是否为null

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

【讨论】:

  • smsd 是一个结构,因此它不能为空。空对象是结构中的网格引用。似乎这是一个糟糕的脚本设计,因为他们完全将其更改为新的实现。我认为我读到它有内存泄漏。
  • 我不知道SurfaceData 是一个结构。不过,如果您查看它的内部,您可能会找到网格数据。在将其传递给RequestMeshAsync 函数之前,您应该检查它是否是null,就像微软在他们的网站上所说的那样。我相信这应该可以解决问题。
  • 是的,这就是我所做的并且现在似乎可以工作。我读到的某个地方有一个帖子说 hololens 教程网站(我正在使用的那个)上的当前代码有点不工作并且已经更新,所以这听起来像是临时黑客。但会做快速演示。谢谢。找到链接后,我会更新您的答案。
  • Hololens 仍然是新的,API 大约有 6 个月的历史,所以我希望您会遇到更多问题。这很正常。当您遇到此类问题时,只需向 Microsoft 提交错误。您可能想去here 获取最新的示例代码。我在评论部分看到了一些关于 Bug 修复的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多