【问题标题】:Get all triangles of a mesh within an object获取对象内网格的所有三角形
【发布时间】:2020-12-06 19:17:26
【问题描述】:

我想与通过 mrtk 访问的空间地图/网格进行交互。我想在光标位置实例化一个球体并获取球体内部空间网格的每个三角形,这样我就可以把它剪下来并为我保存。我知道如何实例化和定位球体,我知道如何通过场景理解 sdk 获得空间网格,但我不知道如何解决这个问题。为了更好地理解我想尝试什么,我画了一个小草图:

--编辑和解决方案--

  1. TriggerEnter & -Exit 获取碰撞对象
  2. 我的 Sphere/Cube/Whatever 具有来自 mrtk 的对象操作脚本,在放置我的任何对象后会触发 EndOfManipulation 事件。
  3. 获取所有网格过滤器和网格
  4. 通过collider.bounds.contains 检查点是否在我的对撞机内,并保存所有这些点以通过@Pluto 中的代码创建新网格。
  5. 将网格组合成一个网格并放置在某处

【问题讨论】:

    标签: unity3d spatial mesh mrtk


    【解决方案1】:
    • spatialMesh获取球内顶点的索引 -> indicesList
    • spatialMesh的三角形数组中得到所有顶点索引都在indicesList内的三角形->triangleList

    您拥有为球体内的网格构造顶点数组和三角形数组所需的一切。

    举个例子:

    for i = 0 to triangleList.Count
        newVertices[i] = spatialMesh.vertices[triangleList[i]];
        newTriangles[i] = i;
    

    【讨论】:

    • 好的,感谢您的回复。问题是我不知道如何检查顶点是否在我的球体内。如何确定点或三角形是否在对象内部。我发现的唯一内容是 this post 关于创建平面并检查点是否在平面上,但我想这不是正确的方法。
    • @Perazim 检查一个点是否在球体内非常容易。只是bool isInsideSphere = Vector3.Distance(point, sphereCenter) < sphereRadius。对于三角形,您只需要检查索引是否在indicesList 中,就像我在答案中所说的那样。
    • 哦,当然,你是对的。如果它不是一个球体,而是一个长方体或立方体,你知道如何实现吗?那么距离就不可能了。
    • @Perazim 如果它的轴对齐,这也是相当容易的。搜索 轴对齐边界框AABB。互联网/SO 上应该有关于此主题的资源,如果您没有找到您要查找的内容,您可以在 SO 上发布一个单独的问题。
    • 我在我的问题中添加了我的解决方案。再次感谢!
    猜你喜欢
    • 2012-06-19
    • 2014-04-07
    • 2019-05-12
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多