本文介绍在 Blender 中如何使用 Python API 获取材质及其属性。
推荐:用 NSDT场景设计器 快速搭建3D场景。
1、如何获取材质
方法1、 获取当前激活的材质
激活材质是当前在材质槽中选择的材料。 如果你选择一个面,则活动材料将更改为分配给选定面的材质。
以下是获取名为“Cube”的对象的活动材质的Python脚本:
import bpy
obj = bpy.data.objects["Cube"]
material = obj.active_material
print(material)
# output => <bpy_struct, Material("Material3")>
方法2、获取材质槽并选择其中之一
import bpy
obj = bpy.data.objects["Cube"]
material_slots = obj.material_slots
for m in material_slots:
material = m.material
print("slot", m, "material", material)
# output is material slot and material
# slot <bpy_struct, MaterialSlot("Material")> material <bpy_struct, Material("Material")>
# slot <bpy_struct, MaterialSlot("Material2")> material <bpy_struct, Material("Material2")>
# slot <bpy_struct, MaterialSlot("Material3")> material <bpy_struct, Material("Material3")>
你可以获得带有索引或键(材质名称)的插槽。 插槽的顺序遵循材质插槽 UI 上的顺序。
import bpy
obj = bpy.data.objects["Cube"]
material_slots = obj.material_slots
material1 = material_slots[0].material
print(material1)
# output => <bpy_struct, Material("Material")>
material2 = material_slots["Material2"].material
print(material2)
# output => <bpy_struct, Material("Materia2")>
方法3:从 bpy.data.materials 获取
可以通过其键(材质名称)获取现有材质。
import bpy
material = bpy.data.materials["Material2"]
2、如何获得材质属性
可以在材料属性选项卡中查看材料属性。 根据渲染器的不同,获取属性值的方式也不同。
渲染器:工作台
可以使用 Material 类的属性获取属性值,如下所示。
import bpy
material = bpy.data.materials["Material.001"]
color = material.diffuse_color
print(color[0], color[1], color[2], color[3])
# output => 0.20000000298023224 0.800000011920929 0.5 1.0
metallic = material.metallic
print(metallic)
# output => 0.30000001192092896
其他渲染器
例如,Principled BSDF 是 Eevee 中基于节点的材料之一。
访问 Material 对象的 node_tree。 并获取节点“Principled BSDF”并获取节点的输入。
你可以通过 material.node_tree.nodes[“Principled BSDF”].inputs 查看输入列表:
import bpy
#obj = bpy.data.objects["Cube"]
#material = obj.active_material
material = bpy.data.materials["Material3"]
inputs = material.node_tree.nodes["Principled BSDF"].inputs
for i in inputs:
print(i)
# output
# <bpy_struct, NodeSocketColor("Base Color")>
# <bpy_struct, NodeSocketFloatFactor("Subsurface")>
# <bpy_struct, NodeSocketVector("Subsurface Radius")>
# <bpy_struct, NodeSocketColor("Subsurface Color")>
# <bpy_struct, NodeSocketFloatFactor("Metallic")>
可以获得带有索引或键(输入名称)的节点套接字。 未连接输入的值可以通过属性“default_value”获得:
import bpy
material = bpy.data.materials["Material3"]
inputs = material.node_tree.nodes["Principled BSDF"].inputs
color = inputs["Base Color"].default_value
print(color[0], color[1], color[2], color[3])
# output => 0.15000000596046448 0.800000011920929 0.10000000149011612 1.0
subsurface = inputs["Subsurface"].default_value
print(subsurface)
# output => 0.0
3、如何改变材料属性
替换属性的值。
import bpy
material = bpy.data.materials["Material3"]
inputs = material.node_tree.nodes["Principled BSDF"].inputs
color = inputs["Base Color"].default_value
color[0] = 1.0
颜色会改变。
你可以使用 python 数组作为颜色的值。
import bpy
material = bpy.data.materials["Material.001"]
material.diffuse_color = [1.0, 0.2, 0.2 ,1.0]
原文链接:Blender Python材质处理 — BimAnt