블렌더로 장면의 객체 바꾸기

11798 단어 Blender2.8블렌더
3D 모델을 만들면
작업 도중의 데이터를 남긴 상태로 작업하고, 별도 출력용으로 정리한 파일을 별도 작성하는 일이 있을까 생각합니다

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')

통합 파일에서 대체할 객체를 선택하고
스크립트를 실행하면 파일 선택 대화 상자가 나타납니다.
모델링용 파일을 선택하면 같은 이름의 객체의 메쉬 데이터로 바꿉니다.

메쉬의 데이터를 바꾸는 조작이 되기 위해
수정자와 머티리얼은 통합 파일의 것을 사용합니다.

주의점으로서 모델링 등의 조정으로 머티리얼이나 정점 그룹의 순서를 변경하지 마십시오.

아직 테스트중인 코드가되기 때문에
사용성 등 시험해 주시면 기쁩니다.

좋은 웹페이지 즐겨찾기