前言众所周知Houdini是一款很强悍的3D软件,在很多影视大片里都能见到它的身影。官方SideFX把它定位在3D Procedural Software for Film,TV,&Gamedev,其实Houdini自己的程序节点流与众多集成的CV功能早已超出了电影、电视、游戏领域范畴,就如UE4一样也不只仅只是一款游戏制做东西。这一点官方SideFX已经认识到了,但是详细什么原因没有果断转型晋级,我们也不清楚。就个人不雅观点来看,假如SideFX再不拓展领域,开放开源的话,很可能会被UE5、Blender以至Nuke等软件把流媒体、科研教育、AI等新兴市场给瓜分掉,从而让本人彻底沉溺出错为一个插件公司。 其实从Houdini17.5初步,PDG的Top流以及CSV和Python3的格式开放,搜罗最近18.5对实时动补的鼎力撑持,这些看似对传统特效制做没什么大提升的功能,其实是Houdini对新型市场的测验考试与跟进,也是如今的开展趋势。对我个人而言,Houdini是一个很好的三维数据仿真与生成东西,对三维数据阐述与处置有非常大的协助。如今比较火的CV领域,有matplotlib和OpenCV,都是业界不成文的尺度,虽然两者都有三维计算效果,但是专业可视化的三维数据软件全球还没一个大的一并。当然要成为这种软件前提必须是开源开放的,Blender或者UE5可能有时机,Houdini我不知道。(吐槽完毕) 为何讲节点分类用过Houdini的朋友都知道,每当Houdini跨0.5的版本晋级后,城市有挺大的改动,大家也经常吐槽Houdini每次更新后就得重学一遍。其实Houdini自己的设计架构决定了它的每次新功能嵌入都将会是一次大换血。因为Houdini所有模块之间的数据都是相通的,而且是以节点流的形式相连,这就好比人的经络,数据就如血液一般在此中有序循环,当新增一项功能,打个例如要给人加上一对翅膀,你整个骨骼与经络都得从头换一套,构成循环系统,以包管大脑的血液能流入翅膀。而Maya,Max的功能重要以插件的形式来增加,相当于给人穿衣服,每加一个功能就多穿一件衣服,穿多穿少不会影响整个人的身材,所以FumeFX里的数据不能间接做用在Yeti上。 Houdini这套循环闭合的经络系统,它的好处就是数据畅通性,害处也正是因为它数据一体化不好区分,便利导致眉毛胡子一把抓,不知从哪断到哪。Houdini是一个节点流软件,要使用Houdini仿真三维数据之前,必须得理解它的功能模块与节点构成。这是入门Houdini的第一步,很多人认为Houdini难学,其实第一步就迈错了标的目的,导致后面越学越懵逼。 Houdini的模块与节点类型说到Houdini的模块有哪个,节点有哪个,估计有很多人都答复上来,搜罗一些老手。因为随着Houdini版本与功能的晋级,它自己的模块与节点类型也在发生变革,所以它并不是原封不动的。 Houdini18.5的功能模块
上图就是Houdini的功能模块,我发现有很多人经常将模块功能与节点类型、节点功能混在一起来划分和描述Houdini。其实这是不科学的,也是比较混乱的。举个例子,SOP是干什么的,这个问题估计每个使用Houdini的人城市问到。然而在功能模块里我们并没看见SOP,以至我们把Houdini所有节点找一遍,除了个叫Sop network的底子就没看见Sop。从一些教师口中或者网上查寻得到的答案往往是surface operator,What?外表操做?那这又是什么意思?愈加蒙蔽。所以说仅从字义功能上去描述Houdini,是底子描述不通的,就像用"鲁棒性"去描述算法一样,不只会让人觉得懵逼以至还略带一丝好笑。 那为何直白的字义就无法描述Houdini各模块功能呢?正是因为Houdini的功能在一直拓展,现有的功能已经超出了最原先的含义。surface operator是Houdini很早很早之前的版本所使用的功能描述,当时的功能估计也就停留在对物体的底子属性、外形上的一些操做,有点类似Maya物体的Shape,当然这也是我的个人揣度,究竟?结果Houdini的那些老版本我也没用过。 Houdini官方是按节点类型而非模块的方式来划分描述的。在协助首页里就有: 官方协助页节点分类对照上面两张图,能够发现这不是逐个对应的关系,即模块分类 !=节点分类。但是乍看一眼,两者貌似又有重合的处所,这也是第一个让人比较迷惑的处所。而且我们还是不清楚SOP是干什么的。 Houdini18.5节点分类其实从节点类型上去学Houdini那将会是最轻松的方式,而且能随着Houdini的功能拓展而进行增量研究。尤其对于开发人员来说,能更佳的理解各个模块之间的联络。话虽如此,但原来模块分类与官方协助页的分类已经够绕了,如今又多了一些,会不会更复杂了?没有,很简单。我们只需要从节点层级上就能识别出节点类型,Houdini本人就是这么来划分的,而且每种节点类型从其外不雅观上就有一定的特征。 认清Houdini节点类型在之前,我们先用一个小脚原来获取我们所选择的节点类型与节点类型名称。 import hou sn=hou.selectedNodes() for n in sn: print(n.type(),n.type().name())各节点类型功能1.Director字面上意思是导演,其实就是独一的root根节点hou.node("/"),在该节点下才会有ch,obj,img等功能模块节点。该节点是没有实体节点外形的,从程序角度理解就是每个工程的节点根途径。 2.Manager打点节点,也就是各模块节点,能搜罗其他节点的容器节点.跟Director一样,它们也是没有详细节点外形的。但比Director要直不雅观一点的处所就是,你能够认为节点面板里的每个分页就是它们。 Houdini中的Manager节点有: hou.node("/ch")hou.node("/img") hou.node("/mat") hou.node("/obj") hou.node("/out") hou.node("/shop") hou.node("/stage") hou.node("/tasks") 3.Chop数据通道节点,针对Houdini所有数据通道处置的节点,能够实现数据图形化。所有chop network下的第一层节点都是Chop类型。注意是 "所有"、"第一层"。下面图2中,即便里面有chopnet2,sopnet2这些网络容器,但是它们都是Chop类型,打印这2个节点的类型与类型名称,如下: <hou.NodeType for Chop chopnet> chopnet #节点类型为Chop 节点类型名称为chopnet<hou.NodeType for Chop sopnet> sopnet 所谓"第一层"即当前网络层级,在图2sopnet1里面的节点,就不是Chop节点类型了。 图1 图2 <hou.NodeType for Chop chopnet> chopnet<hou.NodeType for Chop sopnet> sopnet <hou.NodeType for Chop vopnet> vopnet <hou.NodeType for Chop chopnet> chopnet <hou.NodeType for Chop image> image 4.ChopNet所有带Net结尾的节点类型都是该类节点的网络容器节点。所谓网络容器节点,就是能够搜罗很多其他节点的节点,且该容器里创建的所有节点都是同一类节点。这里的ChopNet就是在/ch下创建的Chop network网络容器节点,有且仅有这么一个。 <hou.NodeType for ChopNet ch> 5.Cop2合成类节点,Houdini针对图像合成处置的节点,功能类似Nuke。但凡Img network网络容器节点下创建的节点,都是Cop2节点。合成节点很好辨识,一般都带缩略图的。 <hou.NodeType for Cop2 file> file <hou.NodeType for Cop2 color> color 6.CopNet在/img下创建的Img network网络容器节点,仅这么一个。 <hou.NodeType for CopNet img> img 7.Object物体节点,在/obj下创建的所有节点以及Object network网络容器节点里创建的节点都是Object节点类型,下图都是Object节点。注意Object network网络容器节点自己的类型则取决于它的父节点。 <hou.NodeType for Object dopnet> dopnet <hou.NodeType for Object subnet> subnet <hou.NodeType for Object chopnet> chopnet <hou.NodeType for Object vopnet> vopnet <hou.NodeType for Object cam> cam <hou.NodeType for Object geo> geo <hou.NodeType for Object hlight::2.0> hlight::2.0 <hou.NodeType for Object agentcam> agentcam 8.Sop终于来了Sop。Object节点里除去所有是network网络容器的第一层节点,都是Sop节点,因为network网络容器节点里创建的都是它自己共同类型而非Sop类型,所以要除去。这也是官方对Sop的定义,虽然协助文档上的描述也不全面,但这是独一正确描述Sop的方式。因为Sop节点和功能太多,尤其Houdini17.5过后,Sop的功能界线越来越模糊,好比一些Sop节点自己会带有动力学解算,所以是无法从节点功能上去描述划分它的,而所有模块节点即Manager节点里创建的也不是Sop节点,所以也不能从模块上去描述它,只能以节点类型去描述。 <hou.NodeType for Sop chopnet> chopnet <hou.SopNodeType for Sop attribvop> attribvop <hou.SopNodeType for Sop dopnet> dopnet <hou.NodeType for Sop matnet> matnet 9.Dop动力学节点,Houdini专门处置动力学解算的节点。所有Dop network网络容器节点里的第一层节点都是Dop节点。 <hou.NodeType for Dop popobject> popobject <hou.NodeType for Dop popadvectbyfilaments> popadvectbyfilaments <hou.NodeType for Dop popsolver::2.0> popsolver::2.0 <hou.NodeType for Dop output> output 10.Driver渲染、输出节点。这个其实就是官方协助页上说的ROP节点,以前可能只是为了渲染Render所以叫ROP,其传神节点类型名称叫Driver,能够理解为驱动程序,就是带复杂计算过程的节点。不难理解,因为Houdini如今的运算与输出已经不只仅是渲染的内容了,好比CSV还有其他USD格式的输出,等等这些都超出了渲染范畴,所以用Driver更合理。所有/out以及Rop network网络容器节点下创建的第一层节点都是Driver节点。 <hou.NodeType for Driver agent> agent <hou.NodeType for Driver usdrender> usdrender <hou.NodeType for Driver ifd> ifd <hou.NodeType for Driver sopnet> sopnet 11.Lop为USD流程操做的节点。所有/stage与LOP network网络容器节点下创建的第一层节点都是Lop节点,/stage是manager节点。同样,LOP network网络节点类型取决于它的父节点。 <hou.NodeType for Lop sceneimport> sceneimport <hou.NodeType for Lop attribvop> attribvop <hou.NodeType for Lop dopnet> dopnet <hou.NodeType for Lop camera> camera 12.Shop材质shader节点。也是历史遗留下的节点,如今底子成为了外部渲染器插件的材质存放根据地。所有/shop与Shop network网络容器节点下创建的第一层节点都是Shop节点。Shop network节点类型取决于它的父节点。 <hou.NodeType for Shop matnet> matnet <hou.ShopNodeType for Shop vopcvex> vopcvex <hou.ShopNodeType for Shop v_fluffy> v_fluffy <hou.ShopNodeType for Shop v_ambient> v_ambient 13.Top任务流节点,Houdini17.5新增的强悍功能,PDG就是其重要核心功能,能进行多线程,多变量批量计算,能够认为是平行宇宙吧。所有/tasks与Top network下创建的第一层节点都是Top节点。Top network网络容器节点类型取决于它的父节点。 <hou.NodeType for Top localscheduler> localscheduler <hou.NodeType for Top genericgenerator> genericgenerator <hou.NodeType for Top geometryimport> geometryimport <hou.NodeType for Top waitforall> waitforall <hou.NodeType for Top csvoutput> csvoutput 14.TopNet在/tasks里创建的Top network网络容器节点,也是唯逐个个。 <hou.NodeType for TopNet topnet> topnet 15.VopNet类型这也是Houdini历史遗留下的网络容器节点,用来计算vex的处所,也是可视化编程的处所。注意,在Vop network里创建的所有节点都是VopNet节点,不是Vop节点。 16.Vopvex程序运行节点,这里的V是vex的意思,vex是houdini本人软件的语言,是仿着C++的阉割版C,为提升软件计算效率用的。官方协助页里说它是Shader Nodes这也是让人迷惑的处所。因为以前vex就是重要执行shader的,而如今vex的功能已经被Houdini拓展到了全局。也有人会把V理解为view当做可视化编程来理解,其实算是歪打正着吧,究竟?结果Houdini是为艺术家而不是程序员设计的一款软件,其大部门程序功能确实是能够通过可视化编程节点进行实现的,就现阶段而言,要识别Vop节点通过判断它是不是可视化编程节点确实是一种非常直不雅观又准确的法子。 <hou.NodeType for Vop geometryvopglobal::2.0> geometryvopglobal::2.0 <hou.NodeType for Vop normalize> normalize <hou.NodeType for Vop geometryvopoutput> geometryvopoutput <hou.NodeType for Vop snippet> snippet 到此,Houdini18.5的所有节点类型都讲完了。所以“为何ROP network与/out一样,/stage与LOP network一样”,这类由于Houdini将节点功能与模块功能混在一起的风骚迷惑操做,大家应该理解了吧。 获取Houdini的各类节点知道Houdini的节点类型,是玩Houdini的底子前提。Houdini自己还是一款应用东西软件,我们既不能无视它的功能也不能神化它的存在,它和其他DCC软件其实跟电脑里的计算器还有手机里的小程序一样,需要的时候就用,能处置一些问题就能够了,认清你想要的,你才不会迷惑。 成果能够看出Vop最多,Sop其次,然后是Dop,这三个占了绝大部门。怎样获取所有节点呢?方式如下: import hounode_types=hou.nodeTypeCategories() #获取节点各类型 all_nodes=[] counts={} for nc,nt in node_types.items(): all_types=nt.nodeTypes() #获取各大类下的所有节点(字典) all_node_names=list(all_types.keys()) #所有节点名称 counts[nc]=len(all_node_names) for name in all_node_names: all_nodes.append(name) print(counts) print(len(all_nodes)) 需要注意的是Director与Manager节点类型无法通过node.Types()来获取,它返回的是空{},很神奇。 Houdini节点参数翻译先上个效果图
思路是: 搜集节点参数信息get_data.pyimport numpy as npimport pandas as pd node_types=hou.nodeTypeCategories() #返回的一个字典 ''' {'Chop': <hou.NodeTypeCategory for Chop>, 'ChopNet': <hou.NodeTypeCategory for ChopNet>, 'Cop2': <hou.NodeTypeCategory for Cop2>, 'CopNet': <hou.Nod eTypeCategory for CopNet>, 'Director': <hou.NodeTypeCategory for Director>, 'Dop': <hou.NodeTypeCategory for Dop>, 'Driver': <hou.NodeTypeCategory f or Driver>, 'Lop': <hou.NodeTypeCategory for Lop>, 'Manager': <hou.NodeTypeCategory for Manager>, 'Object': <hou.NodeTypeCategory for Object>, 'Shop ': <hou.NodeTypeCategory for Shop>, 'Sop': <hou.NodeTypeCategory for Sop>, 'Top': <hou.NodeTypeCategory for Top>, 'TopNet': <hou.NodeTypeCategory fo r TopNet>, 'Vop': <hou.NodeTypeCategory for Vop>, 'VopNet': <hou.NodeTypeCategory for VopNet>} ''' all_nodes=[] #所有节点名称 parm_names =[] data_list=[] for nc,nt in node_types.items(): #nc为Categories各大类名称,nt为各大类的脚本类型 node_types=nt.nodeTypes() #获取各大类下的所有节点(字典) node_names=list(node_types.keys()) #该节点类型下所有节点名称 for name in node_names: all_nodes.append(name) # 记录所有节点 node=hou.nodeType(nt,name) plg=node.parmTemplateGroup() f_parms=[p for p in plg.entries()] #获取每个最高层级参数 i_parms=[u for u in plg.entriesWithoutFolders()] #获取非目录参数 f_parms.extend(i_parms) parms=list(set(f_parms)) for i in parms: p_name =i.name() #参数名称 p_label=i.label() if i.label() else p_name #当不存在标签时,就用参数名称 if p_name not in parm_names: parm_names.append(p_name) per_list=[p_name,p_label,name,nc] data_list.append(per_list) print('all_nodes:',len(all_nodes)) print('parm_names:',len(parm_names)) data=np.array(data_list) df=pd.DataFrame(data,columns=['parm_name','parm_label','nodename','category']) save_path=os.path.join(hou.getenv('HIP'),'node_info.csv') df.to_csv(save_path) 输出的节点数据node_info.csv 构造如下节点翻译 translate_node.py
东西地址: 这个功能其实就是将节点上的参数翻译一遍,实现也不难,对制做与研究底子上也什么用,我做这个的重要原因是因为我一直没有找到CG专业术语的中文语料。Houdini是一个可控性很强的DCC软件,假如只是针对专业人员来操做,那么所有DCC软件用其自己的英语是最好的,但,假设不是呢?或者说假如我们要对DCC软件进行外部的交互式操做,好比手势、声控、语音这些,这个时候我们会发现,还得需要一套尺度的专业语料,不然底子就不好识别命令企图。所以我把Houdini18.5里的所有节点的参数名称以及参数标签都导成一个csv,然后用百度翻译接口把所有标签机翻为中文,存为一个大Json也放在gitee里,机翻的肯定有很多不合错误,我略微修改了几个,个人程度有限,还希望有兴趣的朋友来一起完善。哈哈,加油。 |