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文件时有用,但在当前的代码中它们被注释掉了,以避免在运行时执行。

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

posted on 2024-04-18 13:50  大话人生  阅读(442)  评论(0编辑  收藏  举报