【问题标题】:Finding a fixed point in mesh on Microsoft HoloLens在 Microsoft HoloLens 上查找网格中的固定点
【发布时间】:2019-03-05 21:11:33
【问题描述】:

我一直试图在 HoloLens 应用程序(网格由 Microsoft HoloLens 生成)运行期间找到一个网格中的固定点重新启动应用程序后,我可以联系到,但没有成功。我的目标是在网格中找到一个固定点,当放置从上次应用程序运行保存的预制件时,我将与之相关。我将使用该点作为原点,将预制件放置在它们之前在网格中的位置,从而将它们显示在它们最初放置在网格中的位置。

我尝试执行以下操作,但结果不正确:

  • 保存 SpatialMapping GameObject 的 transofrm 组件的 LocalToWorld / WorldToLocal Unity4x4 矩阵,并对预制件的位置执行 Matrix4x4.MulitplyPoint()
  • 转换预制件相对于生成网格的局部中心的位置
  • 相对于第一个子网格的局部中心转换预制件的位置

请注意,一旦我放置了预制件,即使在以后的应用程序运行中,我不会更改网格(禁用空间表面的更新)。

唯一的限制是我不能使用 WorldAnchors,因为我需要能够在 MixedReality 应用程序之外(特别是在 WebGL 应用程序中)编辑这些预制件的位置strong>),然后将它们显示在网格中 HoloLens 应用程序中正确编辑的位置。

【问题讨论】:

  • 这个网格是由物理空间中的对象构成的吗?如果不是,则无法在两个会话之间找到转换。我从未使用过 Hololens,但我假设每次运行应用程序时它都会更改其坐标系。因此,您需要在两个会话中都通用的东西,例如标记。然后,您可以将相对于该标记的对象放置在本地空间中。
  • 是的,@Ali Kanat,网格是由物理空间中的对象构成的 - 它是由 HoloLens 扫描的房间/大厅。如您所说,坐标系的原点在每个应用程序运行的相机(用户)位置上定义。做一个标记(或者通常是会话之间的一个共同点)会起作用,但正如我所说,我找不到这样一个固定点。
  • 那么您可以将标记用作固定点。您可以在标记位置和旋转处创建一个空的游戏对象,并将您的模型作为子模型放置。您唯一需要注意的是模型的枢轴点。如果您想要一个更好的解决方案,您可以使用标记上的公共点计算两个会话之间的转换矩阵(比如说标记的角)然后使用Matrix4x4.MultiplyPoint() 转换每个点。我更喜欢第二种选择,因为您可以使用它扫描、创建模型并在运行时对其进行转换。
  • 标记是什么意思以及如何找到标记的位置?问题是 HoloLens 在运行时没有将模型(扫描的网格)保存为一个整体。相反,SpatialMappingSource 包含 SurfaceObjects 的列表,并且每个都有与之关联的网格,因此它们一起形成了模型。
  • 据我所知,您可以在 Hololens 中使用标记。因此,您必须将标记放置在您扫描位置的墙壁或任何表面上。然后在另一个应用程序或另一个场景中,你走到那个标记检测它或跟踪它,但它在 Hololens 中工作,计算转换,然后实例化模型。然后平移和旋转网格。您可以通过两种方式执行此操作,您可以平移网格中的顶点,也可以平移和旋转整个 3D 模型。不过,在选项二中要小心枢轴。使用marker的原因是在扫描和显示模型部分有共同点

标签: unity3d mesh hololens unity-webgl windows-mixed-reality


【解决方案1】:

这正是一个锚定任务。网格中没有固定点。

  1. 您需要在世界中放置锚点。然后获取GetNativeSpatialAnchorPtr
  2. SpatialAnchor 有 TryCreateRelativeTo() 方法。使用它来创建编辑位置。
  3. 从编辑的位置分配 SetNativeSpatialAnchorPtr()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多