【Unity】鱼群效果模拟

news/2025/2/25 23:47:08

鱼群效果模拟

文章目录

  • 鱼群效果模拟
  • Boid算法
  • 实现方式
    • version1_CPU
    • version2_GPU
    • version3_Multilateration
    • version4_Bitonic_Sorting (GPU友好)
    • version5_Skinning (TODO)
  • 细节项
  • 优化项
  • 参考链接


Boid算法

Boid算法是一种模拟群体行为的算法,由Craig Reynolds在1986年提出,主要用于模拟鸟群、鱼群等生物的集体运动。其核心思想是通过简单的规则让个体(Boid)表现出复杂的群体行为。

  1. 分离(Separation):
    ● 每个Boid会与邻近的Boid保持一定距离,避免碰撞。
    ● 通过计算与邻近Boid的距离并调整方向,确保个体间不靠得太近。
  2. 对齐(Alignment):
    ● 每个Boid会调整自己的方向,使其与邻近Boid的平均方向一致。
    ● 通过计算邻近Boid的平均方向,调整自身方向以保持群体的一致性。
  3. 凝聚(Cohesion):
    ● 每个Boid会向邻近Boid的中心位置移动,保持群体聚集。
    ● 通过计算邻近Boid的中心位置,调整自身位置以维持群体凝聚力。

实现方式

version1_CPU

核心:使用Physics.OverlapSphere函数获取周围鱼的信息,并更新旋转和方向。但此时cpu会大量循环,造成卡顿,URP里但依然会合批。
在这里插入图片描述


version2_GPU

核心:不能使用unityapi获取周围鱼群,在computershader中去遍历所有鱼群,进行Boid计算,Graphics.DrawMeshInstancedIndirect 直接提交gpu绘制。此时使用gpu代替cpu计算,但是遍历计算次数还是太多。
在这里插入图片描述


version3_Multilateration

核心:多点定位。
先进行多点定位,在进行Boid计算,只是修正了算法,本质上没有提升效率。


version4_Bitonic_Sorting (GPU友好)

核心:空间划分哈希双调排序
空间划分论文链接
在这里插入图片描述
双调排序的作用是什么?
● 首先我们需要将空间划分为3d/2d的均匀网格,当我们计算鱼下一帧位置时,获取周围的单位只需要获取以其为圆心,自定义半径内的网格体集合,避免大量循环。
● 在同一个网格的单位cell key (可能会有相同键值,所以还会进行距离计算进行剔除)

index索引
cell coord空间坐标
cell hash哈希值
cell key哈希键

根据哈希算法,我们就能获取以 CellKey 为排序的列表,并且能跟cellkey获取相同单元格内的鱼单位,也能根据空间网格坐标(cell coord) 获取的CellKey计算周围单元格。
● 实现上述以 CellKey 为排序的列表的列表就用到了双调排序,获取从小到大或者从大到小的序列。
● 最终流程就是,将上述所有数据和运算全部放到gpu里运算。

在这里插入图片描述


version5_Skinning (TODO)

当我们不使用顶点动画而是骨骼动画时,动画系统大多在CPU上进行, 就需要使用到GPU Skinning ,但是鱼群的数量很多,玩家一般不会观察特别细致,只要进行简单函数修改定点着色器就行了


细节项

  • 鱼的集群行为模式,如旋涡等
  • 鱼的避障、攻击和跟随
  • 鱼的动作可以根据顶点动画来进行修改

优化项

  • 大场景避免鱼群到处乱跑,给你固定一个区域(AABB包围盒),同时对包围盒进行视锥剔除,不在相机内时就可以剔除渲染,同时终止该区域鱼群绘制。

参考链接

网易雷火经验贴
CUDA 空间划分 论文
GPU Skinning


http://www.niftyadmin.cn/n/5866971.html

相关文章

ASP.NET Core Clean Architecture

文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. IEmail接口层2. Ema…

C++的allactor

https://zhuanlan.zhihu.com/p/693267319 1 双层内存配置器 SGI设计了两层的配置器,也就是第一级配置器和第二级配置器。同时为了自由选择,STL又规定了 __USE_MALLOC 宏,如果它存在则直接调用第一级配置器,不然则直接调用第二级配…

华为数通 HCIP-Datacom H12-831 新题

2024年 HCIP-Datacom(H12-831)变题后的新题,完整题库请扫描上方二维码,新题在持续更新中。 某台IS-IS路由器自己生成的LSP信息如图所示,从LSP信息中不能推断出以下哪一结论? A:该路由器某一个接口的IPv6地…

本地VSCode远程连wsl2中的C++环境的开发配置指南

请参考上一遍文章:在windows上安装wsl2,在wsl2中配置C开发环境-CSDN博客

量子计算如何改变加密技术:颠覆与变革的前沿

量子计算如何改变加密技术:颠覆与变革的前沿 大家好,我是Echo_Wish,一名专注于人工智能和Python的自媒体创作者。今天,我们来探讨一个前沿且引人深思的话题——量子计算如何改变加密技术。随着量子计算的快速发展,传统的加密技术面临前所未有的挑战和机遇。本文将详细介绍…

算法(四)——动态规划

文章目录 基本思想适用条件最优子结构子问题重叠状态转移方程 解题步骤应用斐波那契数列背包问题最大子数组和 基本思想 动态规划的核心思想在于将一个复杂的问题分解为一系列相互关联的子问题,通过求解子问题并保存其解,避免对相同子问题的重复计算&am…

回合制游戏文字版(升级)

//在上一篇博客的基础上,加了细节的改动 //改动:添加了外貌,性别,招式的细节描绘;添加了个人信息展示界面 //一创建java文件1,命名为playGame package test2;import java.util.Random;public class play…

PHP入门基础学习四(PHP基本语法)

运算符 运算符,专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用,可以将PHP语言中常见的运算符分为9类 算数运算符: 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…