obj转binvox

由于实验需求,用到shapenet数据集,但原始的shapenet数据集只有obj格式的,我要的是把它变成任意分辨率的numpy数组,一个比较好的解决方法是用binvox.exe转化obj文件,把obj文件转化成binvox文件,再用python读进来numpy中。
在实践的过程中也非常简单,用到了一行命令:
binvox -c -d 64 model.obj

参数意义

其中-c意义不明,-d后面的参数代表要转化成多大分辨率的,后面是文件名,必须切换到文件所在的路径,我对windows批处理命令不太熟悉,所以都是切换到路径下执行的。

添加环境变量

还需要把binvox.exe文件和viewbinvox.exe文件所在的目录添加到环境变量中,很简单,加到系统变量的Path中就可以了,如果不这样的话就必须把这两个.exe文件移动到obj文件所在的目录,很麻烦。

批处理命令

要处理大量的数据集,还是要用到批处理命令,就用了这一句,回头再好好研究
for /r ShapeNetCore.v1/ %%i in (*.obj) do binvox -c -d 64 -cb %%i 其中的ShapeNetCore.v1是路径,后面的binvox命令前面已经讲解了。因为有\r的存在,所以会遍历去找所有的.obj文件,还支持off文件等格式的转化

问题

偶尔转化的模型会出现这样的情况:

obj文件可以直接打开,没有问题

开源obj转3dtiles obj转vox_obj格式转化

但是转化的binvox文件会有问题

开源obj转3dtiles obj转vox_数据集_02


全是0,就很不好,苦恼了很久

解决方法

把-c命令改成-e命令

开源obj转3dtiles obj转vox_批处理命令_03


这样就没有问题了。

修改后的binvox命令以及批处理命令

单个文件命令
binvox -e -d 64 model.obj 批处理命令
for /r ShapeNetCore.v2/ %%i in (*.obj) do binvox -e -d 64 -cb %%i 可以根据自己需要更改分辨率哦

-c 与-e文件的对比

开源obj转3dtiles obj转vox_binvox_04


右边是-e命令可视化效果

可以看到,其实-e文件更好一些,所以尽量使用-e命令吧

如果-c -e同时添加上的话,和只有-e效果是一样的本人还是对binvox不太熟悉,也没看懂-c -e的意义

开源obj转3dtiles obj转vox_批处理命令_05


后续补充:

-c 命令的含义是实例化出来的体素是实心的

-e 命令的含义是实例化出来的体素是空心的

两者并不相同,如果实在想要实心的体素,可以用下面这条命令

binvox -aw -dc -cb -d 64 model.obj 查看体素是实心还是空心的,需要打开命令行窗口,输入

viewvox -ki model.binvox

因为直接双击打开的话,默认是用空心的方式,即使你的体素是实心的,也只能看到空心的体素,所以要用ki命令限制一下

打开体素之后,按s就可以看切片,jk用来控制切片位置。

比如,这样就是空心的

开源obj转3dtiles obj转vox_开源obj转3dtiles_06


这样就是实心的

开源obj转3dtiles obj转vox_binvox_07

第一个是直接双击打开,第二是用-ki命令打开