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

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

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

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

Unity中刚体的知识

了解并能在Unity中使用shader

能使用Render Texture

Metaballs

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

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

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

那么metaball中的shader是怎么起作用的呢,那么请看这段shader代码

#ifdef GL_ES

precision mediump float;

#endif

uniform float time;

uniform vec2 mouse;

uniform vec2 resolution;

float MetaBall(vec2 position){

return 1.0/(pow(position.x,2.0)+pow(position.y,2.0));

float Blob(vec2 position,vec2 point, float radius){

float temp=pow(position.x-point.x,2.0)+pow(position.y-point.y,2.0);

float result=0.0;

if( temp

float distance=sqrt(pow(position.x-point.x,2.0)+pow(position.y-point.y,2.0))/radius;

result=pow((1.0-pow(distance,2.0)),2.0);

return result;

void main( void ) {

float PI=3.141516;

vec2 position = gl_FragCoord.xy / resolution.xy ;

vec2 pointA= vec2(0.35,0.5),pointB= vec2(0.65,0.5);

vec2 mousePosition = ( gl_FragCoord.xy / resolution.xy ) + mouse / 4.0;

float radius=0.3;

float blobValue=0.0;

blobValue+=Blob(position,pointA,radius);

blobValue+=Blob(position,pointB,radius);

blobValue+=Blob(position,mouse,radius);

vec4 color=vec4(0.0,blobValue/2.0,blobValue,1.0);

color=floor(color/0.1)*0.5;

gl_FragColor = color;

这段代码中的最后一句是

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):

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

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

unity给头发添加物理_Unity中如何加入液体物理效果相关推荐

  1. unity 下一帧执行_Unity中的Havok Physics物理引擎

    在GDC 2019上,我们宣布将Havok Physics作为预览版资源包加入到Unity资源包管理器,这意味着所有Unity开发者都可以使用这款知名的物理引擎.在当今主机平台中,Havok Phys ...

  2. unity给头发添加物理_Unity学习笔记 Vol.64 使用Spring Bone给角色添加头发效果

    摘要 在游戏中,让我们的角色拥有一头柔顺的秀发,可以使角色显得更加生动.在UnityChan模版我们可以从中借鉴Unity酱的飘逸的头发的实现方法.下面我们来具体研究一下. 实现方法 UnityCha ...

  3. unity给头发添加物理_unity游戏角色发型头发设计毛发毛皮纹理胡子生成编辑插件Hair Designer v1.5.7...

    Hair Designer是角色发型头发和毛发毛皮纹理胡子设计生成编辑插件,包括可自定义的着色器. Hair designer is an amazing tool for generating dy ...

  4. unity给头发添加物理_unity3d Hair real time rendering 真实头发实时渲染

    先放上效果 惊现塞拉酱 算法是Weta Digital根据siggraph2003的论文加以改进,改进之前使用的是Kajiya and Kay's 模型,它能量不守恒,也就是说不是基于物理的,不准确 ...

  5. unity给头发添加物理_不需要写代码,直接在unity实现手机可以跑的毛发效果

    马上注册,加入CGJOY,让你轻松玩转CGJOY. 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 大家好,  我是炭窑居士, 好久不见 这次由我和好友fxyyoung一起给大家带来原创的毛发 ...

  6. unity调用普通java类_Unity中C#和Java的相互调用实例代码

    1.通过C#调用Java的方法: 在C#中添加调用的一些代码,利用Unity提供的一些接口实现调用Java! private const string JAVA_CLASS_Name = " ...

  7. dll放在unity哪个文件夹下_unity中调用dll文件总结

    unity中调用dll文件总结 根据收集的资料,对unity中调用dll文件进行总结,目前常用的两种,在给出vs中封装dll文件的步骤. 一.调用c#中的dll文件 1.1封装dll文件 首先新建一个 ...

  8. dll放在unity哪个文件夹下_Unity中调用DLL库

    DLL -- Dynamic Link Library(动态链接库文件),这里以Window平台为例. Unity支持的两种语言生成的DLL库(C++.C#),这里以C#为例,C++网上可以搜索很详细 ...

  9. unity 摄像头跟着鼠标移动_unity中镜头跟随鼠标移动

    摄像头移动 在游戏中大家的第一人称 第三人称都是靠摄像头的移动来实现的 ,现在给大家介绍一下摄像头的随着鼠标的旋转以及控制器运动的脚本 在项目中的Main Camera上添加脚本名字随便: 然后就是脚 ...

最新文章

  1. 深度 | 推荐系统评估
  2. 企业网络推广期间面对网站外链优化企业网络推广专员有话说
  3. 用prop还是attr
  4. React开发(129):ant design学习指南之form中的layout
  5. php项目中sql,php – 大括号{}在SQL查询中做了什么?
  6. Ztree加载完成后显示勾选节点
  7. 修改IDLE查找历史命令为上箭头↑
  8. linux系统怎样挂载虚拟盘,linux 应用盘(从盘)挂载方法linux操作系统 -电脑资料...
  9. 【整理操作】MQTT简单使用学习
  10. TensorFlow之Numpy(3)
  11. (转)Weblogic 8.1的安装与配置
  12. 2021-09-30 node上传文件的问题以及如何选择适合自己的插件
  13. java 过滤微信昵称_java过滤微信昵称特殊字符
  14. 实习生快速入手项目php,2019.7最惨的三次面试经历-----百度PHP实习生面经
  15. Unity 图片字体制作
  16. 3.1 Vendor Model浅析
  17. NBIOT透传模块在智能公寓锁上的使用2
  18. VMware vSphere 7 vCenter 7 ESXi 7 正式版下载地址
  19. 警惕更改电子邮件内容实施诈骗活动
  20. android 支持最低版本是多少g,手机需要多少G的运行内存,才真正够用?

热门文章

  1. 百度回应公开员工工作状态预测专利
  2. R语言实验---电商产品评论数据情感分析
  3. C++——程序员的逼格神器-github
  4. 微信小程序中,需要注意ios系统的坑: 日期不识别横杠“-”符、输入框设置maxlength时,拼音也会被限制……
  5. 将递归函数转换为非递归形式
  6. OMRON CP1H PLC脉冲控制三轴伺服, 码垛机,实际 项目,程序结构清析,有完整的注释,重复功能做成FB功能块,在其它项目可以导出直接用,MCGS触摸屏程序,有电气CAD图纸。
  7. 股市量化接口都有哪些?
  8. k8s部署留言板guestbook
  9. 每日一课 | Python综合案例实战
  10. MySQL MHA高可用集群部署及故障切换(图文详解)