File size: 1,803 Bytes
cf8a54e | 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 45 46 47 48 49 50 51 52 53 54 55 | """Blender script: load a mesh, replace its base colour with a baked texture, export GLB.
blender -b -P tools/apply_texture.py -- --mesh in.glb --texture texture.png --out out.glb
"""
import argparse
import os
import sys
import bpy
def parse():
argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
ap = argparse.ArgumentParser()
ap.add_argument("--mesh", required=True)
ap.add_argument("--texture", required=True)
ap.add_argument("--out", required=True)
return ap.parse_args(argv)
def main():
args = parse()
bpy.ops.wm.read_factory_settings(use_empty=True)
ext = os.path.splitext(args.mesh)[1].lower()
if ext in (".glb", ".gltf"):
bpy.ops.import_scene.gltf(filepath=args.mesh)
elif ext == ".obj":
bpy.ops.wm.obj_import(filepath=args.mesh)
elif ext == ".fbx":
bpy.ops.import_scene.fbx(filepath=args.mesh)
else:
raise SystemExit(f"unsupported {ext}")
image = bpy.data.images.load(os.path.abspath(args.texture))
image.pack()
mat = bpy.data.materials.new("ultratex_albedo")
mat.use_nodes = True
nodes, links = mat.node_tree.nodes, mat.node_tree.links
bsdf = nodes.get("Principled BSDF")
tex = nodes.new("ShaderNodeTexImage")
tex.image = image
links.new(tex.outputs["Color"], bsdf.inputs["Base Color"])
bsdf.inputs["Roughness"].default_value = 0.7
for o in bpy.context.scene.objects:
if o.type == "MESH":
o.data.materials.clear()
o.data.materials.append(mat)
os.makedirs(os.path.dirname(os.path.abspath(args.out)), exist_ok=True)
bpy.ops.export_scene.gltf(filepath=os.path.abspath(args.out), export_format="GLB", export_image_format="AUTO")
print("APPLY_OK", args.out)
if __name__ == "__main__":
main()
|