February 19, 2023

Houdini Python(二)

阅读本篇的前提,是了解了python的语法结构,如果有什么不清楚的请阅读我的上一篇文章。

https://zhuanlan.zhihu.com/p/109349860

之后的文章将只讲述Hpython。

这次我先总结一些关于如何使用的小的Tips,仅我个人观点。

  1. 关于查询对应的属性调用,请把鼠标光标放在你想查询的属性面板上,根据提示就可以知道对应属性。

Parameter即是属性的真名(这让我想起了神话的真名设定)

  1. 节点创建的名称查询的提示
    创建一个节点可以使用create系列的创建函数,然后写入你想要创建的节点即可。节点的名字一般的情况下是他的名称去除末尾的数字例如下图。

但是是有例外的,例如mantra节点,如果直接使用mantra无法创建该节点,这时候需要使用node.type().name() 来获取到你需求的节点的名字。然后就获得了mantra其实名字叫”ifd”.

  1. 关于功能上的查询,比如你想实现一个快捷操作的功能,最快的方法就是抄轮子了,但是如果没有轮子的情况下怎么办,由于houdini我目前没有发现和maya,max的操作代码返回的功能,所以我的解决办法就是看库。

    如下图所示,houdini 已经将库的类分门别类的整理好,并且有一句话概括,这样就可以根据个人需求去对应的类型里查找需要的功能。

    我个人认为最快捷有效的学习方法就是查阅对应的帮助文档和对应的官方教程。

还有就是查阅帮助,我认为并不是需求要背会,或者百分百掌握,而是会使用它完成个人需求,所以不要对帮助的查阅产生恐惧心理。

4.请学会看错误提示
很多时候,但你写完你的需求运行时,会出现错误,导致无法获得想要的结果,这时对应的ide会返回错误提示信息,这里说下python shell

例如上图,请看最后一行,提示名称错误,然后对细节进行了解释。

上图爆出了一大段错误提示,看不懂的部分没事,只要获取我们有效的信息就行,一般就在最后一行, 提示节点的类型名称错误。

其他的错误也同理。

最后,如果你想验证自己到底会不会用了,那么请去实践,如果没有想法,可以去实现一个abc文件导入搭建初始场景的功能,我相信当你实现了这个功能就会对hpython 有个初步的认知。

对了,我要简要描述下如何将你的功能放到工具架上使用,可以在工具架上选择“+”号添加你的个人工具架,然后再工具架上右键 “New Tool…” 然后将你写好的功能拷贝到“Script”中,然后保存就可以使用了,关于更加细节的如何自定义包体,icon,导入库,之后我会新文章中进行阐述。

下面是我个人的abc文件导入的代码,可以给你少许参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#__version__ = "2.0"
# -*- coding: utf-8 -*-

__author__ = 'Gong Sheng'


import os
import hou


def findFile(filePath,fileType):
flieList = {}
for dirpath,dirnames,filenames in os.walk(filePath):
for filename in filenames:
if os.path.splitext(filename)[1] in fileType:
value=dirpath[len(filePath)+1:]
value=value.replace('\\','/')
flieList[filename] = value
else:
continue
return flieList

def cs():



if hou.hipFile.basename() == 'untitled.hip':
print 'Please create a project'
else:
fileType=['.abc','.fbx','.obj']
filePath = os.path.dirname(hou.hipFile.path())
fileList= findFile(filePath,fileType)

nodeplane = hou.node('/obj')
Word_Xfrom = nodeplane.createNode('null','Word_Xfrom')

EditNode =nodeplane.createNode('geo','Edit')
EditNode.setColor(hou.Color((1,0,0)))

for details in fileList.items():
#houdini hip path
if len(details[1]) != 0:
filePath = '$HIP/'+details[1]+'/'+details[0]
else:
filePath = '$HIP/'+details[0]

if 'abc' in details[0].rsplit(".")[-1]:
if 'cam' in details[0].rsplit(".")[0][0:3].lower():
abcNode = Word_Xfrom.createOutputNode('alembicarchive','Abc_'+details[0][:-4])
abcNode.setParms({"fileName":filePath})
abcNode.parm('buildHierarchy').pressButton()
camshape=abcNode.children()[0].children()[0]
camshape.setParms({'resx':1920,'resy':1080})
camshape.setParmExpressions({'near':'0.001'})

else:
abcNode = Word_Xfrom.createOutputNode('geo','Abc_'+details[0][:-4])
importAbcNode=abcNode.createNode('alembic','ABC_'+details[0][:-4])
importAbcNode.setParms({'fileName':filePath})


elif 'fbx' in details[0].rsplit(".")[-1]:

fbxNodes=hou.hipFile.importFBX(filePath)
fbxNode=list(fbxNodes)[0]
fbxNode.setColor(hou.Color((0.976,0.78,0.263)))

elif 'obj' in details[0].rsplit(".")[-1]:
objNode = Word_Xfrom.createOutputNode('geo','Obj_'+details[0][:-4])
importObjNode=objNode.createNode('file','ABC_'+details[0][:-4])
importObjNode.setParms({'file':filePath})

for geoNode in Word_Xfrom.outputs():
geoNode.setColor(hou.Color((0.976,0.78,0.263)))
if geoNode.type().name() == 'geo':
OmNode=EditNode.createNode('object_merge')
OmNode.setParms({'objpath1':list(geoNode.children())[0].path()})


for node in hou.node('/obj').children():
node.setDisplayFlag(0)

hou.node('/obj').layoutChildren()
EditNode.layoutChildren()
hou.setFps(25)

关于本文

本文作者 Master Gong Sheng, 许可由 CC BY-NC 4.0.