blender python api 使用指令碼批次對obj物體進行渲染(obj所在目錄要有與之對應的mtl檔案才行)

大话人生發表於2024-04-18

1.obj所在目錄要有與之對應的mtl檔案才行

2.場景中有攝像機,並調整好渲染角度

3.場中中調整好燈光設定

4.執行程式碼

程式碼:

import bpy  # 匯入Blender的Python API介面
import pathlib  # 匯入pathlib模組,用於操作檔案路徑

# 設定OBJ檔案所在的目錄路徑
obj_root = pathlib.Path('D:\\ceshi')  # 注意Windows路徑中的斜槓需要轉義

# 取消選擇場景中的所有物體,以便匯入時不會與已選擇的物體衝突
bpy.ops.object.select_all(action='DESELECT')  # 取消選擇所有物體
render = bpy.context.scene.render  # 獲取當前場景的渲染設定

for obj_fname in obj_root.glob('*.obj'):  # 遍歷指定目錄下所有的OBJ檔案
    print("jin ru ")  # 列印資訊,表明開始匯入某個OBJ檔案
    
    # 匯入OBJ檔案
    bpy.ops.wm.obj_import(filepath=str(obj_fname))  # 執行OBJ檔案匯入操作
    
    # 設定渲染輸出的檔案路徑,使用OBJ檔案的名稱(不包含副檔名)作為基礎
    render.filepath = f'//renders/obj-{obj_fname.stem}'  # 使用f-string簡化字串格式化
    bpy.ops.render.render(write_still=True)  # 執行靜態影像渲染
    
    # 記住剛剛匯入的網格,以便稍後從記憶體中刪除它們
    meshes_to_remove = []
    for ob in bpy.context.selected_objects:  # 遍歷所有被選擇的物件
        meshes_to_remove.append(ob.data)  # 將物件的資料(網格)新增到待刪除列表
    
    # 刪除場景中的物體,注意use_global=False表示僅在當前場景刪除物體
    bpy.ops.object.delete(use_global=False)
    
    # 從記憶體中刪除這些網格,以避免記憶體洩漏
    for mesh in meshes_to_remove:  # 遍歷待刪除的網格列表
        bpy.data.meshes.remove(mesh)  # 從Blender的資料儲存中移除網格

    # 如果需要測試單個檔案處理,可以在此處取消註釋break語句
    # break  # 僅在測試時使用,用於中斷迴圈

    # 如果需要匯出OBJ檔案,可以取消註釋以下語句
    # bpy.ops.wm.obj_export(filepath=obj_path)  # 匯出OBJ檔案

請注意,我使用了原始字串(r'D:\ceshi')來表示Windows路徑,這是因為在字串前面加上了r,表示這是一個原始字串,其中的反斜槓不會被當作跳脫字元。

另外,我使用了f-string來簡化字串的格式化,這是一種更現代和更簡潔的字串格式化方法。

此外,我還保留了breakbpy.ops.wm.obj_export運算子的註釋,因為它們可能在測試或匯出OBJ檔案時有用,但在當前的程式碼中它們被註釋掉了,以避免在執行時執行。

如果你不需要這些操作,可以完全刪除這些行。

相關文章