[Unity]液体物理

2023-10-06 22:39
文章标签 unity 物理 液体

本文主要是介绍[Unity]液体物理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

翻译自:http://codeartist.mx/tutorials/liquids/

在这个教程中我会展示如何扩展你自己的水粒子(water particle),以使流体物理能在很多机器上运行(当然也包括手机)。

效果不是很现实,不过我可以保证这很简单而且可能是最省性能的方式。如果你知道如何如何在unity中编码以及使用刚体碰撞,你将用他们做一些疯狂的实验。

我建议你在开始这个教程之前先下载这个example project,尝试在一个新的场景中用相同的assets重新实现这个效果,你会更清晰地了解这是如何运作的。

在开始这个教程之前,希望你具备如下条件:

  • Unity中刚体的知识
  • 了解并能在Unity中使用shader
  • 能使用Render Texture

Metaballs

Ok, 如果你已经做过相关功课,那你应该大致了解metaball是如何运作的,如果还没有的话,那么这里有不错的教程你可以了解一下。

这里稍微讲一下,metabll是3D空间中的等值面。想象空间中有两个电子,会形成一个磁场,类似如下:


这里写图片描述
图片上的亮度代表了磁场的强度。这种效果类似水滴的融合或者细胞的分裂,所以我们在游戏里可以用meataball来模拟水滴(运用这个技术就可以实现《小鳄鱼爱洗澡》中的流体效果了)。

那么metaball中的shader是怎么起作用的呢,那么请看这段shader代码
这段代码中的最后一句是
color=floor(color/0.1)*0.5;
这句是metaball效果的精髓所在。


这里写图片描述

这里写图片描述

Metaballs in Unity:

现在已经基本了解了什么是metaball,那么下一步,我们要将GLSL转换成Unity中使用的shaderlab,其中最重要的fragment部分如下:

half4 frag (v2f i) : COLOR{half4 texcol,finalColor;texcol = tex2D (_MainTex, i.uv);finalColor=half4(0.0,texcol.g/2.0,texcol.b,texcol.a);if(finalColor.a>0.2){finalColor.a=0.5;finalColor.b=floor((finalColor.b/0.1)*0.5);}return finalColor;
}

完整的shader代码在project中。

不知道你注意到没有,我使用一张纹理而不是计算每个像素来表示一个水滴,这是空间换时间点方法,直接从图片上读取效率更高(毕竟PS能轻松完成这件事)。那么让我们创建一张类似水滴的图片并将这张纹理应用进去。


这里写图片描述
接下去用我们刚才的shader创建一个材质

这里写图片描述
结果看起来应该如下:

这里写图片描述

为了模拟水滴,我们需要为我们的水滴添加碰撞体,3D中添加sphere collider,这个碰撞体要比图片中的像素轮廓小一点,这样我们就能模拟水滴融合但又不完全重叠的效果了


这里写图片描述

Render Textures

render texutre 表现得和普通纹理差不多,所以我们可以用shader做用于它。当我们将metaball shader用于这个render texture的时候, 如果摄像机看到的白色的东西,它将会如我们实验中一样merge这些颜色。

为了避免不把和metabll不相关的白色混进去,我们需要两个摄像机,一个只追踪metaball的图像,一个追踪正常的场景:


这里写图片描述

这里写图片描述
那么创建一张render texture吧。

这里写图片描述

复制一个摄像机,将输出定向到创建的render texture(culling mask只设置Liquids):


这里写图片描述

这里写图片描述

我们在场景中添加一些水滴, 运行游戏,你将会看到:


这里写图片描述

这里写图片描述

从上面的右边部分可以看到,水滴已经有类似磁场线的分割了。那么这个水滴融合效果算是成功了。

FullProject

First Release, basic water

Second Release, color merging

原文地址:http://codeartist.mx/tutorials/liquids/

这篇关于[Unity]液体物理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154332

相关文章

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

JAVAEE初阶第七节(中)——物理原理与TCP_IP

系列文章目录 JAVAEE初阶第七节(中)——物理原理与TCP_IP 文章目录 系列文章目录JAVAEE初阶第七节(中)——物理原理与TCP_IP 一.应用层重点协议)1. DNS2 .NAT3. NAT IP转换过程 4 .NAPT5. NAT技术的缺陷6. HTTP/HTTPS7. 自定义协议 二. 传输层重点协议 1 .UDP协议 2.1.1 UDP协议端格式 2.1.2 UD

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源,你需要向加载方法传递一个键或键列表。键可以是以下对象之一: Address:包含你分配给资源的地址的字符串。Label:包含分配给一个或多个资源的标签的字符串。AssetReference Obj

在Unity环境中使用UTF-8编码

为什么要讨论这个问题         为了避免乱码和更好的跨平台         我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本,默认是看不到在VS中的编码格式,下面我介绍一种简单快

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)-CSDN博客 做完了数据结构类,该做一个存储类了,也就是生成一个字典类(只是声明)  实现和上一节的数据结构类的方式大同小异,所