Optima Interior -
# Create a new mesh datablock and object mesh = bpy.data.meshes.new("OptimaInterior") obj = bpy.data.objects.new("OptimaInterior", mesh) bpy.context.collection.objects.link(obj) bpy.context.view_layer.objects.active = obj obj.select_set(True)
# Parameters radius = 1.0 height = 0.3 segments = 64 # High resolution for smooth curvature
# Add subdivision surface for smooth organic interior look mod = obj.modifiers.new(name="Subdivision", type='SUBSURF') mod.levels = 2 mod.render_levels = 2 optima interior
# Create central disc on bottom (optional, but helps solidity) # Actually we will fill bottom with a fan bm.faces.new(verts_bottom) # Fan fill works if verts are in order
import bpy import bmesh import math from mathutils import Vector # Create a new mesh datablock and object mesh = bpy
# Recalculate normals outward bmesh.ops.recalc_face_normals(bm, faces=bm.faces)
# Add inner ring of vertices at a smaller radius to form a top surface with an inner void. inner_radius = 0.5 inner_verts = [] for i in range(segments): angle = 2 * math.pi * i / segments x = inner_radius * math.cos(angle) y = inner_radius * math.sin(angle) z = height * (0.5 + 0.3 * math.sin(4 * angle)) # same undulation v = bm.verts.new((x, y, z)) inner_verts.append(v) optima interior
# Connect outer top ring to inner ring for i in range(segments): i_next = (i + 1) % segments bm.faces.new((verts_top[i], verts_top[i_next], inner_verts[i_next], inner_verts[i]))
# Clear existing mesh objects bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False)
# Add a material with a warm interior tone mat = bpy.data.materials.new(name="InteriorMaterial") mat.use_nodes = True nodes = mat.node_tree.nodes links = mat.node_tree.links nodes.clear() output = nodes.new(type='ShaderNodeOutputMaterial') principled = nodes.new(type='ShaderNodeBsdfPrincipled') principled.inputs['Base Color'].default_value = (0.8, 0.6, 0.4, 1.0) # warm wood/leather principled.inputs['Roughness'].default_value = 0.3 principled.inputs['Metallic'].default_value = 0.1 links.new(principled.outputs['BSDF'], output.inputs['Surface']) obj.data.materials.append(mat)