블렌더로 장면의 객체 바꾸기
11798 단어 Blender2.8블렌더
작업 도중의 데이터를 남긴 상태로 작업하고, 별도 출력용으로 정리한 파일을 별도 작성하는 일이 있을까 생각합니다
Blender에서는 특히 수정자 등으로 복수의 오브젝트를 조합한 것으로부터
수정자의 적응과 결합으로 최종 객체로 변환하는 경우도 많습니다.
이러한 통합 모델의 미세 조정이 필요하다면 어떻게 해야 합니까?
어펜드로 모델링용의 파일로부터 데이터를 읽어들이는 방법도 있습니다만, 조정에는 몇개의 순서가 필요합니다
통합된 파일의 데이터를 미세 조정된 데이터로 대체하는 스크립트를 작성했습니다.
Blender2.8용 스크립트입니다.
(Blender2.7계도 거의 같은 코드로 움직입니다만 조정의 필요한 개소가 많기 때문에 또의 기회에)
replace_obj.py
import bpy
import os
from bpy.props import StringProperty
from bpy_extras.io_utils import ImportHelper
#ファイルオープン 単独ファイルのみ
class IMPORT_OT_OBJ(bpy.types.Operator, ImportHelper):
bl_idname = "replace_object.object"
bl_description = 'Replece Object from selected file'
bl_label = "replace object"
filepath: StringProperty(
name="input file",
subtype='FILE_PATH'
)
filename_ext : ".blend"
filter_glob: StringProperty(
default="*.blend",
options={'HIDDEN'},
)
def execute(self, context):
# インフォエディッタにファイル名を出力
self.report({'INFO'},self.filepath)
#今シーンで選択されているオブジェクト
selected_objects = context.selected_objects
#ファイル内の同名のオブジェクトのアペンド
self.append_objects(selected_objects)
return{'FINISHED'}
def append_objects(self, objects):
obj_name_list = [obj.name for obj in objects]
blendfile = self.filepath
# データの読み込み
with bpy.data.libraries.load(blendfile, link=False) as (data_from, data_to):
data_to.objects = [name for name in data_from.objects if name in obj_name_list]
# (data_from.objectsは名前のリスト)
read_data = data_to
for i,ref_obj in enumerate(read_data.objects):
if ref_obj is None:continue
if ref_obj.type != objects[i].type:continue
linked_objects = get_linked_objects(objects[i])
for obj in linked_objects:
replace_data(ref_obj, obj)
def get_linked_objects(ref_obj):
datablock = ref_obj.data
linked_objects = []
for obj in bpy.data.objects:
if obj.data == datablock:
linked_objects.append(obj)
return(linked_objects)
def replace_data(obj_from,obj_to):
if obj_from.type == 'MESH':
# 頂点グループの状態を読み込みオブジェクト合わせえる
obj_to.vertex_groups.clear()
for grope in obj_from.vertex_groups:
obj_to.vertex_groups.new( name = grope.name )
# Dataに付加されたマテリアルを選択オブジェクトに合わせる
for i,mat in enumerate( obj_to.data.materials):
obj_from.data.materials[i] = mat
# 読み込みオブジェクトのデータを選択オブジェクトにリンク
obj_to.data = obj_from.data
def register():
bpy.utils.register_class(IMPORT_OT_OBJ)
def unregister():
bpy.utils.unregister_class(IMPORT_OT_OBJ)
if __name__ == "__main__":
register()
# test call
bpy.ops.replace_object.object('INVOKE_DEFAULT')
통합 파일에서 대체할 객체를 선택하고
스크립트를 실행하면 파일 선택 대화 상자가 나타납니다.
모델링용 파일을 선택하면 같은 이름의 객체의 메쉬 데이터로 바꿉니다.
메쉬의 데이터를 바꾸는 조작이 되기 위해
수정자와 머티리얼은 통합 파일의 것을 사용합니다.
주의점으로서 모델링 등의 조정으로 머티리얼이나 정점 그룹의 순서를 변경하지 마십시오.
아직 테스트중인 코드가되기 때문에
사용성 등 시험해 주시면 기쁩니다.
Reference
이 문제에 관하여(블렌더로 장면의 객체 바꾸기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yukimituki11/items/2bd5363d6f79f421c814텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)