3D码农建模 - 沙滩球

63 阅读1分钟

建模环境

Blender 4.3

成品预览

beach_ball.png

代码解析

模块导入

import bpy
import bmesh
import math

清空当前场景

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()

新建一个光滑的球体

number_of_segments = 8
number_of_rings = 4

bpy.ops.mesh.primitive_uv_sphere_add(
  segments = number_of_segments,
  ring_count = number_of_rings,
  scale=(1.1, 1.1, 1)
)

bpy.ops.object.modifier_add(type='SUBSURF')
bpy.context.object.modifiers["Subdivision"].levels = 2

bpy.ops.object.shade_smooth()

定义蓝色和黄色两种材质

blue_material = bpy.data.materials.new(name="blue")
blue_material.diffuse_color = (0, 0, 1, 1)
blue_material.metallic = 0
blue_material.roughness = 0.5

yellow_material = bpy.data.materials.new(name="yellow")
yellow_material.diffuse_color = (1, 1, 0, 1)
yellow_material.metallic = 0
yellow_material.roughness = 0.8

切换到编辑模式并添加两种材质

bpy.ops.object.mode_set(mode='EDIT')

obj = bpy.context.edit_object

obj.data.materials.clear()
obj.data.materials.append(blue_material)
obj.data.materials.append(yellow_material)

计算每个面的中心点在x-y面上的角度位置以确定使用的材质

mesh = obj.data
bm = bmesh.from_edit_mesh(mesh)

seg_width = 2 * math.pi / number_of_segments

for face in bm.faces:
  center = face.calc_center_median()
  angle = math.atan2(center.y, center.x)
  if angle < 0:
      angle += math.pi

  segment_index = math.floor(angle / seg_width)

  face.material_index = segment_index % 2

更新模型,返回物体模式

bmesh.update_edit_mesh(mesh)

bpy.ops.object.mode_set(mode='OBJECT')