【问题标题】:XNA Check if a 3D point is inside a model (fbx)XNA 检查 3D 点是否在模型内 (fbx)
【发布时间】:2013-01-23 16:55:56
【问题描述】:

我和我的朋友正在开发一台 3D 打印机。我们完成了硬件方面的工作,包括微控制器的编程。现在我们要分析现有的 3D 模型。 这包括一种检查特定坐标 (3d) 是否在我们要打印的 3D 模型(FBX 模型)内部或外部的方法。目前我们正在研究 Unity3D 和 XNA。我想出了我可以用边界框做什么,但这不是解决 XNA 问题的聪明方法。所以我的问题是有什么聪明的方法来获取这些信息。

非常感谢您的支持;-)

【问题讨论】:

  • 您确定 XNA 会有所帮助吗?我的意思是那里肯定有一些专门的 3D 打印软件。

标签: 3d xna coordinates point fbx


【解决方案1】:

算法

您正在寻找一种方法来确定一个点是否位于凹壳内。 这可以通过将Point in Polygon 算法扩展到三个维度来实现。

这个想法是您通过该点投射一条光线并计算与您的体积的外壳(多边形)的交点。如果点两侧的射线三角形交点的数量是奇数,则它位于体积内。

如果性能是一个问题,简化的包围体仍然很有用。如果计算光线-多边形交点的成本很高,您首先要检查该点是否位于网格的近似外壳内,这具有较低的性能成本(例如边界框、凸包)。这样你就可以尽早放弃积分。

这里是Point in Polygon算法的另一个详细解释和C语言的实现:

选择正确的编程环境

我不确定您究竟为什么要使用 XNA 甚至 Unity 来完成这项任务。当然,两者都提供加载 3D 模型的功能,但肯定有更简单、更高效的替代方案。

对于上述算法,您需要访问模型的顶点位置和三角形定义,仅此而已。如果不需要 FBX,我建议查看 Wavefront OBJ 文件格式。它是一种基于文本的格式,易于理解/解析,几乎所有专业 3D 建模应用程序都支持。

如果需要 FBX,您仍然可以尝试自己解析它们或只使用现有的 3D 转换器。

【讨论】:

  • 嗨卢修斯,感谢您的反馈。这非常有用,我将在接下来的几天尝试。 XNA 或 Unity 不是必需的,它是(如您所见)处理 3D 模型和使用 .NET 的简单方法。 FBX 也不是必须具备的文件格式。所以我和我的朋友也会检查你的任务的 OBJ 文件格式。再次感谢您;-)
【解决方案2】:

我会使用体素来完成这样的任务。您的 3D 打印机在所有轴上都有一定的分辨率,因此您可以为体素空间假设类似的分辨率。将体素场值转换为打印机运动相对容易,因此最难的是将网格转换为体素。我相信你可以找到一些图书馆。

您可以从这里开始: Know any voxel graphics C++ libraries?

【讨论】:

    【解决方案3】:

    一个非常快速的解决方案(绝对不需要数学)来测试一个点是否在一个实体(一组封闭的表面)内,就像您已经推测的那样使用 3D 游戏引擎。正如 Lucius 指出的那样,这有点像用起重机压碎苍蝇。但是,它会很容易地工作。

    为了确认这一点,我在使用 Panda3D 之前已经这样做了(如果可以使用任何 3D 引擎,我不会感到惊讶)。

    碰撞检测很有用。正如 Lucius 指出的那样,您想要检测表面。所以,使用 Panda 所说的“RayCollider”(基本上是一条线),看看它与 3D 模型表面相交的次数。 Panda 已经提供了执行此操作的辅助函数,并且在您下载 SDK 时,包含许多使用 RayColliders 检测表面的完整代码示例。

    然后,遍历所有 x,y,z 空间并使用 panda 辅助函数来移动射线的原点就很简单了。如果它与奇数个表面碰撞 - 你就在里面。否则,你就在外面。

    与 Panda3D 的完整代码示例相比,这项任务实际上非常简单。学习曲线主要用于熟悉引擎而不是数学。

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2013-04-25
      • 2014-09-21
      • 2016-03-26
      • 2012-09-05
      • 2014-09-11
      相关资源
      最近更新 更多