0

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

非常感谢您的支持;-)

4

3 回答 3

1

算法

您正在寻找一种方法来确定一个点是否位于凹壳内。这可以通过将多边形中的点算法扩展到三个维度来完成。

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

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

这是Polygon算法的另一个详细解释和C中的实现:

选择正确的编程环境

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

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

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

于 2013-01-23T17:53:35.893 回答
0

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

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

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

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

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

于 2013-03-19T18:54:04.100 回答
0

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

您可以从这里开始: 知道任何体素图形 C++ 库吗?

于 2013-02-11T14:16:06.457 回答