본문 바로가기
툰렌더링 공부

블렌더 스크립트 써머리

by IX. 2022. 7. 22.

블렌더 스크립트 기초강좌란 걸 살펴보면 일단 박스만들기부터 시작한다.

하지만 내가 당장 하고 싶은 건 저 수많은 오브젝트에 접근하는 방법이다.

접근을 해서 매크로를 돌리고 싶은 거지, 박스같은 걸 만들어서 뭣에 써...

 

그래서 아는대로 틈틈히 스스로 정리하기로 했다.

세부적인 액션이야 메뉴 클릭해보면 뜰테니, 그 때 그 때 붙여쓰도록 하자.

이걸 체계적으로 정리해놓은 사이트가 있으면 좋을텐데... 누가 발견하면 제보좀 부탁드림.

 

 

오브젝트 여러개에 같은 매트리얼 입힘.(오브젝트에 입혀진 매트리얼을 다 날림. 주의)

import bpy

#따옴표 안에 매트리얼 이름을 적어주자
matName = "Material" 

for obj in bpy.context.scene.objects:
    obj.data.materials.clear()
    obj.data.materials.append(bpy.data.materials[matName])

 

넙스 커브 사용할 때 메쉬 끝까지 나오게 하는 거

import bpy

for curve in bpy.context.object.data.splines:
    curve.use_endpoint_u = True

 

스프링본 붙일 때 수치 일괄 적용(스프링본 애드온 사용)

import bpy

for bone in bpy.context.selected_pose_bones:
    bone.sb_bone_spring = True
    bone.sb_bone_rot = True
    bone.sb_stiffness = 0.5
    bone.sb_damp = 0.6     
    bone.sb_gravity = 0.0

 

특정 키워드가 들어간 본을 모두 선택

import bpy

keyword = 'skirt'

for bone in bpy.context.object.data.bones:
    if keyword in bone.name:
        bone.select = True

 

모든 매트리얼의 재질을 불투명으로 하고 싶다.

import bpy

for obj in bpy.data.objects:    
    for mat in obj.data.materials:       
        mat.blend_method = 'OPAQUE'

 

선택한 오브젝트의 이름에 넘버링을 한다.

import bpy

for i, obj in enumerate(bpy.context.selected_objects): 
    obj.name = "Object.%02d" % i

 

해당범위 안의 키프레임을 offset. 모션캡처용 데이터 교정에 사용.

로테이션을 변경할 땐 주석풀어 쓰자.

import bpy
from math import radians

first_frame = 3
last_frame = 744

bpy.context.scene.frame_current = first_frame

if bpy.context.object.mode != 'POSE':
    bpy.ops.object.posemode_toggle()

for i in range(first_frame, last_frame):
    #Movement
    move_value = (0, 3.2, 0)
    bpy.ops.transform.translate(value=move_value,orient_axis_ortho='X',orient_type='GLOBAL',)
    
    #Rotate
#    angle = -45 # 부호를 반대로 해줘야 정상작동함
#    axis = 'Z'
#    bpy.ops.transform.rotate(value= radians(angle),orient_axis=axis,orient_type='GLOBAL',)
        
    bpy.context.scene.frame_current += 1

 

ARP에서 손가락 회전잠금

import bpy

fingers = (
    'c_thumb2.l',
    'c_thumb3.l',
    'c_index1.l',
    'c_index2.l',
    'c_index3.l',
    'c_middle1.l',
    'c_middle2.l',
    'c_middle3.l',
    'c_ring1.l',
    'c_ring2.l',
    'c_ring3.l',
    'c_pinky1.l',
    'c_pinky2.l',
    'c_pinky3.l',
    'c_thumb2.r',
    'c_thumb3.r',
    'c_index1.r',
    'c_index2.r',
    'c_index3.r',
    'c_middle1.r',
    'c_middle2.r',
    'c_middle3.r',
    'c_ring1.r',
    'c_ring2.r',
    'c_ring3.r',
    'c_pinky1.r',
    'c_pinky2.r',
    'c_pinky3.r',
    )

for name in fingers:
    bpy.context.object.pose.bones[name].lock_rotation[1] = True
    bpy.context.object.pose.bones[name].lock_rotation[2] = True

 

 

빈 패널(3D VIEW)

import bpy

from bpy.props import (StringProperty,
                       BoolProperty,
                       IntProperty,
                       FloatProperty,
                       FloatVectorProperty,
                       EnumProperty,
                       PointerProperty,
                       )
from bpy.types import (Panel,
                       Operator,
                       AddonPreferences,
                       PropertyGroup,
                       )


#Properties ----------------------------------------------

class MyProperties(PropertyGroup):
    
    my_bool : BoolProperty(
        name="Bool",
        description="A bool property",
        default = False
        )

    my_int : IntProperty(
        name = "Int",
        description="A integer property",
        default = 123,
        min = 0,
        max = 100
        )

    my_float : FloatProperty(
        name = "Float",
        description = "A float property",
        default = 1.23,        
        )
        
    my_vector : FloatVectorProperty(
        name ="Vector",
        description = "A vector property",
        default = (0.1, 0.2, 0.3),
        )
        
    my_string : StringProperty(
        name = "String",
        description = "String property",
        default = "my_string"
        )
        
    my_enum : EnumProperty(
        #(identifier, name, description)
        items = [
            ('0','AAA','Description for AAA'), 
            ('1','BBB','Description for BBB'),
            ('2','CCC','Description for CCC'),
            ('3','DDD','Description for DDD'),
            ],
        name = "Enum property",
        default = '1', #BBB
        )


#Operator ------------------------------------------------

class MyOperator(Operator):
    
    bl_idname = "object.my_operator"
    bl_label = "My Operator"
    
    def execute(self, context):
        
        mytool = context.scene.my_tool
        
        message = (
            "Popup Values: %r, %d, %f, %s, format : %04d" %
            (mytool.my_bool, mytool.my_int, mytool.my_float, mytool.my_string, mytool.my_int)
        )
        self.report({'INFO'},message)

        return {'FINISHED'}


#Panel ---------------------------------------------------

class OEJECT_PT_my_panel(Panel):
    
    bl_label = "My Tool"
    bl_category = 'My Category'
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'

    def draw(self, context):
        layout = self.layout
        mytool = context.scene.my_tool
        
        layout.label(text = "Line---------")
        layout.prop(mytool, "my_bool", text="Bool Property")
        layout.prop(mytool, "my_int", text="Integer Property")
        layout.prop(mytool, "my_float", text="Float Property")
        layout.prop(mytool, "my_vector", text="Vector Property")
        layout.prop(mytool, "my_string", text="String Property")
        layout.prop(mytool, "my_enum", text="Enum Property")        
        layout.operator("object.my_operator", text="Operator")


#Regist  -------------------------------------------------

classes = (
    MyProperties,
    MyOperator,
    OEJECT_PT_my_panel,
)

def register():
    from bpy.utils import register_class
    for cls in classes:
        register_class(cls)

    bpy.types.Scene.my_tool = PointerProperty(type=MyProperties)

def unregister():
    from bpy.utils import unregister_class
    for cls in reversed(classes):
        unregister_class(cls)

    del bpy.types.Scene.my_tool


if __name__ == "__main__":
    register()

댓글0