IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 小工具:输出Houdini里节点间参数的差别 -> 正文阅读

[游戏开发]小工具:输出Houdini里节点间参数的差别

需求

节点的参数影响了节点的行为。因此对于节点使用者来说,比较节点间参数的差异就可以明白其行为的差异了。

然而有些节点的参数数量实在太多,比较其参数间的差异会比较麻烦,在没有工具的情况下只能来回在节点间跳转才能比较出参数的不同。

我想,其实可以使用Houdini的Python模块写代码来自动比较并输出不同,这并不麻烦。最后如果能输出更易于阅读的格式(比如csv表格,或Markdown表格语法)会让比较更高效。

另外,我还假定了被比较的节点的类型都是一样的,因此这让代码更为简单——只需要按顺序访问参数就行了,因为参数的顺序一定是一样的。

比较两个节点参数差别

仅对比两个节点的代码是很简单的。
比如我放了两个box节点,并将缩放参数调整得不一样。

#两个对比的节点:
node1 = hou.node("../box1");
node2 = hou.node("../box2");

#节点的参数个数
parmCount = len(node1.parms());

#遍历所有参数寻找其中不同的值
for i in range(parmCount) :
    if(node1.parms()[i].eval() != node2.parms()[i].eval()):
        message = "";
        message += node1.parms()[i].description()
        message += " " + str(node1.parms()[i].eval()) + " " + str(node2.parms()[i].eval())
        print(message)

则输出:

Uniform Scale 1.0 3.11

多节点比较

当考虑多节点时,就以第0个为参照,其他节点都和它比较,只要有一个节点不一样,就输出这个参数所有节点的值。
比如我放了三个box节点,第二三个各有一个参数和第一个不一样。

#要对比的节点们:(以第0个为参照)
nodes = [];
nodes.append(hou.node("../box1"));
nodes.append(hou.node("../box2"));
nodes.append(hou.node("../box3"));

#节点的参数个数
parmCount = len(nodes[0].parms());

#遍历所有参数寻找其中不同的值
for i in range(parmCount) :
    allsame = True; #参数是否都一样
    message = "";   #信息,仅在有参数不同时才予以显示
    message += nodes[0].parms()[i].description()        #参数名
    message += " " + str(nodes[0].parms()[i].eval())    #参照节点的参数值
    for j in range(len(nodes)-1):
        #参数不同,写上值
        if(nodes[j+1].parms()[i].eval() != nodes[0].parms()[i].eval()): 
            allsame = False;
            message += " " + str(nodes[j+1].parms()[i].eval())
        #参数相同:省略值
        else:
            message += " -"
    if not allsame :    #仅在有参数不同时输出信息
        print(message)

输出:

Size 1.0 - 1.9
Uniform Scale 1.0 3.11 -

输出MarkDown表格语法

MarkDown表格语法也是在CSDN博客中可以使用的。

比如

| Syntax | Description |
| - | - |
| Header | Title |
| Paragraph | Text |

在博客中将会变为:

SyntaxDescription
HeaderTitle
ParagraphText

另外,当前的menu型参数会直接输出数字,可读性较差。
hou模块有接口读到menu:
在这里插入图片描述
当失败时会有异常。可以根据此判断是否是menu。


因此,最终代码修改为:

#要对比的节点们:(以第0个为参照)
nodes = [];
nodes.append(hou.node("../box1"));
nodes.append(hou.node("../box2"));
nodes.append(hou.node("../box3"));

#MarkDown表格前两行:
line1 = "| - | "
line2 = "| - | "
for n in range(len(nodes)):
    line1 += nodes[n].name() +" |"
    line2 += "- |"
print(line1)
print(line2)

#节点的参数个数
parmCount = len(nodes[0].parms());

#获得参数的值,如果是menu则会输出menu的值
def GetParmMessage(p):
    try:
        p.menuLabels()
    except hou.OperationFailed:
        return str(p.eval())
    else:
        if(isinstance(p.eval(),int)):
            return p.menuLabels()[p.eval()]
        else:
            return str(p.eval());

#遍历所有参数寻找其中不同的值
for i in range(parmCount) :
    allsame = True; #参数是否都一样
    message = "| ";   #信息,仅在有参数不同时才予以显示
    message += nodes[0].parms()[i].description()                #参数名
    message += " | " + GetParmMessage(nodes[0].parms()[i]) + " |"   #参照节点的参数值
    for j in range(len(nodes)-1):
        #参数不同,写上值
        if(nodes[j+1].parms()[i].eval() != nodes[0].parms()[i].eval()): 
            allsame = False;
            message += " " + GetParmMessage(nodes[j+1].parms()[i])+ " |"
        #参数相同:省略值
        else:
            message += " - |"
    if not allsame :    #仅在有参数不同时输出信息
        print(message)

将box节点的一个menu型参数修改下。
输出:

| - | box1 |box2 |box3 |
| - | - |- |- |
| Primitive Type | Polygon | - | NURBS |
| Size | 1.0 | - | 1.9 |
| Uniform Scale | 1.0 | 3.11 | - |

将这段直接复制到博客中就会变成:

-box1box2box3
Primitive TypePolygon-NURBS
Size1.0-1.9
Uniform Scale1.03.11-

在一个复杂的例子中尝试

Downloadable fabrics是Houdini官方关于Vellum布料模拟的一些展示性效果
在这里插入图片描述

工程文件可在这里下载。

我建立了一个默认的Vellum布料配置,然后尝试将其与当前的八个布料配置进行比较

#要对比的节点们:(以第0个为参照)
nodes = [];
nodes.append(hou.node("../default"));
nodes.append(hou.node("../vellumcloth6"));#Jersey
nodes.append(hou.node("../vellumcloth3"));#RainCoat
nodes.append(hou.node("../vellumcloth11"));#tulle with embroidery
nodes.append(hou.node("../vellumcloth15"));#Jeans
nodes.append(hou.node("../vellumcloth9"));#Velvet
nodes.append(hou.node("../vellumcloth8"));#Silk
nodes.append(hou.node("../vellumcloth_wool"));#Wool
nodes.append(hou.node("../vellumcloth10"));#Leather

...

结果如下:

-defaultvellumcloth6vellumcloth3vellumcloth11vellumcloth15vellumcloth9vellumcloth8vellumcloth_woolvellumcloth10
Density0.10.040.250.040.40.020.040.040.4
ThicknessCalculate UniformCalculate VaryingCalculate VaryingCalculate Varying-Calculate VaryingCalculate VaryingCalculate Varying-
Edge Length Scale0.25-----0.2--
Normal Drag10.040.0-80.0-40.080.080.0-
Tangent Drag0.10.41.00.45.040.00.80.42.0
Stiffness1.0---100000000.0---100000000.0
Damping Ratio0.001---0.0001---0.0001
Stiffness1.00.15---2.0--2000.0
×1e-70.000 011110 0000.000 10.000 1-1
bendstiffnessscalemodeNo Scaling--Scale by Attribute-----
Damping Ratio0.01-0.0075---0.1--
Rest Angle Scale1.0-2.02.0-----
dobendstiffnessfalloff0-1------
Stiffness Dropoff0.085.048.085.055.085.070.085.055.0
bendstiffnessfalloffdirIncreasingDecreasingDecreasingDecreasing-DecreasingDecreasingDecreasing-
dobendstiffnessdropoffmin0-1-1----
Min Stiffness0.0-5e-06-0.0001----
Enable Plasticity011-11-11
Threshold10.00.115.0-35.01.0-0.0053.0
Rate1.00.250.3-5.02.0--6.0
Hardening1.00.3--5.02.0--0.5
Promotion MethodAverage---Use Target---Use Target
Tagdefaultvellumcloth6vellumcloth3vellumcloth11vellumcloth15vellumcloth9vellumcloth8vellumcloth_woolvellumcloth10

通过这个列表,就可以知道哪些参数有改变,即我需要关注哪些参数了。


问题记录:

运行python脚本的时候会有报错:
在这里插入图片描述
这个问题我在Python 排错UnicodeEncodeError ‘ascii’ codec can’t encode character 错误解决方法 - 授客 - 博客园找到了解决方法,即先运行这段代码:

import sys

reload(sys)

sys.setdefaultencoding('utf8')

之后就没有报错了

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:48:06  更:2021-10-12 23:48:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:30:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码