Unity3d中怎样html5 实现3d全景图下雨

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Unity3D教程:如何使用动画系统制作下雨效果-GAD腾讯游戏开发者平台之前看了以前版本的unity3d demo AngryBots ,觉得里面的下雨效果不错,刚好前段时间学习了,写出来跟大家分享下,直接开始。
使用自带动画系统制作下雨效果。
先制作下雨的雨滴涟漪。
在project中新建文件夹,命名为rainFX。将图片素材RainStreak及Ripple导入到rainFX文件夹中,创建一个plane,改名为RippleObj,创建一个material,命名为ripple。(将导入的Ripple贴图的Alpha from Grayscale 打上勾,以使贴图的背景透明)
将ripple材质赋给RippleObj。
修改材质的Shader为Particles/Addtive,将Ripple贴图赋给ripple材质的Texture,在inspector窗口中修改Particle Texture,Tilling的x值设为0.1666,y为1,offset的x为0.8333,y为0。选中RippleObj,将Shader下的Tint Color改为白色。(改为白色为了使雨滴更加明显一点)
修改后效果:
选中RippleObj,按Ctrl+6,调出Animation窗口,点击窗口下的Ripple(material),会发现下面都是灰色不可选状态。
点击RippleObj右边的一个小按钮,会出现[Create New Clip],点击。此时Ripple(Material)下的选项都已可用。
点击后会出现下面的对话框,提示保存动画文件。命名为RainAnimation,保存。
选择Ripple(Material)下的Main Tex.offset.x,点击右边的小横线-&Addkey。
拖动时间轴到0.05,再次Addkey,修改offset.x为0.1666。分别在0帧Addkey,offset.x为0,0.05帧Addkey,offset.x为0.帧Addkey,offset.x为0.帧Addkey,offset.x为0.5,0.2帧Addkey,offset.x为0.帧Addkey,offset.x为0.8333。效果图如下:
此时的Animation窗口中有一条从0.0&0.25的红色斜线,用鼠标框选六个关键帧,右键&&Both Tangents&&Constant(右键需在红色的关键点上点击)。此时斜线被改为梯形上升的线。选择Tint Color.a,在0.0帧修改Tint Color.a为1,0.25帧即最后一帧设置Tint Color.a为0。使动画有一个透明渐变的效果。
到此,涟漪效果制作完成。
步骤6:开始添加脚本,控制涟漪的消失,脚本名:RippleDestroy。
1 using UnityE
2 using System.C
4 public class RippleDestroy : MonoBehaviour
public void DestroyMe()
Destroy(gameObject);
//删除自身
将脚本赋给RippleObj。
在Animation窗口中,最后一帧即0.25帧处,点击右边的Add Event按钮,在0.25帧添加一个事件并将DestroyMe()赋给Function。
将RippleObj拖到rainFX文件夹中,使之成为一个prefab。然后可以将场景中的RippleObj删掉。
&创建一个空物体。GameObject&&Create Empty。改名为ripple,此时场景中只有Main Camera,ripple。
创建一个rippleFX脚本:
1 using UnityE
2 using System.C
4 public class rippleFX : MonoBehaviour
public GameObject rippleO
//涟漪实例
void Start ()
void Update ()
//每隔5帧,计时器发生作用
GameObject tempObj=Instantiate(rippleObj) as GameO
//复制涟漪物体
tempObj.transform.parent=gameObject.
//设置子物体
tempObj.animation.Play();
//播放动画文件
tempObj.transform.position=transform.position+new Vector3(Random.Range(10,-10),0,Random.Range(10,-10));//移动涟漪物体到一个随机位置
将rippleFX脚本赋给空物体ripple,再将prefab物体RippleObj赋给ripple的脚本的变量RippleObj即可。
点击运行,即可出现地上很多涟漪的效果。
&涟漪做完了,下一篇继续写雨滴的做法~~
阅读(...) 评论()本文首发蛮牛,次发博客园。接系列 ,,本文为第三篇,再次感谢&&在前两篇无私且精彩的问题解答
写在最前,时光煮雨,为了怀念
以下引用曾今读过的一些教程文章
& 其实这3种动画都有它特定的使用场合。
&&& 第一种动画适合创建简单的对象位移及直接性质的属性更改(在后面的教程中,我还将更深入的挖掘Storyboard动画的潜力,动态创建更复杂的基于KeyFrame的关键帧动画)。
&&& 第二种动画适合全局属性的时时更改,例如我们后面要讲到的敌人或NPC以及地图等全体性的相对位移及属性更改时就要用到它了。
&&& 第三种动画则非常适合运用在Spirit(角色)的个人动画中,例如角色的移动,战斗,施法等动作。
&&& 小结:前三节分别讲解了Storyboard动画,CompositionTarget动画,DispatcherTimer动画,并横向分析了不同的场合对应不同的动画应用模式,这些将是构成WPF/Silverlight游戏引擎的基础。
这里的三种动画形式分别可以类比到Unity3d中的,
第一种,基于DoTween的各种MoveTo(Vector3,duration),或者是第一篇的直接移动;
第二种,基于Update的逐帧更新;
第三种,基于FixUpdate的定时更新,比如这里提到的战斗可能是有物理碰撞,或者是一种类似自定义的计时器的Timer(下篇会分析下)。
这些东西比较底层了,需要了解FixUpdate和Update的区别,以及UI线程和非UI线程之间的关系(wpf中的DispatcherTimer的概念)
这块东西有点深,我也不敢妄言,是否正确有大师路过,可以解惑一下。列出两篇参考文章,供延伸阅读吧
这三种动画形式,很多人都知道,但是如何使用和区别,却在博文中只字未提。
这里引用列出来只为怀念。
前两篇都比较基础,运用一些基础知识,其实早都有一些大牛封装好了插件和工具,不必大家再重复制造轮子。但各种封装难免有功能重叠,且可能用法也会有不同,这可能是我们需要稍微留意的东西。这篇主要罗列下基于DoTween插件UGUI的直接移动和Unity Native2D实现鼠标点击逐帧移动的功能实现,关于这两个插件和功能不再详解,因为有的是教程,若想学习自己搜索吧。图片还是一样的
基于DoTween的UGUI平移,这里自己计算了下 duration可能不对欢迎指正,代码如下:
using UnityE
using System.C
using UnityEngine.UI;
using DG.T
public class PanelContollerDoTween : MonoBehaviour {
// Use this for initialization
private float speed=2;
void Start ()
// Update is called once per frame
void Update () {
if (Input.GetButton("Fire1"))
//这里写的该坐标是像素坐标,也就是屏幕坐标的意思(比世界坐标小)
Vector3 mouseWorldPostion = Input.mouseP//Camera.main.ScreenToWorldPoint();
float duration = Vector3.Distance(mouseWorldPostion , sprite.transform.position) / speed * Application.targetFrameR
sprite.transform.DOMove(mouseWorldPostion, duration).SetEase(Ease.Linear);
这块稍微说一下,看过很多教程一般都是单讲UGUI或者单讲Natvie2D,很少有一起使用的,这里自己实验了下,直接建立一个Scene和UGUI一起使用即可,比较简单,深色的框是我给Panel设置的颜色便于区别,这里发现二者可以很好的共存的,效果图如下:
代码如下:
using UnityE
using System.C
public class PlayerController : MonoBehaviour
private Vector3 currentP
private Vector3 moveD
private float speed = 2;
private Vector3 targetP
Vector3 mouseWorldPositon = Vector3.
// Use this for initialization
void Start()
moveDirection = Vector3.
// Update is called once per frame
void Update()
currentPositon = transform.
//是鼠标左键点击
if (Input.GetButton("Fire1"))
mouseWorldPositon = Camera.main.ScreenToWorldPoint(Input.mousePosition);
moveDirection = mouseWorldPositon - currentP
moveDirection.z = 0;
moveDirection.Normalize();
//Debug.Log(string.Format("x1:{0},y1:{1},z1:{2},x2:{3},y2:{4},z2:{5},d:{6}", mouseWorldPositon.x, mouseWorldPositon.y,mouseWorldPositon.z, currentPositon.x, currentPositon.y,currentPositon.z, Vector3.Distance(mouseWorldPositon, currentPositon)));
if (Vector3.Distance(new Vector3( mouseWorldPositon.x,mouseWorldPositon.y,0), currentPositon) & 1)
targetPositon = moveDirection * speed + currentP
transform.position = Vector3.Lerp(currentPositon, targetPositon, Time.deltaTime);
transform.position = targetP
这里留下了一个小问题就是关于移动了某一点的判断问题,这里我简单的使用了两点的距离小与某个绝对值来做的,但在Natvie2D下发现移动有跳跃,主要是坐标系的单位问题,如果有高手路过可以帮忙提供更好的方法。
根据三篇的学习,这篇是收获比较大的,特别是通过这篇的学习,找到了上篇中遇到的问题,主要是
1、鼠标点击的坐标问题?
2、是关于Vecotr3.Lerp插值的问题
如果细心的朋友可能会发现2个函数我在UGUI中都是注释掉的 
Camera.main.ScreenToWorldPoint(Input.mousePosition)
Vector3.Lerp(currentPositon, targetPositon, Time.deltaTime);
主要的问题其实是在坐标系的值上,UGUI专门做了一次优化,使用的2D世界的屏幕坐标单位是像素,值都很大,而Native2D使用的是3D世界的坐标系统单位是浮点百分值,所以在转换和使用上有差异的。
这篇也留下了一个问题,就是UGUI和Native2D的鼠标事件的遮挡问题,现在看到的现象是鼠标事件是可以穿越的,这个问题等到以后再解决吧。
阅读(...) 评论()教程 | 在Unity中实现逼真的下雨效果
在《》这场技术直播课程中。我们曾经为大家介绍过小型项目的场景搭建,并展示了Cinemachine在过场动画以及游戏玩法方面的强大能力。不少开发者询问场景中逼真的下雨效果是如何实现的。今天Unity技术经理成亮将会为大家详解如何在Unity中实现逼真的下雨效果。
项目中逼真的下雨效果实际上是一个自定义的后处理效果,不过和通常的平面后处理效果有所不同的是,雨水有距离感,有光感,也有从天而降的倾泻感 ,所以显得很真实。本文就会通过一个简单的示例,介绍这个效果的实现原理。
说明:为了方便大家学习,我们将为本文提供相应案例下载,下载地址请在本文末资源“相关资源”查询。
在《Neon》项目的场景中,我们看到当雨水穿越光线的效果。为了模拟出这样的效果,我们在示例场景中也需要添加相应的光源和雾效。需要说明的是,该场景中使用的体积光使用了Unity提供的开源组件VolumeLighting。
场景搭建的主要步骤如下:
在MainCamera中添加VolumetricFog组件
首先添加VolumeFog组件,可以方便查看后面添加的体积光的范围。添加好后,可以在组件中调整全局雾密度等相关参数。
添加区域光和管状光,并调整灯光的范围
在VolumetricLighting文件夹里面可以找到AreaLight和TubeLight的预制件,可以直接加入到场景中。下图是一个AreaLight的例子,我们可以调整他的范围以及光线强度等参数。
场景搭建完成后,我们就可以看到下图所示的效果了。
实现自定义后期处理类
Unity最新的后处理栈V2版本提供了多种后期处理效果,包括Bloom,AutoExposure,MotionBlur,ColorGrading等多种特效。使用也非常的方便,主要就是PostProcessVolume,和PostProcessLayer二个组件。具体使用可以参考快速指南。除此之外,我们还可以很方便的添加自定义的后处理效果。
下面我们就来实现我们的后期处理类吧,主要有下面二步。
实现自定义特效的设置
首先需要创建一个类PPRainFX 并继承于 PostProcessEffectSettings。然后重载函数IsEnableAndSupported,主要是为了确保在场景中存在PPRain实例的时候特效才能被使用。
PPRain是特效的主要实现脚本。由于该下雨特效的参数我们都放到PPRain中去配置了,所以在此处,我们并没有定义设置相关的参数。
实现自定义特效的渲染
先创建一个类PPRainFXRenderer,继承于PostProcessEffectRenderer&PPRainFX&。然后重载Renderer函数,在该函数中,我们主要是把PostProcessRendererContext中保存的摄像机,渲染源,渲染目标,以及命令缓存传递给PPRain的Render函数。后面我们会具体解释Render函数的实现。
下面这张图是PPRainFX.cs的内容,包含了后期处理类的完整实现。
渲染下雨动画
下雨动画的实现,很自然的想法就是把雨水画到屏幕上,然后利用UV动画实现下雨效果。
可是在3D的场景中,随着镜头的旋转,雨水的视觉效果会相应的变化,尤其是当镜头向上的时候,你会觉得雨水是从一个很远的点发射出来,如下图所示。
为了实现这样雨水从天而降的倾泻感,我们把雨水的贴图贴到一个类似于纺锤体的模型上。
说完基本原理,接下来我们就讲一下具体的实现,主要有以下二步。
创建PPRain类,实现参数配置以及模型绘制功能先看下目前所需要的一些设置参数,如下图所示,变量rainShader, rainMesh, rainTexture用于绑定着色器,模型,贴图,rainData0是用于调整UV动画的参数。再看一下Render函数,该函数实现了模型的绘制,会被之前说的后处理栈的render函数调用。在该函数中,首先会设置shader的参数,然后通过drawMesh绘制模型。xform定义了模型的坐标变换,可以看到模型会随着摄像机移动,也就是说可以一直在镜头中看到下雨到效果。
创建PPRainShader,实现UV动画。下图是PPRainShader的frag函数,注意uv坐标计算部分的代码,我们使用_UVData0对uv实现比例和位移变换,从而控制雨滴的大小以及x和y方向的位移速度。经过变换后的uv0就是实际用来贴图采样的坐标。
实现雨水的距离感
现在我们已经基本实现了下雨的动画效果。但是为了更加真实,我们还需要更近一步,让雨水有距离感。也就是说近距离的雨水会更加明亮,远距离的会变暗,而且会被近距离的物体所遮挡。为了实现这样的效果,我们主要需要以下三步:
获得当前像素点的深度信息
在shader中获得当前像素点的深度信息用于判断遮挡关系。如下图所示,这是frag函数中的一段代码,通过内置的_CameraDepthTexture变量可以获取到当前Camera的深度信息,并使用UnityCG中定义的Linear01Depth函数将其转换为线性范围,然后再乘以远剪裁面的值进行放大便于后续使用。最后得到的linearViewDepth就是我们需要的当前像素的深度值。
计算雨水的深度
如下图所示,我们其实在制做贴图的时候通过g分量来表示了雨水的深度,layerDistances.x 和layerDistances.y分别表示雨水的最近和最远距离。所以最后我们可以计算出雨水的深度值layerDistance。
计算雨水明暗度以及处理遮挡
继续看上图中depthscale的计算,当物体的深度(sceneViewDepth)超过了雨水的深度(layerDistance)一定范围后,depthscale为1,显示雨水,反之为0,雨水被遮挡。在明暗变化方面,我们用了贴图的r分量(rainAndDepth.r),实际意义和之前的rainAndDepth.g是一样的。最后我们得到的output.a实际上就是包含了雨水的明暗变化以及遮挡关系。
最后,我们还需要考虑当雨水穿过场景中的体积光时,颜色的变化。这部分的实现在InjectedLight函数中,如下图所示。
首先,我们需要计算在雨水在体积雾中的深度值z。在z的计算公式中,我们看到了_CameraFarOverMaxFar, _NearOverFarClip这个几个变量,它们是在VolumetricFog中设置到shader中的全局变量。我们把z的计算公式稍微化简后得到下面的公式
z = (linear01Depth * Camera.farClipPlane - VolumetricFog.nearClip) /
(VolumetricFog.farClip - VolumetricFog.nearClip)
从化简后的公式中,我们可以看出z最后被转化到在VolumetricFog剪裁空间坐标。有了坐标后,我们就可以通过Tex3D函数取得体积光中的颜色值了。_VolumeScatter也是在VolumetricFog中定义的保存体积光的3D贴图。
通过上面几个步骤,我们大概了解了如何在后处理栈中实现较为真实的下雨效果。我们看到了Unity的后处理栈不光有很多内置的效果,也可以很方便的加入自定义效果。也看到了Unity 提供的开源插件VolumetricLight可以帮助我们实现多种体积光效果。在雨水效果的真实感方面,我们考虑了视角,距离,光感等因素,但其实还可以做更多,比如更多层次感,风力的模拟等等。
资源下载与参考
本文示例项目下载:https://github.com/chengliang-u3d/PPRain
VolumeLightinghttps://github.com/Unity-Technologies/VolumetricLighting
PostProcessinghttps://github.com/Unity-Technologies/PostProcessing/tree/v2
希望通过本文的抛砖引玉,让大家都有兴趣去实现自己的后处理效果。更多精彩案例与教程尽在Unity官方社区(unitychina.cn)!
为期1个半月,由Unity举办的《Neon Challenge》正式开始了。全球2万美元的奖金等待着开发者们,我们后续会详细介绍本次活动。感兴趣的朋友们请访问Unity Connect了解详情。
地址:https://connect.unity.com/challenges/neon
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点}

我要回帖

更多关于 js实现图片3d效果轮播 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信