|
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分开赋值 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|