1.球衰减

首先,我们将处理球衰减,鼠标或手指点中网格的点是碰撞点,越往外它所受的影响越小。我们需要从CPU中获取“_ImpactPos”这个碰撞点,获取摄像机和碰撞点的矢量,我们将对我们网格的每个顶点执行相对于撞击点的球面衰减。

DeformableActor.shader
1
2
3
4
5
6
void vert(inout appdata v) {
    float3 dst = _ImpactPos - v.vertex.xyz;
    dst.x = dot(dst, dst) / _Radius;
    float attenuation = 1 / (1 + dst.x);
        // To Do
}

2.反弹效应

  在CPU里,我们用AnimationCurve手动调好一个正弦曲线,衰减随着时间的推移,以获得预期的效果(见图2.1)。

图2.1.指数阻尼正弦波(也可以自己在代码里写阻尼公式)

public class DeformableActor : MonoBehaviour
{
[SerializeField]
private float maxScale = 3f; [SerializeField]
private float duration = 1f; [SerializeField]
private AnimationCurve curve; private Camera mainCamera; private Material dynamicMat; private bool bIsBouncing; private float timer; private Vector3 direction,
dampingVector; // Use this for initialization
private void Start()
{
mainCamera = Camera.main;
dynamicMat = GetComponent<MeshRenderer>().material;
} // Update is called once per frame
private void Update()
{
if (bIsBouncing)
BounceActor(); if (!Input.GetMouseButton(0))
return; DoRayCasting();
} // ---------------------
private void OnDestroy()
{
Destroy(dynamicMat);
} // -------------------------------------------------------------
private void BounceActor()
{
timer += Time.deltaTime / duration; if (timer <= 1f)
{
dampingVector = curve.Evaluate(timer)
* maxScale * direction; dynamicMat.SetVector("_DampingVector", dampingVector);
}
else
{
bIsBouncing = false;
dynamicMat.SetVector("_DampingVector", Vector3.zero);
}
} // ------------------------------------------------------------------
private void DoRayCasting()
{
RaycastHit hit = new RaycastHit(); if (Physics.Raycast(mainCamera
.ScreenPointToRay(Input.mousePosition), out hit))
{
dynamicMat.SetVector("_ImpactPos",
transform.InverseTransformPoint(hit.point)); direction = (mainCamera.transform.position
- hit.point).normalized;
direction = transform.InverseTransformDirection(direction); bIsBouncing = true;
timer = 0f;
}
}
}

3.关于网格顶点变形的shader

Shader "FI/DeformableActor" {
Properties{
_Radius("Radius", Float) = 1
_Color("Color", Color) = (1,1,1,1)
_MainTex("Albedo (RGB)", 2D) = "white" {}
_Normal("Normal", 2D) = "bump" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200 Cull Off CGPROGRAM #pragma surface surf Standard fullforwardshadows vertex:vert addshadow //在surface shader中想要进行顶点偏移,要加上vertex:vert
#pragma target 3.0 #include "UnityCG.cginc" struct appdata {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
}; sampler2D _MainTex;
sampler2D _Normal; half _Glossiness;
half _Metallic;
fixed4 _Color; float _Radius;
float3 _DampingVector;
float3 _ImpactPos; struct Input {
float2 uv_MainTex;
}; void vert(inout appdata v) {
float3 dst = _ImpactPos - v.vertex.xyz;
dst.x = dot(dst, dst) / _Radius;
float attenuation = 1 / (1 + dst.x); //离hit的点越远的顶点得到的attenuation的值越小,即顶点的晃动就会越小
v.vertex.xyz += _DampingVector * attenuation;
} UNITY_INSTANCING_BUFFER_START(Props) UNITY_INSTANCING_BUFFER_END(Props) void surf (Input IN, inout SurfaceOutputStandard o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Normal = UnpackNormal(tex2D(_Normal, IN.uv_MainTex));
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

类似的例子(心脏的跳动):https://blog.csdn.net/u010133610/article/details/51863887

unity 顶点弹性网格效果的更多相关文章

  1. Unity中实现网格轮廓效果,选中边框效果

    问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...

  2. Unity 实现物体破碎效果(转)

    感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...

  3. css3网格效果(整理)

    css3网格效果(整理) 一.总结 一句话总结: css3网格原理是渐变(linear-gradient)绘制图形,background-size属性指定重复的小单元的大小 多个渐变(linear-g ...

  4. unity 实现物体破碎效果的一些方法 - 细雨淅淅

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  5. unity 实现物体破碎效果的一些方法

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  6. 关于Unity中Mesh网格的详解

    3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面. 点和面以及纹理坐标都是通过3D建模软件建模出来的. Unity会帮我们把模 ...

  7. 关于Unity中蒙皮网格和布料的使用

    所以物体的要绘制出来就必须要有网格组件+材质属性,如果还需要其他特效或丰富内容的话,还可以再加组件. 蒙皮网格和布料 1: 例如要模拟衣服,随风摆动,模拟布料需要用到蒙皮网格和布料;2: 蒙皮网格可以 ...

  8. Unity Shader 之 透明效果

    透明效果 透明效果一般有两种实现方法: 第一种,使用透明度测试(Alpha Test) 第二种,使用透明度混合(Alpha Blending) 透明度测试和透明度混合机制: 透明度测试(Alpha T ...

  9. Unity Shader实现描边效果

    http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...

随机推荐

  1. C# 获取页面get过来的数据

    /// <summary> /// 获取get过来的数据 /// </summary> /// <param name="page"></ ...

  2. 报错 source-1.6 中不支持 diamond运算符

    报错 source-1.6 中不支持 diamond运算符 解决方式 在pom.xml文件中修改 <plugin> <groupId>org.apache.maven.plug ...

  3. CentOS 7 搭建 Ceph 集群(nautilus 版本)

    搭建 Ceph 分布式集群( nautilus 版本 ) 一.服务器环境说明 主机名 角色 IP地址 ceph-admin ceph-deploy 192.168.92.21 ceph-node1 m ...

  4. flask-profiler的使用

    使用 profiler测量在你的Flask 应用程序中定义的端点:并通过web界面提供细粒度的报告. 它给出了这些问题的答案: 应用程序中的瓶颈在哪里? 应用程序中最慢的终结点? 哪些是最常被调用的终 ...

  5. openshift 平台上部署 gitlab代码仓库服务

    背景: 本文档将以在openshift 平台上部署 gitlab 服务来验证集群各个服务组件的可用性以及熟悉openshift的使用方法.服务部署方式可以多种多样,灵活部署.本篇以常见的镜像部署方式来 ...

  6. pytho爬虫使用bs4 解析页面和提取数据

    页面解析和数据提取 关注公众号"轻松学编程"了解更多. 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的 ...

  7. 基于MVC的RESTFul风格API实战

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  8. Exception in MIPS

    介绍 分支.跳转.异常(包括硬件中断)是三种改变控制流的事件. 同步异常是指程序执行到固定位置必定触发且每次现象一致的异常,如算术溢出异常.未定义指令异常.缺页异常等. 异步异常与当前执行程序无关,如 ...

  9. Netty源码解析 -- ChannelOutboundBuffer实现与Flush过程

    前面文章说了,ChannelHandlerContext#write只是将数据缓存到ChannelOutboundBuffer,等到ChannelHandlerContext#flush时,再将Cha ...

  10. Matlab批量绘制图像并保存

    author:ZKe ------------------------------- 以下是一个txt文件,每行11个字段,第一个字段是日期,后面10个是用户id和对应今天发表微博数,所有字段用制表符 ...