首页 > 其他分享 >[Blender] Blender 获取 Instance 的信息

[Blender] Blender 获取 Instance 的信息

时间:2022-08-22 00:55:14浏览次数:85  
标签:count instance 获取 object Instance bpy Blender

最近希望用 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

控制台输出为:

<Matrix 4x4 (1.0000, 0.0000, 0.0000, 0.0000)
            (0.0000, 1.0000, 0.0000, 0.0000)
            (0.0000, 0.0000, 1.0000, 0.0000)
            (0.0000, 0.0000, 0.0000, 1.0000)>
<Matrix 4x4 (1.0000, 0.0000, 0.0000, 0.0000)
            (0.0000, 1.0000, 0.0000, 0.0000)
            (0.0000, 0.0000, 1.0000, 1.7000)
            (0.0000, 0.0000, 0.0000, 1.0000)>
<Matrix 4x4 (1.0000, 0.0000, 0.0000, 0.0000)
            (0.0000, 1.0000, 0.0000, 0.0000)
            (0.0000, 0.0000, 1.0000, 3.4000)
            (0.0000, 0.0000, 0.0000, 1.0000)>
count:  3

Blender quit

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

标签:count,instance,获取,object,Instance,bpy,Blender
From: https://www.cnblogs.com/WAoyu/p/16611526.html

相关文章

  • JMeter While循环控制器应用之遍历获取文件参数
    While循环控制器应用之遍历获取文件参数by:授客QQ:1033553122测试环境JMeter-5.4.1应用实现单线程在单次迭代内遍历获取文件参数说明:上图仅给出关键配置信息注意:......
  • 获取并安装个人单域名免费证书
    通过华为云登录,然后从云证书管理服务进入后,可以申请免费ssl证书,这类证书是单域名证书。如果这个证书部署在自己的云服务器上,那么就参照相关说明,如果是要部署在腾讯云云开发......
  • Spring中获取bean的方式
    1.获取bean在上图的测试类中我们是通过id来获取bean的。实际上获取bean的方式有很多种,下面我们就一一说明。1.1方式一:根据id获取由于id属性指定了bean的唯一标......
  • JSON_语法_值得获取
    JSON_语法_值得获取json对象.键名json对象["键名"]数据对象[索引]获取值:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</......
  • [记]用blender建模个锤子
     1.基础操作非编辑模式下shift+a创建基础立体图形;a:全选x:删除g:移动立体图形,沿轴+x,y,z;r:旋转图形s:缩放图形tab:切换编辑模式编辑模式下1,2,3对应点,线,面;alt+z:......
  • python获取返回的json中的某个字段值的函数
    响应报文的json一般为字典或者是列表嵌套字段的形式     defget_json_value(a,k,l:list):""":parama:传入的数据:paramkey:获取哪个字段值......
  • js获取video的暂停、播放事件,并切换清晰度
    1、video是H5新增的视频标签,在项目上用的最多的功能就是:(1)暂停的时候显示广告图片(图片有跳转链接)(2)切换清晰度后,视频按切换前播放时间继续自动播放(或者暂停播放)2、需要准......
  • 批量获取QQ群成员号码
    这个方法的原理是用js代码获取html元素里的内容,因为内容都是QQ号,获取完之后代码会自动返回获取的所有QQ号。varqq_sl=document.getElementById("groupMemberNum");varq......
  • JSON概念和JSON语法的定义与值的获取
    JSON概念概念: JavaScript Object NotationJavaScript对象标记法var p={"name":"张三","age":23,"gender":"男"}; json现在多用于存储和交换文本信息的语法......
  • mybatis获取参数值
    封装SqlSessionUtils/**  *获取SqlSession  *@paramb是否自动管理事务  *@return返回sqlsession  */  publicstaticSqlSession......