今天接到一个项目要求使用blender将代理生成的NFT模型一万多个输出Glb放在网页上,由于代理生成的模型是逐帧变换的,所以我们得逐帧导出模型

分析一下首先第一步就是要通过贴图烘焙将上百个代理零部件做成一个材质贴图的文件,然后通过obj输出的动画选项,逐帧输出上万个模型,之后再使用Blender中的Python实现批量obj转glb

(这里面走了非常多弯路,放着blender的python不用,跑去追着GitHub上的Obj2Glb不放,搞半天由于墙的因素有两个包下载不下来,其次就是不了解这方面知识一堆错误)

如果像我这样有很多个这样的obj文件(成千上万个),需要转换为gltf格式

一种方法,通过cesium的node.js包也能转换 (这就是我走的弯路)

1
2
3
lecho off
for /r E:/obitogltf/obi2gltf/0B %%i in (*.obj) do node bin/obj2gltf.js -i %%i -o %%i
pause

但是转换出来的模型数据,有些模型面会出现破面的问题,所以下面通过blender来转换,而如果手动操作软件来转换,又太慢了,所以通过blender的python接口来转换,方便多了

objstogltfs.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import bpy
import pathlib
import os
import glob

# 创建文件夹
def createfolder(folderpath):
if os.path.exists(folderpath)==False:
os.makedirs(folderpath)
# 导出gltf文件
def exportgltf(objName):
name = os.path.basename(objName)[:-4]
filename = os.path.join(gltf_path, name)
bpy.ops.export_scene.gltf(filepath=filename + ".gltf", export_format="GLTF_EMBEDDED",export_lights=False, use_selection=True)

# 存放obj的文件夹路径
obj_path="E:/test"
bpy.ops.object.select_all(action = 'DESELECT')

# 遍历每个obj文件
for a in glob.glob(os.path.join(obj_path,'*.obj')):
# 导入obj文件
objname=os.path.basename(str(a))
bpy.ops.import_scene.obj(filepath=os.path.join(obj_path,str(a)))

# 新建gltf文件夹
gltf_path=os.path.join(obj_path,"gltf")
createfolder(gltf_path)

# 清除所有选择
objects = bpy.context.collection.objects
[obj.select_set(False) for obj in objects]

# 选择所有模型然后导出
[obj.select_set(True) for obj in objects]
exportgltf(objname)

# 删除所有模型
mesh_to_delete = []
for ob in bpy.context.selected_objects:
mesh_to_delete.append(ob.data)
bpy.ops.object.delete()
for me in mesh_to_delete:
bpy.data.meshes.remove(me)

我们发现至此则输出了gltf格式文件,还需要将该文件转换为glb格式
(我还差点跑去看gltf转glb格式的教程了,还好先冷静下来观察了一下代码)
通过观察可以知道,核心关键在 export_format=”GLTF_EMBEDDED”

将export_format里的格式改成“GLB”,此时导出的就是GLB文件了,同理其他格式应该也是如此