【问题标题】:Finding the corner points in a spatial mesh在空间网格中查找角点
【发布时间】:2020-02-20 14:43:24
【问题描述】:

所以我一直在编写一些代码来从点云网格中获取地板。到目前为止,我已经获得了构成这个地板网格的三角形,但现在我想创建一个平面来覆盖这些点以表示一个平坦的地板。

Floor mesh

好的,只是为了让它更清楚一点。现在我有这个网格。 (三角形、顶点和法线)。我想创建一个平面或类似的东西来覆盖这个网格来代表地板(因为这个地板不像实际地板应该那样平坦)。

It should create 1 or multiple planes to cover the encapsulated area

我知道有一个库可以根据一些关键点计算一个区域应该是什么。因此,如果我能够从网格中获取例如这些点(见下文),它将创建以下对象(见下文)。这也会给我想要的结果。

below further below

如果有人以前做过类似的事情或知道如何解决这个问题,我将非常感激:)。

(我正在使用 Unity 和 C# 顺便说一句)

关于这个网格最后要注意的一点是,并不是所有的三角形都可以很好地相互连接。所以网格中间有一些点会突出一点。这使得检查三角形是否在角上变得更加困难。

【问题讨论】:

  • 当你说你试图“代表地板”时,你的意思是你试图用平面填充网格中的大洞?
  • 嗨@LLSv2.0,很抱歉造成混乱。由于这是由 HoloLens 的点云网格制成的,因此我希望能够使用 HoloLens 显示“新地板”。我现在能够从点云中提取地板网格,但由于噪声,它看起来并不像地板。我猜更像是由柏林噪声创建的区域?所以我想确实有一些东西来覆盖大洞,同时也覆盖这个网格的其他部分。我希望这能解释得更好一点?
  • 所以你想得到一个近似点云的完美平面?

标签: c# unity3d mesh hololens


【解决方案1】:

如果我正确理解了您的问题,您实际上可能在创建点云网格方面做了大量工作,但无论如何这很酷。

如果你想要的只是地板所在的平面,那么你所拥有的就是一个近似问题;可以根据您的实际需要简单或复杂。

最简单的路线: 你知道在这种情况下它是地板,所以你可以假设正常的 vec 是向上的(即Vector3.up),所以第 1 步是估计你的飞机的 z 坐标。最简单的方法是平均点云中所有或部分点的 z 坐标。

现在您需要找到平面角的 x 和 y 坐标。 绝对最简单的解决方案是假设大多数房间都是矩形的,您正在使用的房间也是如此。然后,您可以在任何方向(x 和 y 方向)上找到最远的点,并使用这些点创建一个矩形平面。

这当然不考虑地板的旋转(你可能站不起来看起来完全垂直于墙壁),这需要更多的思考。

【讨论】:

  • 是的,所以 x 和 y 是我猜的问题。我不知道我会有哪个轮换。只创建一个大方形平面确实更容易,尽管它也应该在不完全是矩形的房间中工作。我想如果飞机足够大,它最终会填满房间。如果我能得到网格的近似旋转,我会看看。如果我可以让它与 x 和 y 一起使用,我会将其标记为已解决
  • 为了获得优势,您可能需要研究寻找所谓“凸包”的算法。除了算法存在之外,我个人不能告诉你太多。我认为您的主要问题将是您拥有的点数,这可能使其操作缓慢。此外,凸包可能有点噪音,因此可能还需要一些平滑工作。让我们知道您的结果。
  • 现在我只搜索离中心最远的点,并在上面放置一个平面,覆盖所有点。它没有我想要的那么好,但现在它可以完成工作。如果我以后找到更精确的方法来检查地板可能是什么,我会在下面发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多