本质是 利用顶点变换实现的:
通过一个俯视整个场地的正交摄像机,根据绑定在移动物体身上的粒子系统,来获取物体移动过的位置,记录到一张RenderTexture上作为轨迹图,再通过这张图来对雪地做顶点变换。
1. 由于顶点变换需要,用建模软件建一个高精度的地面,导入unity
2. 使用simple noise模拟雪地基本的凹凸起伏
很简单啦,对每个顶点的y坐标根据噪声图的黑白值进行抬起。
3. 创建粒子系统,并将其作为移动物体的子物体绑定
创建一个绑定在角色身上能跟着角色水平移动的粒子,贴图选择白色图案的(因为后面我会设置设置摄像机的背景为黑色),注意它需要旋转至面朝上(这样才能被后续俯视的摄像机拍到内容)。粒子创建后,将其layer设置为particles(用于摄像机设置其可见性)。
4. 创建记录轨迹图的摄像机
创建一个正交相机,俯视场景,让其拍摄范围与雪地范围尽量完全一致,这样才能保证记录下来的轨迹图信息映射到顶点变换时能不出现位移偏差。设置摄像机只渲染particles层,并将背景色设为黑色,这样粒子移动时就能拍摄到黑底白线的轨迹图啦。
5. 将轨迹图计入雪地凹凸的计算
遗留问题:
- 顶点变换只针对gpu有效,做碰撞检测的cpu不知道有变换,该如何同步?
- 该方法只能简单地检测到一个整体的交互,想要获得更精细的记录该怎么做?
- 只能对边界有限的小场景有效,该如何优化?