PCG真好玩,门槛很低,天花板很高
文章目录
- 前言
- 1. 基本撒点
- 1.1 Landscape上撒点
- 1.2 使用射线检测在地表面撒点
- 1.3 使用曲线撒点
- 1.3.1 沿曲线撒点
- 1.3.2 在闭合曲线内部撒点
- 1.4 在StaticMesh表面撒点
- 2. 进阶撒点
- 2.1 在闭合曲线内部放射状撒点
- 2.2 在Mesh表面沿指定方向撒点
前言
程序化内容生成(PCG)的关键之一就是"撒点",因为只有把点撒到位,才能在期望的位置生成模型,本文简单总结一下PCG常用的撒点方法,如有遗漏欢迎大家补充,非常感谢!
1. 基本撒点
1.1 Landscape上撒点
可以通过Input节点中的Landscape
引脚+Surface Sampler
撒点,也可以通过Get Landscape Data
+Surface Sampler
撒点,后者更方便通过设置Actor Filter
和Actor Selection
来筛选指定的Landscape。
1.2 使用射线检测在地表面撒点
上面的方法只能识别Landscape,如果我们在Landscape上放了一些Static Mesh,或者干脆没有Landscape,就用不了了。这时我们可以采用射线检测的方式在地面上撒点。
使用World Ray Hit Query
节点,沿指定方向做射线检测,从而识别表面,由于World Ray Hit Query
的运算量比较大,所以这个计算并不是实时的,如果移动了StaticMesh需要重新Clean Up再Generate。
在World Ray Hit Query
节点上可以设置射线检测的方向和通道。
1.3 使用曲线撒点
1.3.1 沿曲线撒点
1.3.2 在闭合曲线内部撒点
1.4 在StaticMesh表面撒点
StaticMesh表面撒点有两种方式:
Mesh To Points
Mesh Sampler
这两个节点功能上区别不大,前者是蓝图版本(已经标记为弃用),后者是C++版本,推荐使用后者。
Mesh Sampler的设置,这里的Static Mesh要和场景中的实际模型一致
Get Actor Data
的设置,Mode
要设置为Get Single Point
这样获取到的是Mesh的原点
2. 进阶撒点
2.1 在闭合曲线内部放射状撒点
所谓放射状撒点就是点的Density在闭合曲线的中心最高,边缘最低(或者反之)
方法1
方法1很简单,就是使用Spline Sampler
的Interior Density Falloff Curve
。
需要注意的是,这种方式Density的分布基准是闭合曲线的中心,对于曲线范围比较狭长或者形状不规则的情况,最终效果往往不是很理想。有时候我们想以边缘作为Density的分布基准,于是就有了方法2.
方法2
再添加一个Spline Sampler
设定为On Spline
模式,用于获取曲线的边缘,然后使用Distance
节点计算内部点和边缘的距离,注意这时要勾选Set Density
,这样才能将计算结果赋值给Density
可以看到方法2的边缘宽度比较均匀
2.2 在Mesh表面沿指定方向撒点
添加一个Normal To Density
节点,计算每个点的法线和给定方向(法线)的夹角,夹角越小Density越大
我们还可以修改基准法线的方向
比如改成(1,0,0)
这样我们就识别出了点在模型上的方位。