图文详解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分析来的。
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是怎么回事相关推荐
- 前端中全部盒子靠左对齐_图文详解ul中li内容垂直居中和水平居中的方法
在页面布局时,经常会用到li标签,它可用于列表,导航,选项卡等等,那你知道如何让ul中的li居中吗?这篇文章就和大家讲讲如何让ul中的li水平居中以及如何让li内容垂直居中.感兴趣的朋友继续往下看吧. ...
- php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载
在讲class的初始化 - phpStudy...
图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...
- 图文详解jvm中的线程状态
本文使用下面这张图详细介绍JAVA线程的六种状态 JAVA线程的六种状态详解 在java.lang.Thread类中,定义了线程的以下六种状态(同一个时刻线程只能有一种状态) NEW(新建) 这个状 ...
- 图文详解贷中监控报表与资产质量分析全过程
大家好,我叫roy,现在在某消费金融公司负责报表的开发与分析.我继续整理学习笔记,这一期写的是贷中的核心报表的内容. 我的上一篇:小白学员案例分享|如何分析风控核心报表,指标背后代表怎样的逻辑 贷中监 ...
- mysql join 组合索引,图文详解MySQL中两表关联的连接表如何创建索引
本文介绍了MySQL中两表关联的连接表是如何创建索引的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 问题介绍 创建数据库的索引,可以选择单列索引,也可以选择创建组合索引. 遇到如下这种情况 ...
- html中删除指定数组下标,图文详解JavaScript中删除数组某个元素的方法
在前端开发中经常需要使用JavaScript,那你知道如何用JS删除数值的指定元素吗?这篇文章就给大家分享JS删除数组某个元素的几种方法,感兴趣的朋友可以参考一下,希望可以帮助到你. 方法一:slic ...
- html字符串转成数组,图文详解JavaScript中字符串转换为数组的方法
在前端开发中经常需要使用JavaScript,那你知道怎么将JS字符串转换为数组吗?这篇文章就和大家讲讲JS将字符串转换为数组的方法,感兴趣的朋友可以参考一下,希望可以帮助到你. 之前一篇文章已经给大 ...
- Android中Canvas绘图之Shader使用图文详解
概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什 ...
- 图文详解】Chrome中安装JsonView插件
图文详解]Chrome中安装JsonView插件 Chrome中如何安装JsonView插件?chrome插件网为您图文详解. 1.下载JsonView插件 在github中搜索JsonView,找到 ...
最新文章
- 基于centos4.4的mg手工下载RPM包安装顺序记录
- [转]Android有效解决加载大图片时内存溢出的问题
- Time包详解二-timer和ticket.html
- (仿头条APP项目)2.主界面按钮切换Fragment页面
- python-字典方法
- 复制Linux虚拟机后的网卡问题解决
- 手把手带你基于嵌入式Linux移植samba服务
- 前端跨域,nginx反向代理的解决方案
- 数据结构 3-2-2 队列的顺序存储实现
- livevent的几个问题
- Zabbix触发器和监控项设置时间范围.
- Redis基础知识 之——发布/订阅
- 2019年 AI 顶会速递
- python灰色预测模型步骤人口预测_人口预测模型灰色预测
- 由ContactsProvider的升级引发的OTA首次开机卡白米问题分析
- 推荐电影 历年佳片有约电影 1998-2007
- 快递跟踪地图_基于百度地图的物流跟踪系统设计
- 傅盛:认知升级三部曲(深度好文)
- Stanford Alpaca (羊驼):ChatGPT 学术版开源实现
- 学生个人网页设计作品:基于HTML+CSS+JavaScript实现摄影艺术网站 DIV布局简单的摄影主题网站
热门文章
- uIP TCP Server 运行机制分析
- 在python是什么意思_Python a=b是什么意思?
- 物联网案例(一):将设备数据转换为明智决策
- 互联网公司那些价值观-阿里巴巴
- 用c语言switch写运费的,超级新手,用switch写了个计算器程序,求指导
- Introduce Parameter Object (引入参数对象)
- 自学HTTP RCF体会
- 出入库管理系统-精致版
- c语言求平均值 保留三位小数,Excel求平均值时,保留小数位数与参与求平均值的个数有关...
- java 级联删除_Mybatis 级联删除的实现