撰写了文章 发布于 2018-11-19 22:58:25
Memo dump: 植物交互系统
植物交互统似乎在本世代的大中型游戏里已经成为一个标配。
最近在笔记里整理了几种常见的方法,顺手写一遍当作review。
链接基本是油管,请自备梯子。
Bone
在植物上绑上collider(cylinder/capsule), 将collider的信息作为bone来计算动画。 collider上加上spring constraint即可模拟惯性效果。
- 优点
- 能够维持植物形状
- 可以模拟出惯性效果
- 可以进行细粒度的控制
- 配合skinning可以自定义变形的方式
- 能够相对自然地表现大片叶子植物地交互(palm)
- 缺点
- 没有引擎原生支持的话,实现相对复杂
- 使用skinning时运行时开销相对较大
- 优化策略
- 只使用1根骨骼,甚至很多枝条共用一根骨骼
- 不使用skinning,只用骨骼信息做旋转,或是在shader内加上简单的变形
- 简化,优化骨骼的碰撞计算(类似物理引擎的优化)
- shader LOD
- 示例(游戏单指视觉效果,不清楚具体实现)
- Uncharted4 https://www.youtube.com/watch?v=45z9MhK-Agg&feature=youtu.be&t=125
- Red dead redemption 2 大片的树叶比较明显
- [教程] Physics interactable foliage overview WIP https://www.youtube.com/watch?v=U7IRbHvcIxY&list=PL0l_6bUTcxt1HYwfIjS951xhIopQP6OXa
Render-to-Texture
将交互信息事先写入一张texture,植物地shader里依据其中地信息进行变形。
- 优点
- 能够相对自然地表现爆炸导致叶子向四周散开
- 能够表现延时效果,如被压倒的草地慢慢恢复原状
- 实现相对简单,并且同一套系统可以用在别的地方(比如雪地)
- 缺点
- 除了柔软的草地以外较难实现自然的效果
- 为了表现细节则需要一定的分辨率(占内存和计算量)
- 为了存储交互的方向(草往哪边倒),又需要额外的内存和计算量
- 优化策略
- 使用合适的分辨率,特别是要限制交互范围(比如角色周边)
- shader LOD
- 示例(游戏单指视觉效果,不清楚具体实现)
- Uncharted 4 https://www.youtube.com/watch?v=RG7XwSzYlyk&t=38s https://www.youtube.com/watch?v=fDtL3PpNI-g
- Far cry 5 https://www.youtube.com/watch?v=ZxFdwpeRIU8
- [教程] Unreal Engine 4 Dynamic Foliage Collision / Impulse Response https://www.youtube.com/watch?v=TDLbjF0dRog
All-in-shader
直接把角色的坐标等信息作为碰撞体信息传入shader,
在shader内完成所有碰撞/距离检测及变形处理。
- 优点
- 实现最简单,不需要额外的系统
- 缺点
- 能处理的信息有限,难以处理多个交互对象
- shader内的计算量容易爆炸,难以优化
- shader不持有任何状态,所以不能实现惯性或者恢复的效果
- 优化策略
- 优化shader内的计算
- 示例
- 无 (或者说所有动起来很诡异的游戏www)
三种方法各有优劣,也可以根据需求同时使用几种。
另外需要注意的是,既然有交互,通常也会有随风摆动的需求,
变形的时候需要花一些功夫找到其中的平衡点。
目录