본문 바로가기
실습 & 활동/Computer vision

[Blender] Data file 한 번에 Import → Render

by sim0609 2024. 3. 26.

오늘은 3D object를 blender에서 import해서, 여러 파일에 존재하는 .fbx(3D object)를 한 번에 rendering하는 코드를 만들어 봤다. 일단 rendering과 관련한 주요 함수들은 이미 다 제공된 상태라 내가 할 일은 어떻게 한꺼번에 여러 파일들을 순회하며 각 파일에 존재하는 .fbx(3D object)를 import하는 logic만 설정하면 됐다.

 

내가 사용한 함수는 크게 3가지인데, 각 함수에 대해 자세히 설명하려 한다.

def load_fbx_file(input_path)

→ return folder_list, folder_path

위 함수는 input_path에 여러 파일이 존재하는 경로(C:\Users\user\Desktop\blender_python\add_on\add_on_input)만 넣어주면, 각 파일을 순회하면서 각 파일 이름과 각 파일 안에 존재하는 .fbx 파일의 경로를 저장해주는 함수이다.

def import_and_render_fbx(input_path, output_path)

위 함수는 현재 Scene을 초기화하고, .fbx가 존재하는 경로를 이용해 각 파일의 .fbx(3D object)를 Scene에 import한다. 그리고나서 camera와 light 설정을 하고 현재 Scene으로부터 2D image를 rendering할 준비를 하는 단계이다. 

def process_render(input_path)

위 함수는 load_fbx_file(input_path)로부터 각 파일(Scene1, Scene2, Scene3)과 각 파일의 .fbx가 존재하는 경로를 이용해 2D image의 rendering 결과를 내가 원하는 경로(C:\Users\user\Desktop\blender_python\add_on\add_on_output)에 입력 파일과 동일한 이름으로 저장되도록 설정한다.

코드

def load_fbx_file(input_path): # .fbx 파일 목록 생성
    folder_list = []
    folder_path = []

    # base_folder 아래의 모든 하위 폴더를 탐색
    for name in os.listdir(input_path):
        subfolder_path = os.path.join(input_path, name)

        if os.path.isdir(subfolder_path):  # 하위 폴더인지 확인
            print(f"FBX files in {name} folder:")
            fbx_files_found = False

            for file in os.listdir(subfolder_path):
                if file.lower().endswith('.fbx'):
                  print(os.path.join(subfolder_path, file))
                  folder_path.append(os.path.join(subfolder_path, file))
                  fbx_files_found = True
                  break
            
            folder_list.append(name)

            if not fbx_files_found:
                print("No FBX files found.")
            print("")
    
    return folder_list, folder_path

    
def import_and_render_fbx(input_path, output_path): # .fbx 파일을 임포트하고 렌더링하는 함수
    # .fbx 파일 임포트
    empty_scene()
    bpy.ops.cc3.importer(param="IMPORT", filepath=input_path)
    move_and_scale_scene()

    # 렌더링 설정
    set_cam()
    bpy.context.scene.CustomProperty.apply_light_mode()
    render_with_multiple_cameras(output_path)


def process_render(input_path):
    fbx_files = load_fbx_file(input_path)[1]
    fbx_folders = load_fbx_file(input_path)[0]
    init_save_path = bpy.context.scene.save_path

    for fbx_file, fbx_folder in zip(fbx_files, fbx_folders):
        output_path = init_save_path + fbx_folder
        import_and_render_fbx(fbx_file, output_path)

 

** 추가 사항

blender는 object를 import할 때 Z축으로 object를 세워 놓기 때문에 Y축으로 object를 눕히고 싶을 때, x축의 rotation을 -90으로 설정해줘야 한다.