文件在这里:tops_lesson_start-数据集文档类资源-CSDN下载
英文教程:hfoundations_09_tops_city_build.pdf (sidefx.com)
下载好之后我们会依赖这些资源文件来学习
1.Create a city grid
首先设置项目路径,选择File->SetProject.找到tops_lesson的路径,然后点击Accept.
选择File>Save As,进入到刚才设置的路径下(顺利的话此时已经在了),如果没有可以点击左侧的$JOB,然后将本hip保存在这里
接下来创建一个Trace节点
替换图片为$HIP下的tex文件夹里的citygrid.jpg,将ScaleToSize设置为500,500
在trace节点里,设置RotateX为-90,Scale为100,100
创建一个Reverse节点来翻转法线,点开点查看视图可以看到目前有很多点
接下来创建一个Resample节点并将长度设为1,然后创建一个NULL节点名字改为CITYBLOCK_OUT然后保存你的工作
2.生成并显示Work Items
回到object层级然后重命名刚才的geo为street_grid
这里可以选择把市口调整为Left/Right方便查看
创建一个Top network节点
双击进入Topnet
按下tab > Geometry Import,设置Geometry Source为SOP Node然后点击Choose Operator图标(在SOP Path旁边)将路径设置为刚才的CITYBLOCKS_OUT
在Data Extraction下,设置Copy from Class 为 Primitive.这将将文件存储到磁盘,以便下一个TOP检索到它们,这对于分布式计算任务非常重要
将geometryimport重命名为cityblocks,按下Shift+G便可以Cook
Cook之后便可以查看每一个Geo的信息,一共有73个点对应着生成的73的geo,可以通过Ctrl+鼠标中键,右键单独点之后选择View Work Item Output
如果你想要加速你的network进程,那么可以选中localscheduler节点,将TotalSlots选项选为Equal to CPU Count Less One,这将大大加快cook的速度因为更多的进程被使用了
为了能在视口中看到work item,你需要设置一下work item viewer.回到上层节点,创建一个file节点并重命名为work_item_viewer
通常来讲你需要通过File节点来指定一个磁盘上的文件
双击进入work_item_viewer节点,选中file节点,选择Geometry File选择器按钮,
选择$HIP/geo目录然后选择 city_01_cityblocks序列(就是刚刚cook出来的)
然后增加一个color节点,设置颜色为(1,0,0),滚动时间轴来查看读取不同的区域
($HIP/geo/city_1.city_blocks.$F.bgeo.sc,仔细看这个文件名,它里面包含了0-72共73个区域,通过时间线$F来控制显示哪个区域)
将geometry file更改为`@pdg_output`,它的意思是,不从硬盘文件读取数据,而是直接从topnet里面拿cook的数据,如果刚打开项目可能报错,因为此时还没有cook过
同时,在topnet里面选择不同的工作项则可以查看不同的区域
3.增加属性
为了创建建筑,想要设置修正过的带有随机高度的地基,你可以通过在geometry层设置一些属性,但是你也可以通过在TOP里做到这点,并且这样会更简单
在TOP下新增一个AttributeCreate节点,并作如下设置:
GenerateWhen设置为Each Upstream Item is Cooked,并添加如下属性
base_height属性和height_variation属性,默认值分别为10和rand(@pdg_index)*20
分别代表了基础高度和随机变量
选中AttributeCreate然后按下Shift+G来cook
中键点击工作项(小节点)你会发现多了两个属性
虽然在geometry里添加属性是可行的,但是在TOP里直接添加属性会更方便
4.为城市网格添加建筑
现在需要用ROP Geometry节点创建简单的建筑,为了看到效果,你需要选中某一个工作节点
在TOP里创建一个ROP Geometry Output,重命名为create_buildings.关闭UseExternalSOP选项.
按下Shift+G Cook这个节点,那些灰色的代表还没有处理。现在可能会报错不过不要紧,因为现在还没有处理任何geometry
双击这个节点进入到geometry层级
创建一个PolyExtrude节点并放置在incoming和输出节点之间,重命名它为block_offset,设置Inset为1,在Extrusion栏下面,关闭OutputSide选项,这会为之后制作人行道留出空间
下一步,添加一个Fuse节点,然后设置SnapDistance为0.2来移除过小的线,注意现在你可以Viewport中看到一些东西了,尽管work_item_viewer节点仍然在报错,让我们稍后解决它
再创建一个PolyExtrude节点,重命名为building_height,设置Distance为@base_height+@height_variation
确定Distance参数为高亮,将其复制到Divisions参数里,并将其除以2
在Extrusion栏里,开启FrontGroup,并且命名为building_top,开启SideGroup,并且命名为building_side,我们将用它为建筑增加细节
新加一个PolyExtrude节点,并重命名为window_frames,设置:
Group为building_side
Inset为0.05
Divde Into 为 IndividualElements
在Extrusion面板里,开启FrontGroup并命名为window_out
创建一个新的PolyExtrude节点 并重命名为windows,设置Group为window_out,Distance设为-0.05
再新增一个新的PolyExtrude节点,并重命名为extend_roof,设置:
Group为building_top
Distance为0.5
再添加一个PolyExtrude节点,并重命名为roof_edge,设置
Group为building_top
Inset为0.3
在Extrusion栏里,开启FrontGroup并且命名为roof_out
新增加一个PolyExtrude节点,重命名为roof,设置Group为roof_out,Distance为-0.25
这将塑造出屋顶
增加一个Color节点,设置Group为window_out
颜色设为(0.2, 0.2, 0.2)
回到上一级,在create_buildings里,更改$F为`@pdg_index`
所以OutputFile会变成$HIP/geo/$HIPNAME.$OS.`@pdg_index`.bgeo.sc
这将会使用pdg的index而不是时间轴作为运算标记
点击ROP Fetch栏,设置CasheMode为WriteFiles.保存,然后shift+g cook
回到work_item_viewer删除color节点,你将不再看到红色.现在选择不同的节点来看不同的建筑高度
5.组合建筑
为了加速任务进程,你可以使用PDG服务,在TOP网络视口中选择Task-PDG Services,单机AddService.设置Type为ROP Fetch Service,Pool Size为4.点击Add然后点击Start
保存场景然后按下Shift+D再按下Shift+G重新cook它,会发现快了不少
添加一个Wailt for All TOP节点,这会把所有生成的ROP Geometry 节点组合在一起,同时他还会防止在cook时出现的变动,知道全部的cook完成(有一点像Merge)
添加一个Geometry Import TOP,命名为building_merge,设置Generate When为Each Upstream Item is Cooked 设置Merge Operation 为Import and Merge All Geometry
保存场景,选择building_merge节点然后按下Shift+G来Cook 它,当任务完成时,点击最终building_merge节点里的work item,你可以看到整个城市了
回到AttributeCreate TOP,编辑height_variation 属性如下:
值为rand(@pdg_index)*15
这会使得建筑略矮一些
重新编译 你会看到结果
回到上级Street_grid 里面,创建一个颜色节点,链接到Resample后面,设置Class为Primitive,Color设置为黑色(0,0,0),重命名为base_color
创建一个sphere 并设置PrimtiveType为Polygon,UniformScale为5
添加一个Color节点在这个sphere后面,设置Class为Primitive,颜色设置为绿色(0,1,0),命名为transfer_color
添加一个AttributeTransfer节点,链接到base_color和transfer_color后面,将两个颜色的Class属性改为Primitive
取消勾选Point,设置Primitve这里属性为Cd
然后在Conditions栏目里,设置
DistanceThrehold为0
BlendWidth为30左右
让鼠标悬停在视口处,按下空格+Y可以切换显示和隐藏其他物体
回到TOP网络里,选择attributecreate节点,编辑height_variation属性的值为rand(@pdg_index) * 15 + @Cd.g*30
这会让更绿的区域更高,而它的位置是可以通过球体位置改变的
然后重新编译
6.集中于一幢建筑
直到现在位置建筑的高度都是由height_variation随机决定的,如果这里有一幢你想个性化的确定高度的建筑要修改,那么还需要创建一个属性
回到street_grid中,打开显示primitive数字选项
我们可以选择一个数字来让他的属性个性化,比如24
在TOP网络里,复制一个attributecreate节点
勾选Create When 并填入如下属性:@primitiveoffset==24
在下面的height_variation属性里,右键Delete Channels,并给它一个0值,设置base_height为50,这将让序号为24的建筑高度定死在50
现在重新cook它们,任何时候24号建筑的高度都不会随机变化了,这是通过了覆盖前面属性的方式来做到的
7.标记城市核心位置
为了标记street_grid里面球体的位置,我们需要借助HDA,并且运行HDA的TOP进程节点
在street_grid网络里,选中除了CITYBLOCKS_OUT以外的所有节点,在Assets菜单下,选择NewDigitalAsset from Selection.命名为streetgrid_maker,label 为 Street Grid Maker,存在$HIP/hda文件夹下
在Operator Type Properties 面板下,点击Parameters 栏,进入到asset,从trace节点拖动
Image Input到参数列表, 再把Scale X 拖到Scale Y, 选择Relative Channel Reference,然后再拖一个Scale X到参数列表命名为Scale,从sphere节点拖动Center并将其命名为SphereCenter,从
attributetransfer节点拖动BlendWidth然后点击Accept
回到TOP网络,创建一个HDA processor TOP链接到GeometryImport之前,在 GeometryImport节点里,设置GenerateWhen为EachUpstreamItem is Cooked 并将 Geometry Source设置为Upstream Out File。
选择HDA Processor节点,设置HDA文件为$HIP/hda/ streetgrid_maker.hda,点击HDA Parameters栏,可以看到ImageInput,Center,Scale和BlendWidth属性列表
重命名这个TOP为make_citygrid,然后按下Shift+V重新Cook它
创建一个Wedge TOP节点,链接到make_ citygrid之前,设置Wedge Count为4
点击Wedge Attributes一旁的+号,设置Attribute Name为center_wedge然后做如下设置:
Type 为Float Vector
Start range 为 -50, 0, -50, 0
End range 为 50, 0, 50, 0
打开Random Samples
这将会在Start range 和End range之间随机给一个值,后面会作为城市中心的坐标点
选择HDA Processor节点,在HDA参数面板下,设置Center参数为@center_wedge.0, @center_wedge.1, @center_wedge.2
选择make_citygrid节点按下Shit+V
此时应该可以看到有4个工作节点被创建,这是因为上面设置Wedge Count为4
现在你可以隐藏street_grid了,street_grid的作用就是输出hda,他不参与实时显示
现在为height variation添加一些wedging,这样你会得到一些不同的高度变化
选择wedge TOP节点然后点击Wedge Attributes旁的+号,设置Attribute Name为seed_wedge
我们现在需要把所有和输出文件名相关的路径都改一下,还记得刚刚的Wedge Count么?为了和它对应上,我们需要把所有包含.bgeo的路径前面加上.`@wedgenum`。应该有下面四个
make_citygrid HDA Processor
geometryimport Geometry import
create_buildings ROP Geometry
building_merge Geometry Import
将Wait for All节点替换成Partition by Attribute 节点,点击+号按钮增加一个属性,命名为wedgenum,这会为每个wedge创建一个partition
保存,然后Cook全部。这会创建4张城市地图,你可以通过点击来看它们之间的不同
8.创建道路
在TOP网络里,添加一个ROP Geometry Output节点,连接到make_citygrid 后面,并重命名为build_streets.
取消Use ExternalSOP,在Output File路径里同样添加.`@wedgenum`在.bgeo之前
在ROP Fetch栏里,设置CacheMode为WriteFiles
Cook这个节点同样可以得到4个工作项,双击进入到geometry层级,我们将在这一层根据输入制作道路
添加一个PolyExtrude节点在incoming和output之间,设置Distance为-0.05, 取消勾选Output Front,勾选Output Back
添加一个Reverse节点,来把法线反向,然后再添加一个Color节点将所有的城区涂成白色
添加一个Box节点的分支,再在其下添加一个blast节点,设置Group为2,勾选DeleteNonSelected选项(设置只保留一个面)
在blast后添加一个Transform节点,并设置:
Translate Y为 -0.05
Scale X 为 1.05
Scale Z 为 1.05
使其稍微大一点,并下沉一些
添加一个Color节点,并给一个灰色(0.33,0.33,0.33),现在创建一个Merge节点并连接到两个Color节点,确保output是显示的来查看street geometry
保存,回到TOP网络层Cook节点,现在应该可以看到道路了,目前所有的4种变体看起来还是一样的,一会当我们导入更多的city grids后你将会看到不同
添加一个PartitionByIndex节点TOP网络里的最后,第一个节点连接building_merge,第二个连接
build_streets。勾选上UseDynamicParenting选项
Cook这个节点,完成后,点击一个work itme查看
如果按下Ctrl+鼠标中键,你会发现有两个输出
还记得我们之前给work_item_viwer添加的文件是`@pdg_output`,这代表我们想要查看TOP的输出,默认是第一个输出,现在有两个输出了那么第二个是`@pdg_output.1`
回到Object层级,复制一个work_item_viewer,点击进去修改Geometry File为 `@pdg_output.1`
回到上一级 ,选择PartitionByIndex其中的一个workitem,现在可以看到两个输出都显示出来了
9.导入四张城市地图
让我们给wedging添加一个额外的变量,我们可以导入四张不同的高度图来为它们创建城市
回到wedge 节点,选择+号按钮添加一个新的wedge参数
设置如下:
Attribute Name 为file_wedge
Attribute Type 为Integer
Start/End 为1,4
这将会创造一个1-4的int 数值,来作为使用不同城市地图的标签
选中streetgrid_maker HDA节点,修改该ImageInput路径,导航进入到more_grid文件夹,
然后修改$F为
文件夹里有4张图片,wedge属性会把它们逐一读取进来
重新Cook HDA文件(shift+v)
现在你可以看到不同的高度图生成的城市了