之前的水滴生成器很简单,但有问题。它在边缘情况下会出现问题(字面上就是这样)。
之前它只是在瓶子掉落的地方生成一个预制的圆形网格,这意味着它不知道边缘在哪里,或者水流是否被物体阻挡。
为了解决这个问题,我不得不从头开始创建一个程序化的水滴生成器。
我使用了BFS(宽度优先搜索)算法,使其从玻璃杯嘴部向外扩散地更为现实。它工作了,但不幸的是,形状变成了一个菱形而不是圆形。
我意识到,如果在生成下一个点时使用优先队列(优先级是距离玻璃杯嘴部的距离),而不是普通队列,结果会更平滑和圆滑,因为更靠近的点会首先扩散。
但它仍然不能避开物体,仍然会溢出边缘。解决这个问题很简单,使用射线检测。从玻璃杯嘴部,向四个方向射出射线,检测碰撞器,并在碰撞器阻塞时取消点生成。
生成足够的点后,从那里,我向下方射出射线来找到最近的有效地面。因此,它只在那里生成球体,并通过这种方式生成水滴。
最终的网格是使用Marching Cubes算法创建的,我将上述算法生成的所有点赋予了blob半径,它生成了一个合并的水滴。 (无需提供实际网格球体,优化了该算法)
所以,总结一下,它的工作流程如下:
1) 使用BFS算法生成从中心向外扩散的球体。
2) 在地板上向四个方向射出射线,检测墙壁。
3) 从那里,向下方直射射线,直到碰撞器来检测地面。
4) 使用Marching Cubes算法,将球体转换为可以在游戏中使用的实际网格。
感谢您的阅读,我希望这对您有所帮助!如果您感兴趣知道我的游戏叫什么,那就是Barely Breathing,如果您能在Steam上Wishlist,我会很感激。
评论 (0)