【Unity】鱼群效果模拟

鱼群效果模拟

文章目录

  • 鱼群效果模拟
  • 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.rhkb.cn/news/23710.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI时代】可视化训练模型工具LLaMA-Factory安装与使用

文章目录 安装训练使用 安装 官方地址:https://github.com/hiyouga/LLaMA-Factory 创建虚拟环境 conda create -n llama-factory conda activate llama-factory安装 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip in…

tailwindcss学习03

01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…

Java 笔记(自用)

Java是一种面向对象(opp)的、解释性的跨平台语言。所谓的跨平台是Java的一个编译好的.class文件可以在多个系统下运行。解释性则是编译后的代码需要解释器来执行&#xff0c;与之相对应的c/c是编译性语言&#xff0c;编译后的代码可以直接被机器执行。 jdkjrejava的开发工具 …

Matlab——图像保存导出成好看的.pdf格式文件

点击图像的右上角&#xff0c;点击第一个保存按钮键。

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…

《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

《Python实战进阶》专栏 第3集&#xff1a;Django 项目结构解析与入门DEMO 在本集中&#xff0c;我们将深入探讨 Django 的项目结构&#xff0c;并实际配置并运行一个入门DEMO博客网站&#xff0c;帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

win32汇编环境,对话框中使用菜单示例三

;运行效果 ;win32汇编环境,对话框中使用菜单示例三 ;鼠标点击右键时&#xff0c;弹出菜单的功能 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

stm32-电源控制

STM32 的 PWR&#xff08;Power Control&#xff09;外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设&#xff0c;可以实现低功耗模式、电压调节、备份域控制等功能&#xff0c;从而优化系统的功耗和性能。 stm32内部电源框图 电源区域 VDD 供电区&#x…

云计算及其他计算

云计算知识思维导图&#xff1a;https://kdocs.cn/l/cpl2Kizx7IyC 云计算的核心判断标准通常基于美国国家标准与技术研究院&#xff08;NIST&#xff09;的定义&#xff0c;并结合实际应用场景。以下是判断一个服务是否为云计算的关键标准&#xff0c;以及对应的服务类型&#…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类&#xff0c;供MVC模式、前后端分离模式下的后台服务使用&#xff0c;以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式&#xff0c;包括状态码、返回消息、返回数据等&#x…

OkHttp使用和源码分析学习(二)

流程及源码分析 OkHttpClient使用过程主要涉及到OkHttpClient、Request、Response、Call、Interceptor&#xff0c;具体参考OkHttp使用。OkHttp在设计时采用门面模式&#xff0c;将整个系统复杂性隐藏&#xff0c;子系统通过OkHttpClient客户端对外提供。 流程 创建 OkHttp…

架构师论文《论湖仓一体架构及其应用》

软考论文-系统架构设计师 摘要 作为某省级商业银行数据中台建设项目技术负责人&#xff0c;我在2020年主导完成了从传统数据仓库向湖仓一体架构的转型。针对日益增长的支付流水、用户行为埋点及信贷审核影像文件等多模态数据处理需求&#xff0c;原有系统存在存储成本激增、实…

政安晨的AI大模型训练实践 九 - 熟悉LLaMA Factory的详细参数含义-基本概念理解一下

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 小伙伴铁子们&#xff0c;上手先熟悉起来训练工具的每一个参数&#xff0c;很重要。 参照我…

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;这篇文章一共5721个字&#xff0c;是我截至目前写的最长的一篇文章&a…