图文详解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分析来的。

 1 <_MainChunk Length="8386">
 2   <_CVersion Length="10">3</_CVersion>
 3   <__3DEditorChunk Length="8370">
 4     <_ObjectBlock Length="8364">
 5       <String Length="16">Tank_PlayerMesh</String>
 6       <_TriangularMesh Length="8342">
 7         <_VerticesList Length="3776">
 8           <numVerts Length="2">314</numVerts>
 9           <Vector X="0.7707" Y="52.527" Z="104.4209" Length="12" />
10           <Vector X="6.2672" Y="58.6059" Z="104.4909" Length="12" />
11           …
12           <Vector X="-0.4168" Y="65.2885" Z="104.4949" Length="12" />
13         </_VerticesList>
14         <_MappingCoordinatesList Length="2520">
15           <TexCoordCount Length="2">314</TexCoordCount>
16           <TexCoord u="0.7052" v="0.9314" Length="8" />
17           <TexCoord u="0.7434" v="0.9053" Length="8" />
18           …
19           <TexCoord u="0.7701" v="0.9442" Length="8" />
20         </_MappingCoordinatesList>
21         <_FacesDescription Length="2040">
22           <numIndices Length="2">254</numIndices>
23           <triIndex v1="0" v2="1" v3="2" Length="8" />
24           <triIndex v1="0" v2="2" v3="3" Length="8" />
25           …
26           <triIndex v1="4" v2="5" v3="6" Length="8" />
27         </_FacesDescription>
28       </_TriangularMesh>
29     </_ObjectBlock>
30   </__3DEditorChunk>
31 </_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是怎么回事相关推荐

  1. 前端中全部盒子靠左对齐_图文详解ul中li内容垂直居中和水平居中的方法

    在页面布局时,经常会用到li标签,它可用于列表,导航,选项卡等等,那你知道如何让ul中的li居中吗?这篇文章就和大家讲讲如何让ul中的li水平居中以及如何让li内容垂直居中.感兴趣的朋友继续往下看吧. ...

  2. php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载 在讲class的初始化 - phpStudy...

    图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...

  3. 图文详解jvm中的线程状态

    本文使用下面这张图详细介绍JAVA线程的六种状态 JAVA线程的六种状态详解 在java.lang.Thread类中,定义了线程的以下六种状态(同一个时刻线程只能有一种状态)  NEW(新建) 这个状 ...

  4. 图文详解贷中监控报表与资产质量分析全过程

    大家好,我叫roy,现在在某消费金融公司负责报表的开发与分析.我继续整理学习笔记,这一期写的是贷中的核心报表的内容. 我的上一篇:小白学员案例分享|如何分析风控核心报表,指标背后代表怎样的逻辑 贷中监 ...

  5. mysql join 组合索引,图文详解MySQL中两表关联的连接表如何创建索引

    本文介绍了MySQL中两表关联的连接表是如何创建索引的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 问题介绍 创建数据库的索引,可以选择单列索引,也可以选择创建组合索引. 遇到如下这种情况 ...

  6. html中删除指定数组下标,图文详解JavaScript中删除数组某个元素的方法

    在前端开发中经常需要使用JavaScript,那你知道如何用JS删除数值的指定元素吗?这篇文章就给大家分享JS删除数组某个元素的几种方法,感兴趣的朋友可以参考一下,希望可以帮助到你. 方法一:slic ...

  7. html字符串转成数组,图文详解JavaScript中字符串转换为数组的方法

    在前端开发中经常需要使用JavaScript,那你知道怎么将JS字符串转换为数组吗?这篇文章就和大家讲讲JS将字符串转换为数组的方法,感兴趣的朋友可以参考一下,希望可以帮助到你. 之前一篇文章已经给大 ...

  8. Android中Canvas绘图之Shader使用图文详解

    概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什 ...

  9. 图文详解】Chrome中安装JsonView插件

    图文详解]Chrome中安装JsonView插件 Chrome中如何安装JsonView插件?chrome插件网为您图文详解. 1.下载JsonView插件 在github中搜索JsonView,找到 ...

最新文章

  1. 基于centos4.4的mg手工下载RPM包安装顺序记录
  2. [转]Android有效解决加载大图片时内存溢出的问题
  3. Time包详解二-timer和ticket.html
  4. (仿头条APP项目)2.主界面按钮切换Fragment页面
  5. python-字典方法
  6. 复制Linux虚拟机后的网卡问题解决
  7. 手把手带你基于嵌入式Linux移植samba服务
  8. 前端跨域,nginx反向代理的解决方案
  9. 数据结构 3-2-2 队列的顺序存储实现
  10. livevent的几个问题
  11. Zabbix触发器和监控项设置时间范围.
  12. Redis基础知识 之——发布/订阅
  13. 2019年 AI 顶会速递
  14. python灰色预测模型步骤人口预测_人口预测模型灰色预测
  15. 由ContactsProvider的升级引发的OTA首次开机卡白米问题分析
  16. 推荐电影 历年佳片有约电影 1998-2007
  17. 快递跟踪地图_基于百度地图的物流跟踪系统设计
  18. 傅盛:认知升级三部曲(深度好文)
  19. Stanford Alpaca (羊驼):ChatGPT 学术版开源实现
  20. 学生个人网页设计作品:基于HTML+CSS+JavaScript实现摄影艺术网站 DIV布局简单的摄影主题网站

热门文章

  1. uIP TCP Server 运行机制分析
  2. 在python是什么意思_Python a=b是什么意思?
  3. 物联网案例(一):将设备数据转换为明智决策
  4. 互联网公司那些价值观-阿里巴巴
  5. 用c语言switch写运费的,超级新手,用switch写了个计算器程序,求指导
  6. Introduce Parameter Object (引入参数对象)
  7. 自学HTTP RCF体会
  8. 出入库管理系统-精致版
  9. c语言求平均值 保留三位小数,Excel求平均值时,保留小数位数与参与求平均值的个数有关...
  10. java 级联删除_Mybatis 级联删除的实现