Skip to content

Instantly share code, notes, and snippets.

@wakarase
Created March 13, 2023 18:05
Show Gist options
  • Save wakarase/c092ce63973d15a421f39eeb317f97cb to your computer and use it in GitHub Desktop.
Save wakarase/c092ce63973d15a421f39eeb317f97cb to your computer and use it in GitHub Desktop.
# BlenderユーザーのためのPython入門
# 第23節 トーラスの各面にマテリアルインデックスをセットする
import bmesh
import bpy
import random
def delete_all():
"""既存のメッシュとマテリアルを削除します。"""
for mesh in bpy.data.meshes:
assert isinstance(mesh, bpy.types.Mesh)
bpy.data.meshes.remove(mesh)
for material in bpy.data.materials:
assert isinstance(material, bpy.types.Material)
bpy.data.materials.remove(material)
class MyTorus():
def __init__(self):
"""ドーナツ型のオブジェクトを作成します。"""
bpy.ops.mesh.primitive_torus_add(
major_segments=24,
minor_segments= 8,
major_radius = 1,
minor_radius = 0.5)
object = bpy.context.active_object
assert isinstance(object, bpy.types.Object)
bpy.ops.object.mode_set(mode='EDIT')
mesh = object.data
assert isinstance(mesh, bpy.types.Mesh)
b_mesh = bmesh.from_edit_mesh(mesh)
assert isinstance(b_mesh, bmesh.types.BMesh)
b_mesh.select_mode = {'FACE'}
b_mesh.faces.ensure_lookup_table()
for material_index, face in enumerate(b_mesh.faces):
assert isinstance(face, bmesh.types.BMFace)
self.set_material(object, face, material_index)
mesh.update()
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.shade_smooth()
def make_material(self, name):
"""ランダムな色のマテリアルを作成します。"""
material = bpy.data.materials.new(name)
assert isinstance(material, bpy.types.Material)
r = random.random()
g = random.random()
b = random.random()
color = (r, g, b, 1.0)
material.diffuse_color = color
material.use_nodes = True
node_tree = material.node_tree
assert isinstance(node_tree, bpy.types.ShaderNodeTree)
principled_bsdf = node_tree.nodes['Principled BSDF']
assert isinstance(principled_bsdf, bpy.types.ShaderNodeBsdfPrincipled)
principled_bsdf.inputs['Base Color'].default_value = color
principled_bsdf.inputs['Metallic' ].default_value = 1.0
principled_bsdf.inputs['Roughness' ].default_value = 0.3 * random.random()
return material
def set_material(self, object, face, material_index):
"""面faceにマテリアルを設定します。"""
material = self.make_material('Color' + str(material_index))
assert isinstance(material, bpy.types.Material)
mesh = object.data
assert isinstance(mesh, bpy.types.Mesh)
mesh.materials.append(material)
slot = object.material_slots[material_index]
assert isinstance(slot, bpy.types.MaterialSlot)
slot.material = material
face.material_index = material_index
if __name__ == '__main__':
delete_all()
MyTorus()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment