视频讲解

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?】相关推荐

  1. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的" ...

  2. 【Unity】Unity中影响性能的几个因素

    影响性能的因素 首先,我们得了解,影响游戏性能的因素哪些,才能对症下药.对于一个游戏来说,有两种主要的计算资源:CPU和GPU.它们会互相合作,来让我们的游戏可以在预期的帧率和分辨率下工作.CPU负责 ...

  3. Unity 中实现截图画笔橡皮擦工具

    Unity 中实现截图画笔橡皮擦工具 好久没写博客了,随着疫情的缓和,工作也忙了起来 ,写博客也成了忙里偷闲的一项娱乐活动了,不以娱乐为目的技术博客写手不是一个好的厨师(我一向自称自己是码农界最帅的厨 ...

  4. 关于Unity中的资源管理,你可能遇到这些问题(UWA报告)

    关键字 AssetBundle 资源制作 纹理\网格\材质\Shader\音频\动画 Lightmap 一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的? ...

  5. 【Unity技巧】Unity中的优化技术

    写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Un ...

  6. Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  7. Unity 中的坐标系

    参考 1.Shadow Map 原理和改进 2.[OpenGL]02 - OpenGL中的坐标系 3.矩阵理论 (这个是京东地址) 4.维基百科(文中的数学概念出处) 5.msdn mul 6.msd ...

  8. 关于Unity中的资源管理,你可能遇到这些问题

    关键字 AssetBundle 资源制作 纹理\网格\材质\Shader\音频\动画 Lightmap 一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的? ...

  9. 关于Unity中的UGUI优化,你可能遇到这些问题

    一.界面制作 Q1:UGUI里的这个选项 ,应该是ETC2拆分Alpha通道的意思,但是在使用中并没起作用?请问有没有什么拆分的标准和特别要求呢? 据我们所知,alpha split 的功能最初只对 ...

  10. unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

最新文章

  1. libnids抓不到包
  2. delphi 纯虚函数的应用
  3. Python教程:threading中join与setDaemon的用法及区别讲解
  4. 修改WordPress主题导致整个站点404无法访问
  5. Eclipse用法和技巧二十三:查看JDK源码
  6. 定时器Timer的实现
  7. 在Makefile中创建文件夹指令
  8. 暑期训练日志----2018.8.13
  9. 图像傅里叶变换的频率怎么理解?【转载】
  10. ios设计规范_e微课5期:ios设计规范带来的设计细节(下篇)
  11. ubuntu下打开matlab_ubuntu下matlab安装,添加中文支持与启动
  12. CSS Position(定位)
  13. 多线程: 多线程中断机制
  14. Nginx出现403 forbidden (13: Permission denied)报错的四种原因
  15. linux搜索word文档内容,在目录中搜索MS word文件以获取Linux中的特定内容
  16. 2021-4-28 合抱之木,生于毫末,九层之台,起于垒土
  17. 「秘」那些管UI小姐姐要来的网站
  18. 线性代数笔记4.3 齐次线性方程组
  19. Linux的进程管理之进程与线程—2
  20. Gartner:2017年存储技术成熟度曲线

热门文章

  1. iPad商标之争对开发者的影响
  2. 苹果可能会失去中国的iPad商标
  3. AutoPatch java_Android热更新九:Robust热更新原理
  4. 为什么我不推荐去SAP培训机构参加培训?
  5. 小白的python学习实录 基础篇(八)面向对象
  6. 为什么很多人交易十几年都做不到稳定盈利呢?
  7. php 图形库 锯齿,PHP imageantialias - 是否使用抗锯齿(antialias)功能 - 有码中国
  8. 通过尾注设置参考文献
  9. Adobe Dreamweaver CS6已停止工作的解决办法
  10. Kubernetes:排错指南 - Pod