图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事
Tiling和Offset概述
Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置。
这样说当然是隔靴搔痒。
下面用*.3ds文件作为模型,介绍Tiling和Offset到底是怎么回事。
3DS格式解析
比如我有这样一个tank_player.3ds模型。右侧的'select'处的图片就是贴图。

*.3ds文件最基本的内容包括顶点列表Vertices、贴图坐标列表UVs、面列表Faces。其中Vertices和UVs的数目相等。下面就是用文本描述的tank_player.3ds文件的内容,这是一个树结构,用先序遍历即可将其改写为二进制的3ds文件。这个XML结构就是从二进制的tank_player.3ds分析来的。
<_MainChunk Length="8386">
<_CVersion Length="10">3</_CVersion>
<__3DEditorChunk Length="8370">
<_ObjectBlock Length="8364">
<String Length="16">Tank_PlayerMesh</String>
<_TriangularMesh Length="8342">
<_VerticesList Length="3776">
<numVerts Length="2">314</numVerts>
<Vector X="0.7707" Y="52.527" Z="104.4209" Length="12" />
<Vector X="6.2672" Y="58.6059" Z="104.4909" Length="12" />
…
<Vector X="-0.4168" Y="65.2885" Z="104.4949" Length="12" />
</_VerticesList>
<_MappingCoordinatesList Length="2520">
<TexCoordCount Length="2">314</TexCoordCount>
<TexCoord u="0.7052" v="0.9314" Length="8" />
<TexCoord u="0.7434" v="0.9053" Length="8" />
…
<TexCoord u="0.7701" v="0.9442" Length="8" />
</_MappingCoordinatesList>
<_FacesDescription Length="2040">
<numIndices Length="2">254</numIndices>
<triIndex v1="0" v2="1" v3="2" Length="8" />
<triIndex v1="0" v2="2" v3="3" Length="8" />
…
<triIndex v1="4" v2="5" v3="6" Length="8" />
</_FacesDescription>
</_TriangularMesh>
</_ObjectBlock>
</__3DEditorChunk>
</_MainChunk>
这里面的_VerticesList 是顶点坐标列表,每个Vector都是3D模型中的一个顶点;_MappingCoordinatesList是贴图坐标列表UVs,每个TexCoord都是在贴图上的一个坐标点。FacesDescription则是面列表,由于Vertices和UVs的数目相等,每个triIndex都用索引指定了3个vertex和3个UV。3个vertex就在3D世界画了一个三角形,这些三角形就组成了上图所示的坦克模型。3个UV则在贴图上画了一个三角形。贴图是这样的:

而UVs在贴图上画出的三角形则如下图所示。

可以看到是完全对应的。一个triIndex指定了3D模型的一个三角形平面A,也指定了贴图上的一个三角形平面B,把B贴到A上,就是我们看到的3D模型了。
这么半天都在讲解3DS文件格式,是为了方便下面开始说明Tiling和Offset的用法。
Offset是什么意思
为了简单,我们看下面这个模型。它就是4个三角形拼接成的一个正方形。

此模型的UVs画出来是这样的:

此模型的贴图如下。

Offset这个概念就从这个贴图上开始说。
如下图所示,贴图左下角为原点(0, 0),右上角为(1, 1),画直角坐标系,横轴为X方向的Offset,纵轴为Y方向的Offset。

Offset的作用,就是决定UVs在贴图上的起始位置。
下图所示,是Offset在X和Y轴都为0时的样子。UVs坐标框住了贴图下半块左边的那一部分,那么这部分贴图就会被贴在模型上。


所以你会看到这样的结果。

现在我把Y轴的Offset设置为0.5。意思是UVs的左下角变成了(0, 0.5)。

那么UVs在贴图上的贴合情形就如下图所示了,此时UVs框住了贴图上半边左侧的那块(红色的半圆)。

可以想象现在的模型是什么样子了吧?

Tiling是什么意思
说完Offset,Tiling就好理解了。Offset控制了UVs的起始位置,Tiling则控制了UVs的缩放比例。默认(1, 1)的缩放比例就是原始比例。现在我把Y轴的Tiling改为2。

那么UVs与贴图的贴合情况就成了这样:

贴图还是那个贴图,UVs的纵坐标则都乘以2了。所以最后的模型就会是这样:

总结
Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置。
综合利用Offset和Tiling,就可以做一点有趣的事了。
本文的模型是从坦克舰队里分析转化得到的。我将在另一篇文章里说明转化方法。
图文详解Unity3D中Material的Tiling和Offset是怎么回事的更多相关文章
- 【Unity3D基础教程】给初学者看的Unity教程(五):详解Unity3D中的协程(Coroutine)
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 为什么需要协程 在游戏中有许多过程(Proc ...
- (转)图文详解MyEclipse中新建Maven webapp项目的步骤
转:https://blog.csdn.net/ClementAD/article/details/46592557 MyEclipse中创建新的Maven项目(webapp目录结构)过程如下: ...
- 批处理中的echo命令图文详解
批处理中的echo命令图文详解 1. Echo 显示当前ECHO的状态:ECHO ON 或者ECHO OFF 2. ECHO ON 将ECHO状态设置为ON,将显示命令行,也就是前面的C:\>类 ...
- SpringBoot中使用UEditor基本配置(图文详解)
SpringBoot中使用UEditor基本配置(图文详解) 2018年03月12日 10:52:32 BigPotR 阅读数:4497 最近因工作需要,在自己研究百度的富文本编辑器UEditor ...
- windows系统里Cygwin中如何正确安装wget(图文详解)
具体步骤,见如下: https://ftp.gnu.org/gnu/wget/ 解压到Cygwin的主目录中,一般是 你的Cygwin目录/home/当前用户名/ . 我这是如下 先./c ...
- 如何在Eclipse或者Myeclipse中使用tomcat(配置tomcat,发布web项目)?(图文详解)(很实用)
前期博客 Eclipse里的Java EE视图在哪里?MyEclipse里的Java EE视图在哪里?MyEclipse里的MyEclipse Java Enterprise视图在哪里?(图文详解) ...
- Flume中的flume-env.sh和log4j.properties配置调整建议(图文详解)
GC是内存的回收的意思. Flume中的flume-env.sh配置调整建议 [hadoop@master conf_HostInterceptor]$ pwd /home/hadoop/app/fl ...
- STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...
- CentOS 6.3下Samba服务器的安装与配置方法(图文详解)
这篇文章主要介绍了CentOS 6.3下Samba服务器的安装与配置方法(图文详解),需要的朋友可以参考下 一.简介 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件, ...
随机推荐
- 第三章 Docker 入门
第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...
- block的解析
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- UVA11149_Power of Matrix
题目简洁明了,给出矩阵,求前k次方和. 不知道这种方法是叫做二分幂还是倍增法,如果有知道的,请告诉我一下. 具体思想是这样的,A^1+A^2+A^3+......A^n=(E+A^(n/2))*(A^ ...
- Python 第三天 文件操作(2)
文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和 fi ...
- Javascript日期比较
var date1=Date.parse("2014-9-3 11:40:14".replace(/-/g,"/")); var date2=Date.pars ...
- 通过Guid获取DirectoryEntry对象
绑定DirectoryEntry对象通常有两种方法,一种是通过字符串(如通过ADsPath),一种是通过Guid(参见:http://msdn.microsoft.com/zh-cn/library/ ...
- Taylor定理证明
下图,单独打开查看 当n->inf时如果 Rn(c)趋0, c属于(a,x), 那么在区间(a,x) 内函数在a点生成的taylor级数收敛到函数f.
- Android本地数据存储复习
Android本地数据存储复习 Android无论是应用层还是系统层都需要在本地保存一些数据,尤其在应用层中使用的就更为普遍,大体有这么几种:SharedPreference,file,sqlite数 ...
- protobuf坑1
或者说特性吧,没仔细看protobuf代码,也许我还理解不够. 按照陈硕大牛的这篇帖子的介绍,“它包含了程序编译的时候所链接的全部 protobuf Message types” 实际开发过程中发现必 ...
- 03、AngularJs的模块与控制器
大部分的应用程序都有一个主方法(main)来组织,实例化,启动应用程序.而AngularJs应用是没有主方法的,它是通过模块来声明应用应该如何启动的.同时,模块允许声明来描述应用中依赖关系,以及如何进 ...