본문 바로가기
프로젝트A

블렌더 애드온 오퍼레이터 개발

by IX. 2023/09/25 13:40:22

9.18

모델링을 하다보면 몇몇 공정은 불필요하게 클릭수가 많아진다.

이런 것들을 애드온에 자동화시켜둔다면, 작업에 꽤 많은 도움이 된다.

 

 

커브의 점 건너 뛰어 선택.

머리카락을 제작할 땐 특히 불편했던 기능. 인덱싱이 틀렸을 땐 반전시켜 사용하자.

obj = bpy.context.object
        
for spline in obj.data.splines:
	for i, point in enumerate(spline.points):
		if i%2 == 0:
			point.select = True

 

아웃라인 생성

셰이더 경로는 따로 설정해야 한다.

obj = bpy.context.object        
outline_obj = copy_object(obj)

deselect_all()
select(outline_obj)

outline_obj.data.materials.clear()                 
outline_obj.name = obj.name + ".outline"
outline_obj.data.use_auto_smooth = False

bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)

set_mode('EDIT')

select_all()
bpy.ops.mesh.flip_normals()
bpy.ops.transform.shrink_fatten(value=-0.01)

append(shader_path, 'Material', 'Outline')

mat = bpy.data.materials.get('Outline')
outline_obj.data.materials.append(mat)

outline_obj.hide_select = True

 

X축 미러

오브젝트를 X축 기준으로 반대쪽에 복사한다.

대칭되는 팔이나 다리등의 의상을 만들 때 많이 쓰는 기능

bpy.ops.object.duplicate(linked=True)

obj = bpy.context.object
obj.location.x *= -1
obj.scale.x *= -1
obj.rotation_euler.y *= -1
obj.rotation_euler.z *= -1

 

트랜스폼 정렬

이게 왜 없어...

active_object = bpy.context.active_object

for obj in bpy.context.selected_objects:
    obj.location = active_object.location.copy()
    obj.rotation_euler = active_object.rotation_euler.copy()
    obj.scale = active_object.scale.copy()

 

아웃라인 제거

for obj in bpy.data.objects:
    if 'outline' in obj.name:
        bpy.data.objects.remove(obj)

 

축방향으로 90도 돌리기

물건을 배치할 때 이게 어느쪽 방향으로 돌리는 게 맞지? 를 빠르게 확인하기 위한 용도

#Panel
row = layout.row()
row.operator("object.rotate_x", text="X") 
row.operator("object.rotate_y", text="Y")
row.operator("object.rotate_z", text="Z")

#operator
selected_objects = bpy.context.selected_objects

for obj in selected_objects:
	obj.rotation_euler.x += math.radians(90.0)

 

Y축따라 회전 복사

Array회전 버전. 문양같은 패턴을 만들기 위해 사용

n = 7
rot = pi / n * 2
        
for i in range(n-1):            
	bpy.ops.object.duplicate(linked=True)
	bpy.ops.transform.rotate(value=rot, orient_axis='Y', orient_type = 'GLOBAL')

 

도움 : chatGPT