見出し画像

blenderのPrincipled BSDFをpythonで指定する関数

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
            
            # Subsurface
            if "Subsurface" in bsdf_node.inputs:
                bsdf_node.inputs["Subsurface"].default_value = subsurface
            
            # Specular (画像に基づき詳細設定)
            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
            
            # Coat
            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
            
            # Sheen
            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
            
            # Emission
            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
            
            # Transmission
            if "Transmission" in bsdf_node.inputs:
                bsdf_node.inputs["Transmission"].default_value = transmission
            
            # Normal Map
            if normal_map and "Normal" in bsdf_node.inputs:
                bsdf_node.inputs["Normal"].default_value = normal_map

    return mat


# Example usage
def main():
    # Remove all objects and materials
    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)

    # Add a sphere
    bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=(0, 0, 1))
    sphere = bpy.context.object
    bpy.ops.object.shade_smooth()

    # Create and apply the material
    mat = create_fully_controllable_material(
        name="CustomMaterial",
        base_color=(1, 0, 0, 1),  # Red
        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),  # Light blue
        emission_strength=5.0
    )
    sphere.data.materials.append(mat)

# Execute the script
main()

いいなと思ったら応援しよう!