【第008问 Unity中什么是UV?】
视频讲解
Unity中对UV的理解
一、什么是UV
UV是什么?UV其实就纹理坐标轴的另外一种定义;
比如平时我们说的Transform的坐标,就是说该Transform在笛卡尔坐标系中的具体位置,描述该位置的形象表示用(x,y,z);所以平时我们说到物体的坐标的时候,潜意识就会想到(x,y,z);
为什么纹理也会有坐标呢?
比如下面这张图片:
从这张图片我们可以通过查看它的信息,知道这张图片的大小是多少,尺寸是多少,什么时候创建的,但是我们并不会去关心这张图片的坐标,因为这个时候我们并不会用上它的坐标,但是它却是存在的。
当我们把上面这张纹理放置在一个Quad上面的时候的时候,就需要用到纹理的坐标:看下面效果:
上面的是图片上Unity运行的效果,其中有5个大小相等Quad,但是它们使用同一张纹理得到的结果是不一样的;这就是因为每个Quad所获取的纹理的UV坐标范围不一样,导致Quad渲染的结果不一样;
二、实例分析
UV坐标存在的意义就是在于和物体坐标之间的一个映射关系;
比如上图中的纹理大小是512x512,我们不能用512*512这个大小去进行映射,如果我们是映射到同样大小的物体上,它们是1对1的关系,也就是每个物体的坐标点和纹理的UV坐标点是对应上的;否则映射过程上非常麻烦的;
那么什么是物体坐标呢?
看看下面的一个Quad的图片:
上图中物体Pivot和Center都在中心,在线框模式可以看到该物体有4个顶点,2个三角形;要想把一个纹理的全部或者部分完全在这个quad上面正确显示出来,就需要用到uv坐标,需要以下几个步骤:
- 找到该Quad的三角形的渲染方式,是逆时针还是顺时针;会得到正面或者反面的图片
- 找到该Quad的4个UV坐标的先后顺序,也就是确认uv[0]、uv[1]、uv[2]、uv[3]和顶点坐标vertext[0]、vertext[1]、vertext[2]、vertext[3]的对应关系,正确的对应关系才能得到正确的结果;这里你可以用UV坐标的任意合理范围的4个uv坐标点来对应顶点坐标,这样就可以得到纹理中部分或者全部渲染到quad上;
- uv坐标的取值范围都会转换到0-1之间;比如512大小图片范围就会转为:uv(0/512,0/512)-(512/512,512/512)的取值范围,根据图片大小进行转换;
- 最后重新设置对象的UV坐标即可;
UV是纹理坐标的别称,UV坐标就是xy坐标,只是为了便于在描述过程中的区别才有这个说法;所以处理uv坐标就是处理笛卡尔坐标系;可以把一个纹理看作一个笛卡尔坐标系中的第一象限,左下角就是(0,0)坐标,该坐标的第一象限的最大取值范围就是0-1之间;
纹理和对象之间的映射就是纹理坐标和物体坐标之间的映射关系,纹理坐标的正确映射可以得到物体正确的外观效果。
三、源码
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;public class ValakiShowUvPartDemos : MonoBehaviour
{enum ShowUVPartType{None=0,LeftTop,LeftBottom,Center,RightTop,RightBottom};List<Vector2> uvs;Vector2[] backUv;Mesh mesh; [SerializeField] ShowUVPartType showUVPartType;[SerializeField] bool isPlayRandomUvPart;ShowUVPartType currentUvPartType = ShowUVPartType.None;private void Awake(){mesh = GetComponent<MeshFilter>().mesh;uvs = mesh.uv.ToList();backUv = mesh.uv;}float totalTime;private void LateUpdate(){if (isPlayRandomUvPart){totalTime += Time.deltaTime;if(totalTime >= 0.7f){totalTime = 0;int random = Random.Range(1, 6);showUVPartType = (ShowUVPartType)random;}}if (currentUvPartType != showUVPartType){currentUvPartType = showUVPartType;switch (showUVPartType){case ShowUVPartType.Center:mesh.SetUVs(0, backUv);break;case ShowUVPartType.LeftBottom:ShowLeftBottomUvPart();break;case ShowUVPartType.LeftTop:ShowLeftTopUvPart();break;case ShowUVPartType.RightBottom:ShowRightBottomUvPart();break;case ShowUVPartType.RightTop:ShowRightTopUvPart();break;}}}void ShowLeftTopUvPart(){//左-右下-左上-右上uvs[0] = new Vector2(0, 0.75f);uvs[1] = new Vector2(0.25f, 0.75f); uvs[2] = new Vector2(0, 1);uvs[3] = new Vector2(0.25f, 1); mesh.SetUVs(0, uvs);}void ShowRightTopUvPart(){uvs[0] = new Vector2(0.75f, 0.75f);uvs[1] = new Vector2(1, 0.75f);uvs[2] = new Vector2(0.75f, 1);uvs[3] = new Vector2(1, 1);mesh.SetUVs(0, uvs);}void ShowLeftBottomUvPart(){uvs[0] = new Vector2(0, 0);uvs[1] = new Vector2(0.25f, 0);uvs[2] = new Vector2(0, 0.25f);uvs[3] = new Vector2(0.25f, 0.25f);mesh.SetUVs(0, uvs);}void ShowRightBottomUvPart(){uvs[0] = new Vector2(0.75f, 0);uvs[1] = new Vector2(1, 0);uvs[2] = new Vector2(0.75f, 0.25f);uvs[3] = new Vector2(1, 0.25f);mesh.SetUVs(0, uvs);}}
结语:
别问我段位多少,我只是混子而已【valaki】
【第008问 Unity中什么是UV?】相关推荐
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的" ...
- 【Unity】Unity中影响性能的几个因素
影响性能的因素 首先,我们得了解,影响游戏性能的因素哪些,才能对症下药.对于一个游戏来说,有两种主要的计算资源:CPU和GPU.它们会互相合作,来让我们的游戏可以在预期的帧率和分辨率下工作.CPU负责 ...
- Unity 中实现截图画笔橡皮擦工具
Unity 中实现截图画笔橡皮擦工具 好久没写博客了,随着疫情的缓和,工作也忙了起来 ,写博客也成了忙里偷闲的一项娱乐活动了,不以娱乐为目的技术博客写手不是一个好的厨师(我一向自称自己是码农界最帅的厨 ...
- 关于Unity中的资源管理,你可能遇到这些问题(UWA报告)
关键字 AssetBundle 资源制作 纹理\网格\材质\Shader\音频\动画 Lightmap 一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的? ...
- 【Unity技巧】Unity中的优化技术
写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Un ...
- Unity中的优化技术
http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...
- Unity 中的坐标系
参考 1.Shadow Map 原理和改进 2.[OpenGL]02 - OpenGL中的坐标系 3.矩阵理论 (这个是京东地址) 4.维基百科(文中的数学概念出处) 5.msdn mul 6.msd ...
- 关于Unity中的资源管理,你可能遇到这些问题
关键字 AssetBundle 资源制作 纹理\网格\材质\Shader\音频\动画 Lightmap 一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的? ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
一.界面制作 Q1:UGUI里的这个选项 ,应该是ETC2拆分Alpha通道的意思,但是在使用中并没起作用?请问有没有什么拆分的标准和特别要求呢? 据我们所知,alpha split 的功能最初只对 ...
- unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用
制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...
最新文章
- libnids抓不到包
- delphi 纯虚函数的应用
- Python教程:threading中join与setDaemon的用法及区别讲解
- 修改WordPress主题导致整个站点404无法访问
- Eclipse用法和技巧二十三:查看JDK源码
- 定时器Timer的实现
- 在Makefile中创建文件夹指令
- 暑期训练日志----2018.8.13
- 图像傅里叶变换的频率怎么理解?【转载】
- ios设计规范_e微课5期:ios设计规范带来的设计细节(下篇)
- ubuntu下打开matlab_ubuntu下matlab安装,添加中文支持与启动
- CSS Position(定位)
- 多线程: 多线程中断机制
- Nginx出现403 forbidden (13: Permission denied)报错的四种原因
- linux搜索word文档内容,在目录中搜索MS word文件以获取Linux中的特定内容
- 2021-4-28 合抱之木,生于毫末,九层之台,起于垒土
- 「秘」那些管UI小姐姐要来的网站
- 线性代数笔记4.3 齐次线性方程组
- Linux的进程管理之进程与线程—2
- Gartner:2017年存储技术成熟度曲线