Files
workinf_Blender_Wasm/tools/web/generate-rigged-fixture.py
2026-08-12 04:47:48 -04:00

68 lines
2.4 KiB
Python

import math
import sys
import bpy
def main(output_path: str) -> None:
bpy.ops.wm.read_factory_settings(use_empty=True)
mesh = bpy.data.meshes.new("RiggedShapeMesh")
mesh.from_pydata(
[(-1.0, -1.0, 0.0), (1.0, -1.0, 0.0), (1.0, 1.0, 0.0), (-1.0, 1.0, 0.0)],
[],
[(0, 1, 2), (0, 2, 3)],
)
mesh.update()
obj = bpy.data.objects.new("RiggedShapeObject", mesh)
bpy.context.collection.objects.link(obj)
obj.location = (0.5, 0.25, 0.0)
armature_data = bpy.data.armatures.new("RiggedArmature")
armature_object = bpy.data.objects.new("RiggedArmatureObject", armature_data)
bpy.context.collection.objects.link(armature_object)
bpy.context.view_layer.objects.active = armature_object
armature_object.select_set(True)
bpy.ops.object.mode_set(mode="EDIT")
root_bone = armature_data.edit_bones.new("Root")
root_bone.head = (0.0, 0.0, -1.0)
root_bone.tail = (0.0, 0.0, 0.0)
tip_bone = armature_data.edit_bones.new("Tip")
tip_bone.head = (0.0, 0.0, 0.0)
tip_bone.tail = (0.0, 0.0, 1.0)
tip_bone.parent = root_bone
bpy.ops.object.mode_set(mode="OBJECT")
armature_object.location = (0.25, -0.5, 0.0)
armature_object.rotation_euler[2] = 0.15
root = obj.vertex_groups.new(name="Root")
tip = obj.vertex_groups.new(name="Tip")
root.add([0, 1], 1.0, "REPLACE")
root.add([2, 3], 0.25, "REPLACE")
tip.add([0, 1], 0.25, "REPLACE")
tip.add([2, 3], 1.0, "REPLACE")
obj.shape_key_add(name="Basis")
smile = obj.shape_key_add(name="Smile")
smile.data[2].co.z = 0.5
smile.data[3].co.z = 0.25
smile.value = 0.6
armature_object.pose.bones["Tip"].rotation_mode = "XYZ"
armature_object.pose.bones["Tip"].rotation_euler[1] = math.radians(27.0)
armature_modifier = obj.modifiers.new(name="Armature Deform", type="ARMATURE")
armature_modifier.object = armature_object
decimate = obj.modifiers.new(name="Preview Decimate", type="DECIMATE")
decimate.ratio = 0.75
decimate.show_render = False
bpy.context.view_layer.objects.active = obj
obj.select_set(True)
bpy.ops.wm.save_as_mainfile(filepath=output_path, compress=True)
if __name__ == "__main__":
if "--" not in sys.argv or len(sys.argv) <= sys.argv.index("--") + 1:
raise SystemExit("usage: blender -b --python generate-rigged-fixture.py -- output.blend")
main(sys.argv[sys.argv.index("--") + 1])