Python:2.7版本
Blender: 2.9版本
设想:一个目录文件夹下面有一个FBX文件和一张PNG或者JPEG的图片,通过Python脚本将FBX文件导入Blender,然后创建一个贴图节点的材质,修改模型的尺寸,中心点,最后导出为glb文件,也可以是gltf文件。
https://blog.csdn.net/zhangmei126/article/details/115119841
上面链接的帖子有外部Python通过cmd调用这个脚本,并传递参数的解释。
blender_export_glb.py
import os
import sys
import bpy
import json
import shutil
# 获取cmd参数.
data_path = str(sys.argv[-2]) # data_path为文件夹的路径.
asset_name = str(sys.argv[-1]) # asset_name为模型的名字.
scale_x = 1.0
scale_y = 1.0
scale_z = 1.0
# 获取目录下的png文件.
file_list = os.listdir(data_path)
png_list = [item for item in file_list if item.endswith('.png')]
png_name = png_list[0]
# 获取目录下的fbx文件.
fbx_list = [item for item in file_list if item.endswith('.FBX') or item.endswith('.fbx')]
for item in fbx_list:
fbx_path = os.path.join(data_path, item)
png_path = os.path.join(data_path, png_name)
# 导入fbx到Blender场景.
bpy.ops.import_scene.fbx(filepath=fbx_path)
# 清除场景中多余的组件.
bpy.data.objects.remove(bpy.data.objects['Camera'])
bpy.data.objects.remove(bpy.data.objects['Cube'])
bpy.data.objects.remove(bpy.data.objects['Light'])
# 修改Blender引擎设置.
bpy.context.scene.render.engine = 'CYCLES'
# 新建材质.
bpy.data.materials.new('mat')
mat=bpy.data.materials['mat']
# 设置材质.
mat.use_nodes = True
matnodes = mat.node_tree.nodes
matnodes.clear()
# 新建TextureImage节点,并绑定图片.
tex = matnodes.new(type='ShaderNodeTexImage')
tex.image = bpy.data.images.load(filepath=png_path)
# 设置Backgournd节点.
back = matnodes.new(type='ShaderNodeBackground')
# 设置材质输出节点.
out = matnodes.new(type='ShaderNodeOutputMaterial')
# 将各节点链接.
mat.node_tree.links.new(back.outputs['Background'], out.inputs['Surface'])
mat.node_tree.links.new(tex.outputs[0], back.inputs['Color'])
# 设置场景模型使用当前材质.
bpy.data.objects[asset_name].active_material = bpy.data.materials['mat']
# 设置场景模型尺寸,中心点,以及缩放等.
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY',center='BOUNDS')
bpy.data.objects[asset_name].location[0] = 0
bpy.data.objects[asset_name].location[1] = 0
bpy.data.objects[asset_name].location[2] = 0
bpy.data.objects[asset_name].scale[0] = scale_x
bpy.data.objects[asset_name].scale[1] = scale_y
bpy.data.objects[asset_name].scale[2] = scale_z
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
# 设置导出glb的路径,以及其他设置.
out_gltf_path = os.path.join(data_path, item.replace(".fbx",'_low.glb'))
bpy.ops.export_scene.gltf(export_format='GLB',filepath=out_gltf_path,export_image_format='JPEG',export_colors=False)
图片1:
红框中就是要清除的多余场景组件.
图片2:
红框:设置模型的中心点(我这选择的是模型边界)
黄框:创建的材质(包括TextureImage,Background,OutputMaterial节点)
蓝框:当前选择模型的尺寸,以及中心点位置