import bpy
def create_fully_controllable_material(
name, base_color=(1.0, 1.0, 1.0, 1.0), metallic=0.0, roughness=0.5, ior=1.45, alpha=1.0,
transmission=0.0, subsurface=0.0, specular_ior=0.5, specular_tint=(1.0, 1.0, 1.0, 1.0),
anisotropic=0.0, anisotropic_rotation=0.0, coat_weight=0.0, coat_roughness=0.03, coat_ior=1.5,
sheen_weight=0.0, sheen_roughness=0.5, emission_color=(0.0, 0.0, 0.0, 1.0), emission_strength=0.0,
normal_map=None
):
"""
任意のプロパティを設定可能な Principled BSDF マテリアルを作成します。
"""
mat = bpy.data.materials.get(name)
if mat is None:
mat = bpy.data.materials.new(name=name)
mat.use_nodes = True
nodes = mat.node_tree.nodes
bsdf_node = nodes.get("Principled BSDF")
if bsdf_node:
bsdf_node.inputs["Base Color"].default_value = base_color
bsdf_node.inputs["Metallic"].default_value = metallic
bsdf_node.inputs["Roughness"].default_value = roughness
bsdf_node.inputs["IOR"].default_value = ior
bsdf_node.inputs["Alpha"].default_value = alpha
if "Subsurface" in bsdf_node.inputs:
bsdf_node.inputs["Subsurface"].default_value = subsurface
if "IOR Level" in bsdf_node.inputs:
bsdf_node.inputs["IOR Level"].default_value = specular_ior
if "Tint" in bsdf_node.inputs:
bsdf_node.inputs["Tint"].default_value = specular_tint
if "Anisotropic" in bsdf_node.inputs:
bsdf_node.inputs["Anisotropic"].default_value = anisotropic
if "Anisotropic Rotation" in bsdf_node.inputs:
bsdf_node.inputs["Anisotropic Rotation"].default_value = anisotropic_rotation
if "Coat" in bsdf_node.inputs:
bsdf_node.inputs["Coat"].default_value = coat_weight
if "Coat Roughness" in bsdf_node.inputs:
bsdf_node.inputs["Coat Roughness"].default_value = coat_roughness
if "Coat IOR" in bsdf_node.inputs:
bsdf_node.inputs["Coat IOR"].default_value = coat_ior
if "Sheen" in bsdf_node.inputs:
bsdf_node.inputs["Sheen"].default_value = sheen_weight
if "Sheen Roughness" in bsdf_node.inputs:
bsdf_node.inputs["Sheen Roughness"].default_value = sheen_roughness
if "Emission Color" in bsdf_node.inputs:
bsdf_node.inputs["Emission Color"].default_value = emission_color
if "Emission Strength" in bsdf_node.inputs:
bsdf_node.inputs["Emission Strength"].default_value = emission_strength
if "Transmission" in bsdf_node.inputs:
bsdf_node.inputs["Transmission"].default_value = transmission
if normal_map and "Normal" in bsdf_node.inputs:
bsdf_node.inputs["Normal"].default_value = normal_map
return mat
def main():
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for mat in bpy.data.materials:
bpy.data.materials.remove(mat, do_unlink=True)
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 1))
sphere = bpy.context.object
bpy.ops.object.shade_smooth()
mat = create_fully_controllable_material(
name="CustomMaterial",
base_color=(1, 0, 0, 1),
metallic=0.8,
roughness=0.2,
ior=1.5,
alpha=0.9,
transmission=0.3,
subsurface=0.1,
specular_ior=0.7,
specular_tint=(0.8, 0.6, 0.6, 1.0),
anisotropic=0.2,
anisotropic_rotation=0.5,
coat_weight=0.5,
coat_roughness=0.05,
coat_ior=1.3,
sheen_weight=0.3,
sheen_roughness=0.5,
emission_color=(0, 0.5, 1, 1),
emission_strength=5.0
)
sphere.data.materials.append(mat)
main()