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)

 这样我们就识别出了点在模型上的方位。



















