블렌더 스크립트 기초강좌란 걸 살펴보면 일단 박스만들기부터 시작한다.
하지만 내가 당장 하고 싶은 건 저 수많은 오브젝트에 접근하는 방법이다.
접근을 해서 매크로를 돌리고 싶은 거지, 박스같은 걸 만들어서 뭣에 써...
그래서 아는대로 틈틈히 스스로 정리하기로 했다.
세부적인 액션이야 메뉴 클릭해보면 뜰테니, 그 때 그 때 붙여쓰도록 하자.
이걸 체계적으로 정리해놓은 사이트가 있으면 좋을텐데... 누가 발견하면 제보좀 부탁드림.
오브젝트 여러개에 같은 매트리얼 입힘.(오브젝트에 입혀진 매트리얼을 다 날림. 주의)
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