import bpy from mathutils import noise import bmesh from math import * def make_vertex_color_material(): mat = bpy.data.materials.new(name="VertexColorMaterial") mat.use_nodes = True bsdf = mat.node_tree.nodes.get("Principled BSDF") color_node = mat.node_tree.nodes.new(type='ShaderNodeVertexColor') color_node.layer_name = "Col" mat.node_tree.links.new(color_node.outputs['Color'], bsdf.inputs['Base Color']) return mat bpy.ops.mesh.primitive_torus_add(minor_segments=4000, major_segments=2000) obj = bpy.context.active_object # Ensure it's a mesh object if obj and obj.type == 'MESH': # Get the Subdivision Surface modifier, or create it if it doesn't exist subsurf_mod = obj.modifiers.get("MySubsurf") if subsurf_mod is None: subsurf_mod = obj.modifiers.new(name="MySubsurf", type='SUBSURF') # Set the viewport and render subdivision levels subsurf_mod.levels = 4 # Number of subdivisions for the viewport subsurf_mod.render_levels = 3 # Number of subdivisions for rendering # Example of setting other properties (optional) # subsurf_mod.use_creases = True # To use edge creases # subsurf_mod.quality = 1 # Controls the quality of smoothing (0 to 1) else: print("No active mesh object selected.") for v in obj.data.vertices: v.co.z *= 10 v.co.x += abs(v.co.z**2)/10 #for v in obj.data.vertices: # v.co.xy *= 1.0 + noise.noise(20*v.co)/5 obj.data.materials.append(make_vertex_color_material()) bpy.ops.object.mode_set(mode='EDIT') bm = bmesh.from_edit_mesh(obj.data) bm.faces.ensure_lookup_table() color_layer = bm.loops.layers.color.new("Col") face_color = (1, 1, 1, 1) for i, face in enumerate(bm.faces): for loop in face.loops: d_center = loop.vert.co.length loop[color_layer] = (0, 0.5 + noise.noise(20 * loop.vert.co), 0, 1.0) bmesh.update_edit_mesh(obj.data) bpy.ops.object.mode_set(mode='OBJECT') for v in obj.data.vertices: v.co.xy *= 1.0 + noise.noise(20 * v.co)/10