import bpy, bmesh, math
def mat(name, c):
m = bpy.data.materials.new(name)
m.diffuse_color = (*c, 1)
m.use_nodes = True
for node in m.node_tree.nodes:
if node.type == 'BSDF_PRINCIPLED':
node.inputs["Base Color"].default_value = (*c, 1)
break
return m
Blue = mat("Blue", (0.35, 0.7, 0.95))
Glass = mat("Glass", (0.9, 0.95, 1.0))
Black = mat("Black", (0.05, 0.06, 0.07))
Gray = mat("Gray", (0.5, 0.5, 0.5))
LGray = mat("LightGray", (0.78, 0.78, 0.78))
Beige = mat("Beige", (0.95, 0.85, 0.65))
def prism(name, m, poly, y0, y1):
n = len(poly)
v = [(x, y0, z) for x, z in poly] + [(x, y1, z) for x, z in poly]
f = [list(range(n)), list(range(2*n-1, n-1, -1))]
f += [[i, n+i, n+(i+1) % n, (i+1) % n] for i in range(n)]
me = bpy.data.meshes.new(name)
me.from_pydata(v, [], f)
me.update()
bm = bmesh.new(); bm.from_mesh(me)
bmesh.ops.recalc_face_normals(bm, faces=bm.faces)
bm.to_mesh(me); bm.free()
me.materials.append(m)
o = bpy.data.objects.new(name, me)
bpy.context.collection.objects.link(o)
def box(name, m, x0, x1, z0, z1, y0, y1):
prism(name, m, [(x0, z0), (x1, z0), (x1, z1), (x0, z1)], y0, y1)
def circle(r, cx, cz, n=32):
return [(cx + r*math.cos(2*math.pi*k/n), cz + r*math.sin(2*math.pi*k/n)) for k in range(n)]
# кузов и кабина
box("Body", Blue, -2, 2, 0.5, 1.2, -0.9, 0.9)
prism("Cabin", Blue,