前言
今天我们来实现一个我再B站看到的一个使用LeapMotion实现的用手部触摸就可以显示的溶解效果。
效果如下图所示:
主要节点
Position:提供对网格顶点或片段的Position 的访问,具体取决于节点所属图形部分的有效着色器阶段。使用Space下拉参数选择输出值的坐标空间。
Remap:基于输入 In 值在输入In Min Max的 x 和 y 分量之间的线性插值,返回输入Out Min Max的 x 和 y 分量之间的值
SimpleNoise:根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。
OneMinuts:返回输入In减去 1的结果。
原理
首先我们知道Alpha Clip Trreshold可以控制物体的溶解,我们暴露一个属性Vector3,以他作为目标位置,然后我们计算这个目标位置距离沃恩要溶解的模型的顶点坐标的距离,当距离小于一定半径,我们就设置物体显示,否则就消除物体。然后我们可以使用SimpleNoise噪波图对结果进行一个相乘,这样就可以实现一个溶解的效果了。
最终连线
实时控制TargetPos的位置
我们创建一个球体或者一个任意手部模型,然后通过Update实时更新Shader的TargetPos的位置,就可以实现开始B站的LeapMotion视频的效果
using UnityEngine;
[ExecuteInEditMode]
public class ShaderPositionBinder : MonoBehaviour
{
public Transform m_Target;
private Renderer m_Renderer;
private Vector4 m_Value;
private static readonly int Position = Shader.PropertyToID("_Position");
// private static readonly int Radius = Shader.PropertyToID("_Radius");
void Start()
{
m_Renderer = gameObject.GetComponent<Renderer>();
}
void Update()
{
var position = m_Target.position;
m_Value.Set(position.x, position.y, position.z, 1);
m_Renderer.material.SetVector(Position, m_Value);
// m_Renderer.material.SetFloat(Radius, m_Target.localScale.x);
}
}
然后我们把需要操作的球体或者手部模型拖拽到Target的位置,可以可以看到如下效果。