如何将3D .obj对象表示为3D数组?

时间:2016-06-18 10:46:27

标签: python c++ arrays opencv 3d

有什么方法可以将3D模型表示为3D阵列?是否有任何库将.obj或.blend文件作为输入并给出相同的数组表示?

我以为我会切片对象并将切片导出到图像中。然后我会在opencv中使用这些图像为每个切片构建数组。最后,我将组合所有切片的所有数组,最终获得我的.obj文件的3D数组表示。但是我放弃了一半,因为让图像切片彼此对齐是一个痛苦的漫长过程。

我可以使用其他基于索引的表示来代表代码中的3D模型吗?

3D阵列对我来说非常方便。

3 个答案:

答案 0 :(得分:2)

Binvox可用于从 .obj 文件生成3D模型的体素表示。

Binvox-rw-py可用于读取和解析上面生成的 .binvox 文件。

这是我以前用来获得一个numpy数组的东西:

>>> import binvox_rw
>>> with open("chair.binvox","rb") as f:
...   ml = binvox_rw.read_as_3d_array(f)
... 
>>> type(ml.data)
<type 'numpy.ndarray'>
>>> ml.data.shape
(32, 32, 32)

答案 1 :(得分:1)

PyGame有一个OBJFileLoader类。 PyWavefront有一个3D对象模型。

答案 2 :(得分:1)

如果我理解正确,您想要创建3D模型的体素表示吗?像可见的人类显示器?

我会使用上面推荐的一个OBJ文件加载器将模型导入OpenGL程序。旋转并缩放到XYZ所需的任何对齐方式。

然后使用片段着色器绘制对象,该片段着色器丢弃任何Z <0的像素。 0.001或Z> = 0.002(或任何分辨率起作用 - 我只是试图解释该方法)。这将为您提供存储或保存的第一个图像切片。这次清除并再次绘制,丢弃Z&lt; 0.002或Z&gt; = 0.003 ...因为它在同一位置是相同的模型,所有切片都将对齐。

但是,您是否知道OBJ(以及几乎所有其他3D格式)都是表面描述,而不是实体?它们像折纸模型一样在里面凹陷。因此,您的3D数组表示将基本为空。

希望这有帮助。