一、前言

在Unity中通过控制物体的Transform可以很容易的对物体进行旋转、平移和缩放,得到一些简单的动画效果。但是有个不好的地方是,一旦这个物体上有碰撞体的话,会跟环境发生碰撞。我就就想能不能在不麻烦特效动画那边的情况下,自己用Shader去处理一些基于模型顶点或贴图的dong动画效果。如图所示是我完全使用Shader处理处理的顶点的xuan旋转、平移和缩放,另外还有两个是贴图的旋转和平移。Unity的版本为2017.3.1

顶点的移动
顶点的旋转
顶点的缩放
贴图的移动
贴图的旋转

上面五个类型的操作,其中旋转是比较难的,其他的顶点操作都比较简单。

二、实现

1、顶点的移动:在Shader代码里设置三个方向的变量_SpeedX、_SpeedY和_SpeedZ,然后再顶点变换的时候fen分别加上这个变量就可以来对顶点进行位移操作,如果乘以shi'时间就可以得到自动位移的效果了,所以顶点Shader代码为:

v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.vertex += float4(_SpeedX, _SpeedY, 0, _SpeedZ)*_Time.y;o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}

2、贴图的移动:关键是对UV进行操作,关键的片段Shader部分的代码为

         fixed4 frag (v2f i) : SV_Target{// sample the texturefixed2 UV = i.uv;fixed xV = _XSpeed * _Time.x;fixed yV = _YSpeed * _Time.y;UV += fixed2(xV, yV);fixed4 col = tex2D(_MainTex, UV);return col;}

3、顶点的缩放:上面的位移是对顶点ji进行加操作,而缩放是对顶点的值进行乘操作就可以了,关键的顶点Shader部分代码为

         v2f vert (appdata v){v2f o;v.vertex.xz *= clamp((_SinTime.w + 3.0)*0.5, 1.0, 2.0);o.vertex = UnityObjectToClipPos(v.vertex);o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);return o;}

4、顶点的旋转:旋转相比上面的操作会比较难,思路是先计算要旋转的角度,然后得到旋转矩阵,最后直接讲顶点的 位置向量和旋转矩阵相乘得到新的顶点值,关键的计算函数为:

         float4 CalculateRotation(float4 pos){float rotation=_RotationSpeed*_Time.y;float s,c;sincos(radians(rotation), s, c);float2x2 rotMatrix=float2x2(c,-s,s,c);pos.xy=mul(pos.xy,rotMatrix);return pos;}

新的顶点的计算并不是每个方向都计算,我这里只处理了x和z方向的,将新得到的顶点位置赋值给输出顶点的时候要注意原来的z就是新顶点的y顶点Shader的代码为:

     v2f vert (appdata v){v2f o;float4 k=float4(v.vertex.x,v.vertex.z,1.0,1.0);k=CalculateRotation(k);o.vertex = UnityObjectToClipPos(float4(k.x,v.vertex.y,k.y,v.vertex.w));o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}

5、贴图的旋转:这里要用到一个变量“_MainTex_ST”(如果贴图的名称为“_MainTex”),其实只要涉及到对模型贴图的UV进行位移和偏移操作都要用到这个变量,还必须先声明一下,如下所示:它是一个四维向量,其中xy是贴图的Scale,zw是贴图的offset

sampler2D _MainTex;uniform float _RotationSpeed;float4 _MainTex_ST;

先计算当前贴图的缩放比例和偏移相对原点的值div,然后对当前贴图的顶点进行旋转,最后加上div得到正在旋转之后的贴图的值,关键代码如下:

float4 CalculateRotation(float4 pos){//先计算距离位置点距离原点的值float2 div= (_MainTex_ST.xy / 2.0) + _MainTex_ST.zw;float rot = _RotationSpeed * _Time.y;pos.xy -= div;float s, c;sincos(radians(rot), s, c);float2x2 rotMatrix = float2x2(c, -s, s, c);pos.xy = mul(pos.xy, rotMatrix);pos.xy += div;return pos;}v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv.xy = CalculateRotation(v.uv);return o;}

三、总结

1、由物体的transform的旋转、平移和缩放尝试着实现了Shader对模型顶点或贴图的旋转、平移和缩放

2、其实还差一个贴图的缩放,有兴趣的朋友可以自己去实现一下,跟旋转操作的变量是一致的

3、工程下载地址或者可以去我的蛮牛博客Unity&Shader案例篇—旋转、平移和缩放

UnityShader案例篇—旋转、平移和缩放相关推荐

  1. UnityShader案例篇-镜子2

    一.前言 上一篇介绍了有关镜子的制作,有关理论部分的内容我会在后续相关的文章中陆续介绍,莫急,我先趁着自己脑子还是对此技术比较热,趁热打铁尽早把实现部分先写出来.上一章的介绍制作的镜子其实只是一个取巧 ...

  2. UnityShader案例篇—屏幕渐暗效果

    一.前言 本文使用版本为Unity5.3.3,两种实现方法得到的效果是一样的,侧重点不一样,择其良者而用之. 尊重原创,转载请注明出处凯尔八阿哥专栏 二.第一种方案 1.效果图如图所示 2.制作步骤 ...

  3. UnityShader案例篇—角色动态地面印记

    一.介绍 本篇要介绍的效果如图所示:角色在地形上行走,地形上始终会有一个动态圆环跟随角色,类似于阴影的一个效果.但是这个 "阴影"是我们可以自己控制它的效果的,如图2所示是通过修改 ...

  4. UnityShader案例篇—绘制雨滴

    一.前言 转载请注明出处凯尔八阿哥专栏 惯例先上效果图,本文不只是简单的绘制雨滴,同时处理了摄像机不同朝向看到的雨滴下落的方向也不一样. 二.方法 1.绘制雨线:绘制雨使用的是C#脚本绘制的,脚本为: ...

  5. UnityShader案例篇-镜子1

    废话不多说先上效果图,我使用的是在Unity5.3.3版本. 一.原理 1.首先要准备的素材是三个,对没错,就是三个因为镜子里面的那个物体其实是实物的复制体而已:一个Plane作为镜子,还有一个实物和 ...

  6. OSG仿真案例(5)——模型的平移、缩放、旋转

    这个程序显示的是一头牛,牛的身子朝向屏幕. image.png 旋转后,让牛头朝向屏幕外.如下图所示. image.png OSG中通过旋转模型来改变节点的姿态,使用类 MatrixTransform ...

  7. 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接

    CAD+VBA 实现图块的旋转平移缩放和拼接 前言 一.需求 二.实现步骤 1.识别文件中的正确的坐标信息 2.选择图块上的角点,计算正确坐标信息与正确角点坐标之间的平移旋转参数,并进行平移旋转,加入 ...

  8. iOS动画系列之五:基础动画之缩放篇旋转篇Swift+OC

    这一篇主要介绍基础动画之缩放和旋转.这些基本操作分享完之后,我想想可以找个稍微复杂一点点的动画做做啦. 这篇继续基础篇,分享一下缩放和旋转.因为整体思路和平移基本上没有变化,加上源代码里面也有OC版本 ...

  9. android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画

    android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...

最新文章

  1. php无表单上传文件,php – 来自表单的WP邮件附件,无文件管理器上传文件
  2. 【计算机网络】网络层 : ARP 协议 ( 使用 ARP 协议查找 目的主机 / 路由器 物理地址 )★
  3. Python爬虫彩票数据(120期)爬取
  4. 第9步 spring 配置 springmvc配置
  5. 【毕业答辩】毕业设计答辩前期准备
  6. python利用集合的无重复性_利用Python程序完成ABAQUS中的一些重复性操作
  7. 黑马程序员:java基础学习——数组
  8. macbook配置java环境变量_mac上java环境变量配置
  9. 【论文解读】深度学习目标检测 | R-CNN系列里程碑 | 一文弄懂Faster R-CNN
  10. php显示某年某月某日,输入某年某月某日,判断这一天是这一年的第几天?
  11. mysql的yearweek 和 weekofyear函数
  12. 装好android studio 后, 使用安装好的adb 连接 itool 虚拟机 出现的问题
  13. java实现牛牛游戏源代码
  14. 史诗级梦境之二:沙漠大逃亡
  15. elementUI:阻止form的enter(回车键)事件
  16. 【亡羊补牢】计算机网络灵魂之问 第3期 http状态码 302 504分别代表什么意思
  17. 分类招生计算机有哪些专业,计算机有什么专业?【全】_招生问答
  18. tp5使用monolog_使用Monolog记录:从Devtools到Slack
  19. python 执行命令并获取命令行输出_Python实现获取命令行输出结果的方法
  20. A和G cup的差距究竟有多大?| 今日趣图

热门文章

  1. 使用:js 中 url 传参
  2. 使用Ant打包部署STAF插件
  3. 学渣的刷题之旅 leetcode刷题 7.整数反转
  4. 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员考试资料
  5. Database Mirroring
  6. Kubernetes(1)
  7. 微擎添加绑定公众号,空白页或500错误,打不开
  8. Redis中Set数据类型常用命令了解
  9. 【54期】Java序列化三连问,是什么?为什么需要?如何实现?
  10. ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points