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 |