一、建立联合

按照这个文档做:

【Blender】使用 Microsoft Visual Studio Code 作为外部 IDE 来编写 Blender 脚本/附加组件

二、代码

下面几个代码的学习视频来自:https://space.bilibili.com/361360399

1.做一个小panel

import bpy

def importFspy(filepath=""):
    if filepath=="":
        print("Filepath ERROR!")
        return
    bpy.ops.fspy_blender.import_project(filepath=filepath)
#    bpy.context.space_data.recent_folders_active = 2
    fspyCamera=bpy.ops.object.camera_add(enter_editmode=False, align='VIEW', location=(0, 0, 0), rotation=(1.17015, 0.0126065, 0.913338), scale=(1, 1, 1))
    print(fspyCamera)
    
    
def main():
    filepath=r'D:\Projects\Nerf\nerfstudio&blender\road_sequence\kitti.mars_kitti-MOT.data_tracking_image_2.training.image_02.0005\fspy\000000.fspy'
    importFspy(filepath)
    
    

    
if __name__ == "<run_path>":
    main()
    print("234")

效果:
在这里插入图片描述

2. 给选定的物体更换好多好多材质

change_textures.py 获取“某一个文件夹下面所有文件夹中blender文件,也可以是某一个文件夹下面的blender文件”中的所有材质,并复制给该选定的物体的材质中。

from typing import Set
import bpy
import time
from bpy.types import Context
from pathlib import Path

if __name__ == "<run_path>":
    # 定义存放材质的文件夹
    target_dir_in_str="D:/test/Blender_test/texture_learning"
    # 获取到target_dir_in_str下每一个文件夹里面的每一个blender文件里面的材质
    pathlist=Path(target_dir_in_str).glob('**/*.blend')
    # 将每个blend文件里的材质放在本blend文件的Material文件夹下
    from pathlib import Path
    # 定义存放材质的文件夹
    target_dir_in_str="D:/test/Blender_test/texture_learning"
    # 获取到target_dir_in_str下每一个文件夹里面的每一个blender文件里面的材质
    pathlist=Path(target_dir_in_str).glob('**/*.blend')
    # 将每个blend文件里的材质放在本blend文件的Material文件夹下
    for path in pathlist:
        # 将路径对象转换到字符串
        path_in_str= str(path)
        with bpy.data.libraries.load(path_in_str) as (data_from,data_to):
            if len(data_from.materials)>0:
                path_in_str+="\\Material\\"
                for matName in data_from.materials:
                    bpy.ops.wm.append(filename=matName,directory=path_in_str)
                    mat=bpy.data.materials.get(matName)
                    bpy.context.active_object.data.materials.append(mat)

在这里插入图片描述

setting_mat_for_selected_obj.py 每隔step长度的时间给选定物体更换一次材质,并渲染出来

import bpy

if __name__ == "<run_path>":
    startFrame = 1
    endFrame = 21
    step = 1  # 每五帧切换一次材质
    scene = bpy.context.scene
    scene.render.engine = 'CYCLES'  # 设置为cycles模式
    fp = scene.render.filepath  # 得到渲染的文件目录
    scene.render.image_settings.file_format = 'PNG'  # 输出的文件格式
    scene.cycles.samples = 1  # 输出的文件最大采样为1
    scene.render.resolution_x = 1920
    scene.render.resolution_y = 1080

    bpy.ops.object.mode_set(mode='OBJECT') # 先限定到物体模式
    bpy.ops.object.select_all(action='DESELECT')  # 为了选定某个物体操作,所以先不要选择所有物体
    bpy.ops.object.select_pattern(pattern="Teapot.001", case_sensitive=False, extend=True)# 通过select_pattern命令来按照物体命名查找选定物体,支持通配符*模糊匹配

    obj = bpy.context.object
    all_materials = obj.data.materials
    no_of_materials = len(all_materials)
    print("number of all_materials:", str(no_of_materials))
    obj.active_material_index = 0  # 初始材质的序号

    for frame_nr in range(startFrame, endFrame):
        scene.frame_set(frame_nr) # 设定关键帧
        print("frame_nr:", frame_nr)
        if frame_nr % step == 0: # 每五次换一次材料
            print("changing material~~~~")
            bpy.ops.object.mode_set(mode='EDIT') # 进入编辑模式
            bpy.ops.mesh.select_all(action='SELECT') #选择所有
            obj.active_material_index = obj.active_material_index+1 #材质序号加一
            bpy.ops.object.material_slot_assign() # 将材质指定给所有
            bpy.ops.object.mode_set(mode='OBJECT') # 切换到物体模式

        obj.data.update()

        scene.render.filepath = fp + str(frame_nr)
        bpy.ops.render.render(write_still=True)

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐