blender/blender python

BPY를 이용한 키프레임 모디파이어 추가

monstro 2025. 7. 2. 20:02
728x90
반응형

- 개요

네온 머티리얼을 적용하는 쉐이더 Add-On을 만들어본다

단, 이번에는 머티리얼의 노드에 키프레임 모디파이어를 적용하여 기능을 구현한다

 

키 프레임 모디파이어를 머티리얼 노드에 사용하면

고정된 값이 아닌 유동적인 값을 사용하여 머티리얼을 다양하게 연출할 수 있다

 

- Add-On 스크립트의 구성

1) Add-On을 사용하기 위한 패널의 클래스 생성

import bpy


class HelloWorldPanel(bpy.types.Panel):
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'Name Your New Tab'

    def draw(self, context):
        layout = self.layout

        obj = context.object

        row = layout.row()
        row.operator('shader.neon_operator')
        
...

 

클래스 HelloWorldPanel을 생성하여 Add-On을 사용할 수 있는 패널을 정의한다

패널을 활성화하는 draw 함수에서는 operator 연산자를 통해 수행할 연산을 정의한다

실행할 네온 쉐이더 Add-On의 bl_idname을 인자로 넘겨주어 실행한다
 

2) Add-On 클래스 정의

...

class SHADER_OT_NEON(bpy.types.Operator):
    bl_label = "Add Neon Shader"
    bl_idname = 'shader.neon_operator'
    
    
    def execute(self, context):
        
        cur_frame = bpy.context.scene.frame_current
        
        # Creating a New Neon material
        material_neon = bpy.data.materials.new(name = "Neon")
        material_neon.use_nodes = True
        
        
        tree = material_neon.node_tree
        
        
        # Handling Principled BSDF Node
        material_neon.node_tree.nodes.remove(material_neon.node_tree.nodes.get('Principled BSDF'))
        
        
        # Handling Material Output Node 
        material_output = material_neon.node_tree.nodes.get('Material Output')
        material_output.location = (400, 0)
        
        
        # Handling Emission Node
        emiss_node = material_neon.node_tree.nodes.new('ShaderNodeEmission')
        emiss_node.location = (-600, 0)
         # Default Color
        emiss_node.inputs[0].default_value = (0.591019, 0.758087, 1, 1) 
         # Strength Value
        emiss_node.inputs[1].default_value = 2        
        
        
        # Add Keyframe to Emission Node`s Strength
        emiss_node.inputs[1].keyframe_insert("default_value", frame = cur_frame)
        data_path = f'nodes["{emiss_node.name}"].inputs[1].default_value'
        fcurves = tree.animation_data.action.fcurves
        fc = fcurves.find(data_path)
        
        if fc :
            new_modi = fc.modifiers.new('NOISE')
            new_modi.strength = 10
            new_modi.depth = 1
        
        
        # Link nodes
        material_neon.node_tree.links.new(emiss_node.outputs[0], material_output.inputs[0])
        
        
        return {'FINISHED'}
        
 ...

 

Add-On으로 사용할 SHADER_OT_NEON 클래스를 정의하였다

해당 클래스는 연산에 사용하므로 bpy.types.Operator를 부모 클래스로 사용하고

연산의 종료를 알리는 'FINISHED'를 반환한다

 

클래스의 구성을 큰 단락으로 구분하면 다음과 같이 구분할 수 있다

  • 새로운 Neon 머티리얼 정의
  • Principled BSDF 노드 설정
  • Material Output 노드 설정
  • Emission 노드 설정
  • Emission 노드에 키프레임 모디파이어 설정
  • 노드간의 연결 설정

 

주목해야 할 정보는 다음과 같다

cur_frame 변수는 scene.frame_current의 값으로 설정하였다

해당 값현재 프레임을 의미하고 애니메이션 데이터를 업데이트하기 위해 사용한다

따라서 키프레임 모디파이어에 cur_frame의 값을 사용한다

 

다음으로 furves 변수animation_data.action.fcurves의 값을 사용한다

FCurve주기를 나타내는 값으로 이뤄진 곡선을 의미하는데,

따라서 애니메이션의 주기의 값을 가져오는 용도로 fcurves 변수를 사용한다

 

fc 변수fcurves.find(data_path)의 값으로 설정된다

FCurve에서 find 함수를 호출하고 data_path를 넘겨주면 인자에 해당하는 FCurve를 찾아온다

로직에서는 인자에 맞는 FCurve가 존재한다면

Noise 모디파이어를 추가하고 strengthdepth설정한다

 

- 최종 실행 결과

 

728x90
반응형

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

텍스트 Add-On  (0) 2025.07.09
대화 상자  (0) 2025.07.09
다이아몬드 쉐이더 Add-On  (0) 2025.07.02
BPY 스크립트를 Add-On으로 완성  (0) 2025.06.25
BPY 스크립트로 Blender에 기능 추가  (0) 2025.06.25