import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
def build_part(n, loc, rot, wb, db, wt, dt, h):
v = [
(-wb/2, -db/2, 0), (wb/2, -db/2, 0),
(wb/2, db/2, 0), (-wb/2, db/2, 0),
(-wt/2, -dt/2, h), (wt/2, -dt/2, h),
(wt/2, dt/2, h), (-wt/2, dt/2, h)
]
f = [(0, 1, 2, 3), (4, 5, 6, 7), (0, 1, 5, 4), (1, 2, 6, 5), (2, 3, 7, 6), (3, 0, 4, 7)]
m = bpy.data.meshes.new(n)
m.from_pydata(v, [], f)
m.update()
o = bpy.data.objects.new(n, m)
bpy.context.collection.objects.link(o)
o.location = loc
o.rotation_euler = rot
return o
parts = []
parts.append(build_part("Torso", (0, 0, 2.7), (0, 0, 0), 0.7, 0.4, 1.15, 0.55, 1.4))
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=1, radius=0.32, location=(0, 0, 4.5))
head = bpy.context.active_object
head.scale = (1.0, 1.0, 1.25)
bpy.ops.object.transform_apply(scale=True)
parts.append(head)
parts.append(build_part("Arm_U_L", (0.68, 0, 3.85), (0, 1.5708, 0), 0.28, 0.28, 0.18, 0.18, 0.9))
parts.append(build_part("Arm_L_L", (1.68, 0, 3.85), (0, 1.5708, 0), 0.16, 0.16, 0.11, 0.11, 0.8))
parts.append(build_part("Hand_L", (2.58, 0, 3.85), (0, 1.5708, 0), 0.11, 0.08, 0.05, 0.03, 0.3))
parts.append(build_part("Arm_U_R", (-0.68, 0, 3.85), (0, -1.5708, 0), 0.28, 0.28, 0.18, 0.18, 0.9))
parts.append(build_part("Arm_L_R", (-1.68, 0, 3.85), (0, -1.5708, 0), 0.16, 0.16, 0.11, 0.11, 0.8))
parts.append(build_part("Hand_R", (-2.58, 0, 3.85), (0, -1.5708, 0), 0.11, 0.08, 0.05, 0.03, 0.3))
parts.append(build_part("Leg_U_L", (0.35, 0, 1.4), (0, -0.05, 0), 0.22, 0.25, 0.35, 0.35, 1.2))
parts.append(build_part("Leg_L_L", (0.41, 0, 0.2), (0, -0.02, 0), 0.16, 0.18, 0.22, 0.25, 1.1))
parts.append(build_part("Foot_L", (0.42, -0.12, 0), (0, -0.02, 0), 0.18, 0.45, 0.15, 0.25, 0.17))
parts.append(build_part("Leg_U_R", (-0.35, 0, 1.4), (0, 0.05, 0), 0.22, 0.25, 0.35, 0.35, 1.2))
parts.append(build_part("Leg_L_R", (-0.41, 0, 0.2), (0, 0.02, 0), 0.16, 0.18, 0.22, 0.25, 1.1))
parts.append(build_part("Foot_R", (-0.42, -0.12, 0), (0, 0.02, 0), 0.18, 0.45, 0.15, 0.25, 0.17))
bpy.ops.object.select_all(action='DESELECT')
for p in parts:
p.select_set(True)
bpy.context.view_layer.objects.active = parts[0]
bpy.ops.object.join()
char_obj = bpy.context.active_object
char_obj.name = "Персонаж"
bpy.ops.object.shade_flat()
mat = bpy.data.materials.new(name="Char_Mat")
mat.use_nodes = True
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf:
bsdf.inputs['Base Color'].default_value = (0.8, 0.75, 0.7, 1.0)
bsdf.inputs['Roughness'].default_value = 0.6
char_obj.data.materials.append(mat)
bpy.ops.object.select_all(action='DESELECT')