总结Houdini中各方面数据的传递方式
Houdini中“数据”的“传递”
在我看来,Houdini中有多处存在着“数据”,并且他们可以相互“传递”。
明面上的“数据”有:
- 几何体的
属性
(Geometry Attribute) - 节点上的
参数
(Parameter)
而这些“数据”可能需要在其他地方引用,如:
- Python节点中的代码
- Vex节点中的代码
如果也将代码中的变量
看做是一个“数据”,那在代码中引用属性/参数
“数据”可以看做是:将属性/参数
“数据”传递到了变量
这个“数据”中。
如果考虑更深层次的开发如:
- 使用HoudiniEngine(或者说HAPI)在游戏引擎或其他美术软件(这里仅谈UE4引擎)的插件中与Houdini进行交互
- 使用HDK(Houdini Development Kit)对Houdini进行功能上的扩展
那么也可以看做是属性/参数
“数据”传递到了C++变量
中。
本篇的目标是:
- 简单讨论各个方面“数据”的基本概念
- 具体列举这些“数据”相互间传递的方式
基本概念
1. 几何体的属性(Geometry Attribute)
可以在Geometry SpreadSheet这个面板中看到:
属性(Attribute)分为:
- 点(Points) A point is simply a point in space as defined by four numbers (X, Y, Z, W).
- 顶点(Vertices) A vertex is a reference to a point. Primitives use vertices to reference points. For example, the corners of a polygon, the center of a sphere, or a control vertex of a spline curve.
- 图元(Primitives) refer to a unit of geometry, lower-level than an object but above points. Houdini supports several different types of primitives
- 全局(Details或者叫Global)
这些数据可以看做是在Houdini中各种运算的最终目标。
有些属性没有显示在界面中,比如高度场的数据,但我也将其归在这一类中。
2. 节点上的参数(Parameter)
参数可以是一个固定的值,或者是一个表达式。(表达式语法参考)
基本上,他们被视作完全由用户定义的数值,在运算中应该是不发生改变的。Python中可以修改参数,但如果这个行为是发生在节点已锁的情况下,则会失败并报错,所以我一般不会在Python中改变参数。
但并不是说参数的值一定是事先确定的,因为表达式可以引用【几何体的属性】而它可能会变化,此时就算节点是已锁的情况下也不会失败或报错。
3. Python节点
Python节点中的代码可以用HOM模块(Houdini Object Model)与Python交互,这是一个功能强大的模块,访问【几何体的属性】或【节点参数】这种基本的功能自然可以做到。(HOM模块代码参考)
但是其中的变量如果看做是一个“数据”,则外部是无法访问,因为它的作用域仅在这个节点的代码片段内。如果外部需要访问,就需要将“数据”转换为外部可以访问的形式了,比如存储为【几何体的属性】是我常用的方式。
4. Vex节点
Vex节点是一种类似“并行”的计算方式,可以选择以哪种属性(点?图元?)为单位来执行。
在代码中也有方式可以引用【几何体的属性】或【节点参数】的数据。速度上相比Python更快。
Vex函数参考
5. HoudiniEngine
对于不同的游戏引擎/美术软件,开发的环境不一样,例如对于UE4,即是编辑插件C++代码:
我在《简单梳理UE4的Houdini官方插件代码》有过对其的讨论。
6. HDK
此方面我也在学习。
《研究HDK(Houdini Development Kit):起点》讨论了一些关于HDK的基本概念。
《研究HDK(Houdini Development Kit):概括配置一个HDK工程的通用步骤》是具体配置一个新工程的通用步骤。
数据的传递方式
1.1 参数中引用其他参数
比较简单的操作方式是:
- 右键想要被引用的参数选择Copy Parameter
- 右键想要引用别人的参数选择Paste Relative Reference
1.2 参数中访问几何体的属性
在表达式语法参考中可以找到一些访问几何体属性的语法,例如:
上述表示访问../box1
这个节点的几何体的第3
个点属性,属性名为P
。
不过需要注意的是,对于“字符串”类型的属性,所用的表达式和一般的不同,因为“表达式”本身也是个“字符串”,会引起歧义。
- 首先,函数的名字一般是普通版的后面跟着一个s
- 其次,需要用“`”符号包围住表达式,算是对其中的表达式求值,而不是将“表达式”本身的字符看作为字符串。
2.1 Python中操控节点参数
“参数”归属于节点(hou.Node
),可以通过名字来找到参数:
而对于参数(hou.Parm
),有方法对其进行操控:
- 求值:
- 设置:
例子:
# 找到节点
node = hou.pwd().node("../box1");# 访问参数
parameter = node.parm("sizex");
# 测试打印
print(parameter)# 参数的值
value = parameter.eval();
# 测试打印
print(value)
2.2 Python中操控几何体的属性
需要先获取节点对应的几何体(hou.Geometry
)。其中有一些与属性相关的操作,例如:
- 获取全局类型的属性:
- 设置全局类型的属性:
- 添加一种新的属性:
而对于全局之外的属性,比如点,则需要获取更细级别的结构如hou.Point
,它有操控属性的方法:
例子:
#获得当前的节点:
node = hou.pwd()#获得当前节点的几何体
geo = node.geometry()#遍历所有的点
for p in geo.points(): #打印出“P”属性:print(p.attribValue("P"))
3.1 Vex中访问参数
Vex有方法可以获取各种类型的参数的值:
例如:
@P.y+=chf("../null1/test");
3.2 Vex中访问几何体的属性
如果是自身节点的几何体的属性,则比较方便,直接用“@”符号即可引用,例如:
@Cd = @P;
如果是其他的几何体,则需要用一些函数
可以通过下面方式找到这个节点:
- 通过输入引脚
- 通过节点路径
例如:
@Cd = point(1,"P",@ptnum);
这段代码表示用1
号输入的几何体的P
属性。另外由于是以点为单位运行,所以可以得到顶点的序号@ptnum
。
下面的代码用路径来引用节点(记住路径名前加op:
)
@Cd = point("op:../box2","P",@ptnum);
可以达到相同的功能:
4.1 使用HAPI操控节点的参数
在HAPI文档中可以找到多个对参数进行获取/设置的函数:
4.2 使用HAPI获取几何体的属性
在HAPI文档中可以找到多个对参数进行获取的函数:
5. HDK
目前我对于HDK的使用还较小。不过可以肯定的是:HDK是相对底层的,对很多东西都有控制,至于获得节点的参数,或者几何体的属性,一定可以做到
总结
总结来说,各方面“数据”之间 获得/修改 的关系如下:
扩展用法
有时候,我需要修改一个节点参数,而这个参数和几何体属性有关。但问题在于:如果我直接在参数表达式中获取几何体属性,我还需要做一些处理,而这些处理如果使用参数表达式的语法会相对麻烦,这时候我倾向的解决方式是:
在Python中获得几何体属性,在此处理我想要的参数的值/表达式,将值/表达式放在一个新的几何体属性中,例如叫“result”,那么参数即可直接读取“result”的结果
这样相当于用比较方便的Python替代参数表达式的逻辑了。
作为以上问题的一个延伸情况:
我的Vex代码内容也是“动态”的,而Vex节点的代码内容实际上也是个“参数”。所以我可以在比较方便的Python中计算出Vex代码,然后存到一个字符串类型的属性中例如叫“Code”,这样Vex节点的代码内容可以直接引用这个“Code”的值。
后续待实验问题
- HAPI中其实不仅有获得几何体属性的方法,也有设置几何体属性的方法。但是我还没有遇到过需要设置几何体属性的需求。关键在于:几何体属性应该被各种节点操作最后Cook出来,如果我使用HAPI对其进行了修改,那么结果到底有谁负责呢?还是说只能在节点冻结的时候才可以?此处后续待实验。
- Python如果修改其他节点的几何体会怎么样?理论上应该不会成功,此处待实验。
总结Houdini中各方面数据的传递方式相关推荐
- 用java向mysql数据库中插入数据为空
利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...
- 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析
前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...
- 取出json中的数据php,怎么从Json中取出数据放到一个新组中
如何从Json中取出数据放到一个新组中 JSON数据如下: { "CommunityModel": [ { " UUID ": "xxxxxx-xxx ...
- 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...
注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
最近因为需要学习了一下使用C#操作Excel表格,现在把我使用C#如何定制表格的过程提供给需要的兄弟: /*从数据库提取数据*/ string strconn="packet size=40 ...
- C#中读取数据库中Image数据
作者:未知 请与本人联系 DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据.但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据, ...
- linux数据库什么意思,Linux系统中的数据库命令是什么
Linux系统中难免会跟数据库打交道的时候,掌握数据库相关命令是很重要的.下面由学习啦小编为大家整理了Linux系统中数据库命令是什么的相关知识,希望对大家有帮助! Linux系统中的数据库命令是什么 ...
- 怎样在表格中选出同一类_3分钟教会你如何将不同表格中的数据关联在一起
原标题: 3分钟教会你如何将不同表格中的数据关联在一起 版权声明:本文为博主原创文章,未经博主允许不得转载. 智能输入 超级表格 微视频 关键词: 智能输入 关联不同表格 逻辑输入 「超级表格微视频」 ...
- Vue中组件数据的传递
Vue中组件的作用域是隔离的,父组件中的数值子组件看不到!也就是说,用angular作比喻,组件的scope天生是scope:()的! 如果父组件需要往子组件中传数据,此时应该使用标签属性: < ...
最新文章
- request和response一览
- Samsung Pay体验札记:或推支付新浪潮
- eclipse配置jdk问题
- php正规则表达式学习笔记(几个常用函数的区别)
- 超越培训班同学的独门绝技
- 计算机网络纳新水粉画,小学教育专业“书法诗画创作社团”顺利举办纳新活动...
- 图书管理系统(微信、后台、网页端)总结
- Netapp存储控制器接管
- Dreamweaver制作漂亮的网页Flash电子相册
- 创客匠人抖音小程序引流转化三步走
- Office2007 三合一绿色精简版
- SQL sever 查询及格率
- 关于iOS7越狱的整理
- Java LPT,使用Java对LPT端口进行编程。真?
- Windows多用户配置,不同用户不同访问权限
- Feign - Error while extracting response for type [class java.lang.String]
- Farkas'Lemma 和 S-Lemma
- 运维学python用不上_运维朋友们,别再问需不需要学 Python 了!
- Go语言框架Gin之4 安全认证
- FloorPlan相关
热门文章
- 英飞凌TLE9843-2QX下载bootloader与app程序过程分析及问题记录
- 如何将Notepad3添加到鼠标右键:【以Notepad3打开】以及【运行Notepad3】
- Oracle RAC安装实录
- 提高办公效率必学的键盘操作技巧
- 解决Win10缩放导致c# Winform字体模糊
- 华为照片权限在哪里找_华为手机位置权限在哪里打开
- android 小米定位失败怎么办,使用原生网络定位,部分机型无法获取经纬度该怎么解决?...
- 混检阳性概率的计算(贝叶斯定理的一个应用例)
- 3.11 怎么增加小红书评论区的互动?【玩赚小红书】
- android加载长图片的方法