blender/blender python

머티리얼 생성과 할당

monstro 2025. 7. 30. 17:23
728x90
반응형

- 개요

BPY를 사용하여 오브젝트에 머티리얼을 할당하고 또 패널 UI를 통해 할당한 머티리얼을 설정한다

머티리얼의 적용 과정은 다음과 같다

  • 머티리얼 생성 및 설정
  • 머티리얼의 노드 설정
  • 머티리얼의 노드 연결

 

1) 메인 패널 클래스

import bpy


class ms_PT_main_panel(bpy.types.Panel):
    bl_label = "Add Shader Panel"
    bl_idname = "ms_PT_main_panel"
    
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = "New Tab"

    def draw(self, context):
        layout = self.layout
        layout.operator("ms.add_basic")
        
...

 

머티리얼을 설정하기 위한 액션을 담고 있는 메인 패널 클래스를 위와 같이 정의하였다

패널이므로 bpy.types.Panel 클래스를 상속받도록 설정한다

패널을 생성하는 draw 함수에서 ms.add_basic의 idname을 지닌 클래스를 실행하도록 구성하였다

 

2) 머티리얼 설정 클래스

class ms_OT_add_basic_shader(bpy.types.Operator):
    bl_label = "Add Shader"
    bl_idname = "ms.add_basic"
    col : bpy.props.FloatVectorProperty(name="Color", subtype='COLOR_GAMMA', size=4, default=(0,1,0,1))
    

    def execute(self, context):
        # Create 'Basic' material and set 
        material_basic = bpy.data.materials.new(name="Basic") 
        material_basic.use_nodes = True                       
        bpy.context.object.active_material = material_basic   
        
        # Setting Principled BSDF Node of Created material
        principled_node = material_basic.node_tree.nodes.get('Principled BSDF')
        principled_node.inputs[7].default_value = 0.08         
        
        # Setting RGB Node of Created Material
        rgb_node = material_basic.node_tree.nodes.new('ShaderNodeRGB')
        rgb_node.location = (-250, 0)
        rgb_node.outputs[0].default_value = self.col 
        
        # Setting Node`s Link of Created Material
        link = material_basic.node_tree.links
        link.new(rgb_node.outputs[0], principled_node.inputs[0])
        
        return {'FINISHED'}


    def invoke(self, context, event):
        return context.window_manager.invoke_props_dialog(self)
        
       
...

 

머티리얼을 설정하기 위한 Operator 클래스는 위와 같이 구성하였다

동작을 수행해야 하므로 bpy.types.Operator 클래스를 상속받도록 설정하였다

FloatVector 타입의 프로퍼티 col을 사용하여 사용자로부터 입력값을 받는데, 구성은 다음과 같다

  • name : UI로 입력받는 값이름
  • subtype : 열거형으로서 특정 속성의 유형에 대한 배열을 정의, 프로젝트에서는 컬러 스피너로 설정
  • size : 입력받는 값개수
  • default : 프로퍼티의 기본값

따라서 프로퍼티 col을 사용하여 입력값을 받고, 입력값을 바탕으로 머티리얼을 설정한다

 

1) execute 함수

Operator의 동작을 정의하는 execute 함수최대 3개의 로직으로 분리할 수 있다

  • Basic이라는 이름의 머티리얼을 생성
    • 해당 머티리얼의 node 옵션사용하도록 설정
    • 해당 머티리얼을 현재 뷰포트에 있는 오브젝트머티리얼로 설정
  • Basic 머티리얼에서 기본적으로 제공하는 BDSF Principled 노드를 가져옴
    • 해당 노드의 weight 인자의 값을 설정
  • Basic 머티리얼에서 RGB 노드를 생성
    • RGB 노드의 위치를 설정
    • RGB 노드의 color 인자의 값UI로부터 입력받은 값으로 설정
  • 링크를 생성하고 RGB 노드를 인자로 하여 BDSF Principled 노드에 연결

 

2) invoke 함수

invoke 함수를 호출하여 Operator 클래스를 실행하고 머티리얼의 컬러 값을 설정할 수 있는 팝업창을 띄운다

 

3) Add-On 클래스 등록 / 등록 해제

...

classes = (
    ms_PT_main_panel,
    ms_OT_add_basic_shader,
)

register, unregister = bpy.utils.register_classes_factory(classes)
 
 
if __name__ == "__main__":
    register()

 

register_classes_factory를 사용하여 생성한 클래스들을 등록 + 등록해제하도록 설정한다

 

- 최종 실행 결과

 

728x90
반응형

'blender > blender python' 카테고리의 다른 글

프로퍼티 서브타입  (0) 2025.08.06
프로퍼티 그룹  (0) 2025.08.06
클래스 네이밍 컨벤션  (0) 2025.07.30
드롭다운 메뉴  (0) 2025.07.30
BPY 코드 작성 시 유용하게 사용할 수 있는 팁  (0) 2025.07.23