XNA检查3D点是否在模型内(fbx)

时间:2013-01-23 16:55:57

标签: 3d xna coordinates point fbx

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

非常感谢您的支持;-)

3 个答案:

答案 0 :(得分:1)

算法

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

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

如果性能问题,简化的边界卷仍然有用。如果计算光线 - 多边形交叉点很昂贵,您首先要检查该点是否位于网格的近似船体内,其性能成本较低(例如,边界框,凸包)。这样你就可以提早丢弃积分。

以下是Point in Polygon算法的另一个详细说明以及C:

中的实现

选择正确的编程环境

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

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

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

答案 1 :(得分:0)

我会使用Voxels来完成这项任务。您的3D打印机沿所有轴都有一些分辨率,因此您可以为体素空间采用相似的分辨率。将体素场值转换为打印机移动将相对容易,因此最难的是将网格转换为体素。我相信你可以找到一些库。

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

答案 2 :(得分:0)

一个非常快速的解决方案(绝对不需要数学计算)来测试一个点是否在一个实体(封闭的一组曲面)内是使用你已经推测的3D游戏引擎。正如卢修斯所指出的,它有点像用起重机粉碎苍蝇。但是,它只需很少的努力即可。

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

碰撞检测是有用的。正如Lucius指出的那样,你想要检测表面。因此,使用Panda称之为“RayCollider”(基本上是一条线)的内容,并查看它与3D模型表面相交的次数。 Panda已经有了这样做的辅助功能,并且在下载SDK时,使用RayColliders检测表面有许多完整的代码示例。

然后,迭代所有x,y,z空间并使用熊猫辅助函数移动光线原点是一个直接的问题。如果它与奇数个表面碰撞 - 你就在里面。否则,你在外面。

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