• [Blender] Blender 获取 Instance 的信息


    最近希望用 Blender 生成 Instance 的能力,将生成的导入游戏引擎中来渲染。Instance Rendering 是个好东西,特别是针对大场景,渲染成批的基本相同的物体的时候非常有用。

    希望能用 Blender 做一些模板出来,通过改变输入的参数,来得到 Blender 给我们计算出来的结果。

    这里我拿 Geometry nodes 来做实验,我新建了一个 Geometry Graph 如下图所示:

    img

    很简单的功能,就是在 Curve 上采样一些点,来生成几何体,这些几何体都是相同的 Mesh,所以用 Instance 生成最好不过了。目前的数据还比较简单,我们想要的其实就是这些几何体的位置。我们可以写如下脚本来控制参数(采样数量 count)以及输出 Instance 的 Transform Matrix 。

    有几个 Tips

    1. 如果是在 Blender 的 GUI 内部运行 Python 脚本,那么在脚本中 print 的信息是没法在 Blender 的 GUI 上输出的。一个比较简单的方法是,从命令行运行 Blender,这样print的信息就会输出在这个控制台上,比如 Mac:
    ./Applications/Blender.app/Contents/MacOS/Blender
    
    1. 如果需要写 Blender 脚本,强烈建议打开 PythonTooltips,(Edit->Preference->Interface->PythonTooltips) 这个功能可以在 Blender 的 GUI 界面上显示某个属性对应的 Python 接口,非常方便,只需要将光标悬停在上面即可,如下图所示:

    img

    下面是脚本部分,主要做了两件事情:

    1. 从控制台获取参数,修改 Geometry Nodes 里 node 的参数
    2. 获取生成的 Instance 的 Transform Matrix

    这有一个坑,就是在设置完 node 的参数后,需要调用一下bpy.context.view_layer.update,不然在后面获取 Instance Data 的时候没办法获取最新的值。

    import sys
    import bpy
    
    # get args from console
    count = int(sys.argv[-1])
    
    C = bpy.context
    depsgraph = C.evaluated_depsgraph_get()
    
    # set geometry node parameter
    bpy.data.node_groups["test"].nodes['Resample Curve'].inputs[2].default_value = count
    
    # make sure call this method to update data!!
    bpy.context.view_layer.update()
    
    data = []
    
    # if the object is instance, we can record its value of transform matrix
    for object_instance in depsgraph.object_instances:
        obj = object_instance.object
        if object_instance.is_instance:
            print(object_instance.matrix_world)
            data.append(object_instance.matrix_world)
    print("count: ", len(data))
    

    我们尝试运行一下:

    export PATH=$PATH:/Applications/Blender.app/Contents/MacOS
    Blender instanceData.blend --background --python script.py -- 3
    

    控制台输出为:

    
    
    
    count:  3
    
    Blender quit
    

    完整的 project https://github.com/MangoWAY/BlenderDemo

  • 相关阅读:
    Xilinx 7系列 clock IP核的使用(二)
    jenkins 安装 2.377版本主要阻塞问题
    php伪随机数
    基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】
    make riscv.obj on x86: 交叉编译
    SpringMVC ---- RESTful
    Linux kretprobe使用和原理
    深度学习之PyTorch实战(4)——迁移学习
    DataFrame和list之间相互转换:df.values.tolist()和pd.DataFrame()
    怎么看一上副业项目适合不适合自己
  • 原文地址:https://www.cnblogs.com/WAoyu/p/16611526.html