找回密码
 立即注册
查看: 478|回复: 0

[简易教程] PDG到Unity流程笔记:

[复制链接]
发表于 2022-6-27 16:34 | 显示全部楼层 |阅读模式
PS:本位主要为了笔记记录和方便自己理解。
教程来源:

环境目录一致,JOB/Hip目录要一致,然后本教程中pdg的目录就是hip对应的目录
//这里详细看,然后记住
在Unity里创建PDG pieline
后续:
在B站只看到5.8。
Houdini 17.5 PDG官方教程中:

配置Unity 中houdini的环境变量

1.session——create——pipe session

2.在项目文件夹内创建环境变量文件.env,记录的地址为项目文件夹geo的上一级路径
环境变量.env:
HEU_ENVPATH_自定义名字=项目文件夹路径
教程中为HEU_ENVPATH_JOB

3.obj目录下的TOP结点 进入 subnet,subnet里除了TOP,还有一个NULL结点,用于展示



obj目录下的TOP结点

该PDG HDA的路径  不是  HEU_ENVPATH_JOB的hda子文件夹


4. 在scene的HDA基础上,创建PDG——create PDG Asset link
HDAProcess cook失败后,利用Debug——open scene houdini,进行Debug,检查错误。
教程中HDAProcess cook失败的原因是识别不了unity中的HDA
在houdini——edit——Aliases and Variables中建立环境变量 HEU_ENVPATH_JOB,这个地址要与环境变量.env中的变量名字、地址一致。
Localscheduler中的workingDirectory需要为$HEU_ENVPATH_JOB,并且HDAProcess中的HDA File对应的路径也是$HEU_ENVPATH_JOB。

5.当优化完HDA,并重新导入到Unity后,refresh cook result,并且重启unity 项目。(这里不清楚是重新导入HDA需要重启Unity,还是重新设置环境变量,所以需要重启unity)
PDG场景制作

1.HeightField在OBJ层级的subnet中,painting和scattering分开


painting中就是地形terrain制作,Unity中地形尺寸好像有限制,不一定是2的指数幂。(挖坑)
教程中地形尺寸大小X和row暴露,并且y与X关联,row 和column关联,教程中的row和column作为resolution
在point中设置scale,density属性。



该Edit结点,将作为paint结点使用,并且在编辑hda——node——editable Nodes中添加该“paninter”

因为node存在嵌套关系,所以在editable Nodes中,要注意路径,最好是直接选结点。



山的制作:



利用scatter和density属性,在painter node的基础上撒点。
点的默认缩放属性为@pscalce,利用attribrandomize来做属性的随机。

用copytopoint将撒点山,并且用merge将山和grid合在一起。

在Unity中调用该hda:




enable editable node tool

得到


利用paint和paint value,改变属性的值。
教程中利用导出layout为bgeo文件,保存在unity 中编辑得到的地形属性。
导出:
在HDA——export结点内,有一个object merge和rop_geometry,其中object merge指向painting的OUT null结点


而rop_geometry结点的save to disk可以用alt + 鼠标中键进行暴露。

制作相关的PDG:

利用filepattern处理layout文件,并将Glob pattern暴露。





教程中将Glob pattern参数改成terrain layout,并且清空它的默认路径

利用HDA Processor结点投影高度场。

投影高度场:

教程中在Obj层级下创建了新的geometry结点SOP_HDAS,并在里面新建含有Heightfield的HDA。该heightfieldHDA需要一个Input,0个output。其Input为PDG得到的Layout。


在heightField HDA中,利用heightfield_project将layout映射到heightfield中。




heightfield制作完成,设置好HDA后,回到PDG中。
在HDA Processor中,开启create File SOP Inputs。





Name为PDG_Name



设置OutPut Tag为如图

复制新的file,并且输入仍为`PDG_OUTPUT`,利用heightField_file将file文件转化为heightField,称之为HeightFieldB。
在HeightFieldB的基础上用feature获取mask,并且用erode解算获得侵蚀地形。


用timeshift可以直接跳转到所需要的帧数中。



get_layout1的结点链为HeightFieldB所在结点链

HeightFieldB的PDG用新的hdaprocessor来控制。


新hdaprocessor OutPutFile Name用$OS体现。



在Unity中测试地形PDG:

进入Unity前,设置好PDG HDA的控制参数。



教程将PDG调用的HDA暴露参数,暴露在PDG所在的HDA中,也就是小的HDA参数暴露在大HDA中

教程进入Unity后,heightfield的top结点烘焙失败,因此erode的top结点无输入,只能一直等待。


失败原因:



$JOB为默认路径,但是unity中设置的环境路径为HEU_ENVPATH_JOB,介于Houdini的TOP——localscheduler中已经设置好HEU_ENVPATH_JOB为$PDG_DIR,因此将$JOB替换为$PDG_DIR

注意:如果PDG烘焙成功,但没看见地形,大概率是因为没有对地形添加材质。

Texturing Terrains with TOPS:




利用PDG_OUTPUT继续制作HDA,并且利用volume Wrangle设置Layer,以方便在unity中地形材质分层

用copylayer来保存mask和layer。设置完Layer后,利用Houdini engine for unity 的官方attribute name来控制 。





在prim层级上,给base层赋予title和diffuse的属性

利用@name=="layername",可以复用到其他layer上。



暴露tile和diffuse参数

在PDG中通过新的HDAprocessor来控制texturing HDA。
对于texturing HDA的贴图path,直接在unity中对贴图 copy path,然后粘贴过去就好。
注意:textur path路径为Assets/XXXXX。



教程中原路径不起作用



将resources及以上的路径删除,并且将贴图后缀删除

修改完路径后,dirty node,并cook node,得到结果。
如果路径正确,地形材质仍无正确结果,可能是layer覆盖导致的,需要用blast分离。

Splitting Terrains with TOP`s:

新建HDAProcessor控制分裂地形。
其对应的控制的HDA制作流程与前面一致。但所用的heightfield结点为tilesplit结点。





tile count为行数列数





tile number为显示的tile,pdg_index为利用pdg分段处理得到的index



迭代次数=tile 行数*列数,那么就会得到所有tile的index

开始scattering terrain:



导入和收集foliage prefabs:

在原有PDG中添加file pattern结点,并且将其glob pattern改为资产所在的绝对路径





为了快速获得所有prefabs,只导入后缀为prefabs的文件



不分离,方便管理效率



所有资产均以以上方式导入



用merge整合为一个结点,并且用waitforall整合为一个流程

Writing foliage paths to CSV:




连接csvoutput结点,然后设置csvFile为环境变量下的csv/foliage.csv,并且增加数据查询,添加查询的tag为file



用partition by index结点,里面的secondary input rule为 all,即让第二input的东西都传输到主要Input中







ip_terrain_scatter中的结点暂时只有heightfield_file

注意:


scatter HDA制作:

利用feature和计算获得mask后,利用masknoise获得零散分布的效果。然后利用最终的Mask连接heightfield_scatter结点。



利用同一个mask scatter不同的资产,利用attribute wrangle来remove选择了rocks 的tree点





也可以用scatter内的per point count using source points来scatter 剩余的资产

用table import导入生成的csv:



column number具体情况具体用



因为表格第一行为tag,所以第零点的路径错误,用Blast删掉零点



用find找到目标字符串的index,然后用sprintf截取目标Index到最后的字符串



利用find和资产关键字,标记type



利用seed,@ptnum进行计算随机path,并且乘上npoint,npoints代表资产的总数量,所以rand得到的0-1乘上npoint,再进行int,就可以得到随机资产分配,point(,,randpath)指获取第二个输入的第randpath点的path属性

注:记清楚函数的输入代表什么,区分清楚vex和expression functions的不同。vex里面的Point只有geometry,attrib和pointnum,expression functions里面d的point有surface node,pointnum,attrib和attrib的index。



确定好tree的normal要不要和地形match

设置好scatter里面的scale范围大小和direction normal设置。
scatter HDA暴露参数中,确定好需要哪些参数。教程中还对table import的file进行暴露。
PDG HDA中,继续暴露资产所在的文件夹和CSV file.



对所有scatter,关闭keep incoming terrain(教程只说了不想要开启,并且点会怎么样,个人理解:开了以后,资产和地形会结合成一个prefab),并且只随机Yaw上的旋转

对pdg 的进一步控制:



Develop the area HDA






其中resample treat polygons as 是sindivision curves

default curve 结点在hda中为editable nodes:




Create area in HDA:



耦合属性:






area 为operator path



利用list 管理多个额外添加的hda



将wedge的wedge count和list的长度关联起来



利用pdg_index,自动识别多个hda asset,+1是因为areasasset序号从1开始而不是从0开始,而index从0开始



wedge下连一个geometryimport结点,



geometryimport结点下连waitforall,集合成一个结点,然后进入geometryimport2

Deforming the terrain with area geo:




因为想要将area关联到scatter中,因此用partitionbyindex进行整合





不同管线的输出











在project2利用pdg_out.1对heightfield进行min操作



file1也no geometry

在教程中,修Bugs时,作者将project2位置进行调整。


根据具体效果进行调整。



clear foliage in area:




根据geometryimport2的输出,将file pattern的glob pattern改为对应路径

在scatter的hda中也增加多一个输入。



利用pdg_output.1制作heightfieldmask,并进行相减

注意的是,要根据顺序来定义是pdg_output.1还是.2,.3。



同样因为HDA增加了输入,因此在hda processor中增加Input

add specific foliage to areas:











注意,教程中出现了bug,可以通过冻结解冻csv来更新表格





maskbyobject的第二个输入均为area





为方便管理,将area特殊资产和普通资产的instance_attrib分开赋值

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-2 01:44 , Processed in 0.093280 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表