import bpy; bpy.ops.object.select_all(action='SELECT'); bpy.ops.object.delete()
def m(n, c):
x = bpy.data.materials.new(n); x.use_nodes = True; x.node_tree.nodes["Principled BSDF"].inputs[0].default_value = c; return x
o = m("O", (0.85, 0.22, 0.05, 1)); w = m("W", (0.9, 0.9, 0.9, 1)); b = m("B", (0.05, 0.05, 0.05, 1))
def p(n, l, s, mat, r=(0,0,0)):
bpy.ops.mesh.primitive_cube_add(location=l, scale=s, rotation=r); a = bpy.context.active_object; a.name = n; mod = a.modifiers.new("S", 'SUBSURF'); mod.levels = 2; bpy.ops.object.shade_smooth(); a.data.materials.append(mat)
p("Base", (0, 0, 0.15), (2.2, 2.2, 0.2), w)
p("Head", (0, 0, 2.7), (0.95, 0.85, 0.75), o)
p("Muzzle", (0, -0.1, 2.45), (0.96, 0.86, 0.4), w)
p("Body", (0, 0, 1.35), (0.65, 0.55, 0.7), o)
p("Belly", (0, -0.35, 1.45), (0.38, 0.25, 0.42), w)
p("Nose", (0, -0.92, 2.62), (0.1, 0.08, 0.07), b)
p("Tail", (0, 0.75, 0.9), (0.25, 0.55, 0.25), o, (0.5, 0, 0))
for s in [-1, 1]:
p("Ear", (s0.45, 0, 3.65), (0.25, 0.15, 0.55), o, (0, s0.1, 0)); p("EarIn", (s0.45, -0.08, 3.6), (0.15, 0.1, 0.4), w, (0, s0.1, 0)); p("Tuft1", (s0.95, 0, 2.65), (0.25, 0.12, 0.12), o, (0, s0.4, 0)); p("Tuft2", (s0.88, 0, 2.4), (0.2, 0.1, 0.1), o, (0, s0.5, 0)); p("Arm", (s0.7, 0, 1.35), (0.18, 0.18, 0.48), o, (0, -s0.2, 0)); p("Leg", (s0.3, 0, 0.55), (0.22, 0.25, 0.45), o); p("Eye", (s0.35, -0.82, 2.75), (0.06, 0.04, 0.12), b)