Games 103 作业四

Games 103 作业四

第四次作业就是流体模拟了,作业中给了若干的实现步骤,以及一些模板代码。

首先第一步,在update函数的开头,加载水面mesh的高度,然后在update的结束时,把计算后的高度更新到mesh中。这个很简单:

void Update () 
{
    Mesh mesh = GetComponent<MeshFilter> ().mesh;
    Vector3[] X    = mesh.vertices;
    float[,] new_h = new float[size, size];
    float[,] h     = new float[size, size];

    //TODO: Load X.y into h.
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            h[i, j] = X[i * size + j].y;
        }
    }

    //TODO: Store h back into X.y and recalculate normal.
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            X[i * size + j].y = h[i, j];
        }
    }
    mesh.vertices = X;
    mesh.RecalculateNormals();
}

第二步,当玩家按下r键时,需要在水面随机落下一个水滴,那么该位置的水面高度需要增加,为了避免水面溢出,还需要把该位置附近的水面高度减小,这样保证整体的水量不变。

if (Input.GetKeyDown ("r")) 
{
    //TODO: Add random water.
    int ri = Random.Range(0, size);
    int rj = Random.Range(0, size);
    float rh = Random.Range(0.1f, 1.0f);
    h[ri, rj] += rh;

    int neighbors = 0;
    if(ri > 0) neighbors++;
    if(ri < size - 1) neighbors++;
    if(rj > 0) neighbors++;
    if(rj < size - 1) neighbors++;

    rh /= neighbors;
    if(ri > 0) h[ri - 1, rj] -= rh;
    if(ri < size - 1) h[ri + 1, rj] -= rh;
    if(rj > 0) h[ri, rj - 1] -= rh;
    if(rj < size - 1) h[ri, rj + 1] -= rh;
}

这个时候不停按r可以看到出现很多小坑,坑里还有个小尖峰:

Games 103 作业四1

下一步,就要把这个变化传递出去,作业里要求使用Neumann Boundaries算法来更新,具体可以参考PPT第25页:

Games 103 作业四2

void Shallow_Wave(float[,] old_h, float[,] h, float [,] new_h)
{		
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            new_h[i, j] = h[i, j] + damping * (h[i, j] - old_h[i, j]);
            if(i > 0) new_h[i, j] += rate * (h[i - 1, j] - h[i, j]);
            if(i < size - 1) new_h[i, j] += rate * (h[i + 1, j] - h[i, j]);
            if(j > 0) new_h[i, j] += rate * (h[i, j - 1] - h[i, j]);
            if(j < size - 1) new_h[i, j] += rate * (h[i, j + 1] - h[i, j]);
        }
    }

    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            old_h[i, j] = h[i, j];
            h[i, j] = new_h[i, j];
        }
    }
}

此时按r键就可以看到涟漪了:

Games 103 作业四3

那么接下来,就是要加上水面和方块的交互了。先要找到水面与方块相交的区域,然后计算出它们的low_h,这里计算相交可以使用Unity内置的Bounds.IntersectRay,每个水面格子从底部发射一条射线,然后判断是否和方块的包围盒相交,相交的距离就是low_h。

var go = GameObject.Find(name);
var renderer = go.GetComponent<Renderer>();
var bounds = renderer.bounds;
var pos = go.transform.position;
int grid_x = (int)(pos.x * 10 + size * 0.5f);
int grid_z = (int)(pos.z * 10 + size * 0.5f);
int li = grid_x - 6;
int ui = grid_x + 6;
int lj = grid_z - 6;
int uj = grid_z + 6;

for(int i = li; i <= ui; i++)
{
    for(int j = lj; j <= uj; j++)
    {
        if (i >= 0 && j >= 0 && i < size && j < size)
        {
            float dist = 99999;
            bounds.IntersectRay(new Ray(new Vector3(i * 0.1f - size * 0.05f, 0, j * 0.1f - size * 0.05f),
                Vector3.up), out dist);
            low_h[i, j] = dist;
        }
    }
}

然后需要计算vh,参考PPT第31页的流程:

Games 103 作业四4

for(int i = 0; i < size; i++)
{
    for(int j = 0; j < size; j++)
    {
        if (low_h[i, j] <= new_h[i, j])
        {
            b[i, j] = (new_h[i, j] - low_h[i, j]) / rate;
            cg_mask[i, j] = true;
        }
        else
        {
            b[i, j] = 0;
            cg_mask[i, j] = false;
            vh[i, j] = 0;
        }
    }
}

Conjugate_Gradient(cg_mask, b, vh, li, ui, lj, uj);

得到vh之后,就可以拿来迭代,计算出最终的new_h了:

Games 103 作业四5

for(int i = 0; i < size; i++)
{
    for(int j = 0; j < size; j++)
    {
        if (cg_mask[i, j])
        {
            vh[i, j] *= gamma;
        }
    }
}

for(int i = 0; i < size; i++)
{
    for(int j = 0; j < size; j++)
    {
        if(i > 0) new_h[i, j] += rate * (vh[i - 1, j] - vh[i, j]);
        if(i < size - 1) new_h[i, j] += rate * (vh[i + 1, j] - vh[i, j]);
        if(j > 0) new_h[i, j] += rate * (vh[i, j - 1] - vh[i, j]);
        if(j < size - 1) new_h[i, j] += rate * (vh[i, j + 1] - vh[i, j]);
    }
}

最终的效果如下:

Games 103 作业四6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/406708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSDN原力值怎么提升?

文章目录 前言一、原力值怎么看二、提升原力值的方法1.原力值↑2.原力值↓提示!!!禁止在csdn网站内进行违规行为!!! 结束语 前言 在前面一篇文章中&#xff0c;我讲了付费收看的条件&#xff0c;有需要的先把网址收藏起来&#xff01; https://blog.csdn.net/m0_69481332/arti…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis&#xff0c;一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xf…

【Java面试系列】Nginx

目录 为什么要用Nginx&#xff1f;为什么Nginx性能这么高&#xff1f;Nginx 是如何实现高并发的&#xff1f; Nginx怎么处理请求的&#xff1f;Nginx的工作流程 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日…

前沿科技速递——YOLOv9

随着YOLO系列的不断迭代更新&#xff0c;前几天&#xff0c;YOLO系列也迎来了第九个大型号的更新&#xff01;YOLOv9正式推出了&#xff01;附上原论文链接。 arxiv.org/pdf/2402.13616.pdf 同样是使用MS COCO数据集进行对比比较&#xff0c;通过折线图可看出AP曲线在全方面都…

2024比较赚钱的项目是什么?亲身经历,月入过万!

我是电商珠珠 年后找项目这件事&#xff0c;成为了部分人所焦虑的一点&#xff0c;有的想要兼职&#xff0c;有的在考虑全职。至于做什么还没有一丝头绪。大家都知道短视频很火&#xff0c;于是有直播能力的人就吃上了流量红利&#xff0c;开始做达人带货&#xff0c;拍视频接…

Linux下“一切皆文件”

“Linux下一切皆文件” Linux 下一切皆文件这个说法是指 Linux 系统中的一种设计理念&#xff0c;即将所有设备、资源和进程等抽象为文件或文件夹的形式。这种设计理念的好处在于统一了对待不同类型资源的方式&#xff0c;提供了统一的接口和工具来进行管理和操作。 Linux 下…

Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式 Flutter Slider控件的滑块系统样式是一个圆点&#xff0c;thumbShape默认样式是RoundSliderThumbShape&#xff0c;如果想要使用其它的样式就需要自定义一下thumbShape&#xff1b; 例如需要一个上图样式的&#xff08;圆点半透明圆形边框&#xff09…

freeswitch 权威指南 --- 高级篇

官网文档&#xff1a;https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程&#xff1a;https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》&#xff1a;目录&#xff1a;https://juejin.cn/post/702058079…

2024全国水科技大会暨流域水环境治理与水生态修复论坛(六)

论坛召集人 冯慧娟 中国环境科学研究院流域中心研究员 刘 春 河北科技大学环境与工程学院院长、教授 一、会议背景 为深入贯彻“山水林田湖是一个生命共同体”的重要指示精神&#xff0c;大力实施生态优先绿色发展战略&#xff0c;积极践行人、水、自然和谐共生理念&…

软件游戏报错d3dcompiler_43.dll缺失,提供多个方法修复d3dcompiler_43.dll

当电脑系统缺失 d3dcompiler_43.dll 文件时&#xff0c;尝试打开依赖于该文件的软件时&#xff0c;通常会遇到以下几种情况&#xff1a; 启动失败&#xff1a; 软件在启动过程中可能会立即停止响应或弹出错误消息&#xff0c;指出“找不到 d3dcompiler_43.dll”、“无法启动此…

LabVIEW开发FPGA的高速并行视觉检测系统

LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展&#xff0c;视觉检测在生产线中扮演着越来越重要的角色&#xff0c;尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性&#xff0c;难以满足当前生产需求的高速和高精度要求。为此&#xf…

Windows 远程控制 Mac 电脑怎么操作

要从 Windows 远程控制 Mac 电脑&#xff0c;您可以使用内置 macOS 功能或第三方软件解决方案。以下是一些方法&#xff1a; 一、使用内置 macOS 功能&#xff08;屏幕共享&#xff09; 1、在 macOS 上启用屏幕共享 转至系统偏好设置 > 共享&#xff1b;选中“屏幕共享”…

2024-02-20(DataX,Spark)

1.Oracle利用DataX工具导出数据到Mysql。Oracle利用DataX工具导出数据到HDFS。 只是根据导入导出的目的地不同&#xff0c;DataX的Json文件书写内容有所不同。万变不离其宗。 书写的Json格式的导入导出规则文件存放再Job目录下的。 2.Spark概念 Apache Spark是用于大规模数…

使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

【算法与数据结构】1971、LeetCode寻找图中是否存在路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题应用并查集的理论直接就可以解决&#xff1a;【算法与数据结构】回溯算法、贪心算法、动态规划、图…

Golin 弱口令/漏洞/扫描/等保/基线核查的快速安全检查小工具

下载地址&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/db6afba6de1f 主要功能 主机存活探测、漏洞扫描、子域名扫描、端口扫描、各类服务数据库爆破、poc扫描、xss扫描、webtitle探测、web指纹识别、web敏感信息泄露、web目录浏览、web文件下载、等保安全风险问题风险…

QPaint绘制自定义仪表盘组件02

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 最终效果 ui&#xff0c;创建一个空的widget widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QTimer>QT_BEGIN_NAMESPACE namespace Ui { c…

HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)

OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用OSPF Version 2&#xff0c;针对IPv6协议使用OSPF Version 3。 在OSPF出现前&#xff0c;网络…

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; CUDA编程模型 我们使用CUDA_C语言进行CUDA编程&am…

软考-中级-系统集成2023年综合知识(三)

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 软考中级专栏回顾 专栏…