오늘은 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으로 설정해줘야 한다.
'실습 & 활동 > Computer vision' 카테고리의 다른 글
[Gaussian Splatting] Colmap vs. Correct camera parameter (0) | 2024.04.12 |
---|---|
[Colmap] 2D Image → 3D Resconstruction with Colmap (0) | 2024.03.29 |
[Objaverse] 데이터셋 다운로드 (0) | 2024.03.25 |
[PTAM] 실습 (0) | 2024.03.20 |
[Blender] Image to Video (PNG → mp4) (0) | 2024.03.12 |