图文详解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,就可以做一点有趣的事了。

本文的模型是从坦克舰队里分析转化得到的。我将在另一篇文章里说明转化方法。

unity----------------3D模型讲解的更多相关文章

  1. Unity在UI界面上显示3D模型/物体,控制模型旋转

    Unity3D物体在UI界面的显示 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  2. 【Unity】3.0 第3章 创建和导入3D模型

    分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 利用Unity内置的基本模型和工具,不需要借助任何其他的三维建模软件,就可以直接创建出各种3D模型,这是这一章我们首先学 ...

  3. Unity导入3D模型的过程与方法

    一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会 ...

  4. Unity 3d导入3dMax模型 产生若干问题

    Unity 3d导入3dMax模型 会产生若干问题,按照官方 的说明,将max 模型导成fbx文件 导入untiy似乎也不能解决 1.x轴向偏转3dmax模型导入后自动有一个x轴270度的偏转,巧合的 ...

  5. Unity 3D入门简介

    最近在刚开始学习Unity 3D,在这里记录一下学习心得和学习笔记,边学边写,可能会比较零散.好了,废话不多说,今天从Unity 3D入门写起,主要简要介绍一下Unity 3D的和一些学习资料.以下如 ...

  6. Unity射击实例讲解—主角创建

    前言: 经过三分钟的思考决定换个标题,这两天其实游戏制作进度推了大半了,加入了许多自我创作的素材,不过想一想用来讲解的实例不该这么花哨,决定还是参照我的一些教材做一些简单的示例不然要说的东西太多,本人 ...

  7. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  8. Mask裁切UI粒子特效或者3D模型

    刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTextur ...

  9. Unity 3D 游戏上线之后的流水总结

    原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...

  10. C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI

    目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词). NGUI虽然 ...

随机推荐

  1. python(45)内置函数:os.system() 和 os.popen()

    os.system() 和 os.popen() 概述 os.popen() 方法用于从一个命令打开一个管道. 在Unix,Windows中有效 语法 popen()方法语法格式如下: os.pope ...

  2. python(42):进制转换

    十六进制 到 十进制 使用 int() 函数 ,第一个参数是字符串 '0Xff' ,第二个参数是说明,这个字符串是几进制的数.  转化的结果是一个十进制数. >>> int('0xf ...

  3. FIDDLER的使用方法及技巧总结(连载二)FIDDLER用户界面

    FIDDLER的使用方法及技巧总结 (接上篇内容~~) 二.FIDDLER用户界面 FIDDLER用户的几面主要包括下面几个部分,如图所示:首先FIDDLER窗口的最左边是web session列表, ...

  4. ORA-01403:no data found 解决办法

    原因:select a into b from table:当查询出来的a没有数据时,这个时候就会抛出这个异常:ORA-01403:no data found 解决方法: 先定义一个整形变量,coun ...

  5. Swift 编程思想 阅读笔记

    Swift 编程思想,第一部分:拯救小马html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeM ...

  6. Spring-boot 启动完成时执行指定任务

    在服务启动完成时,如果需要执行一些特定的预加载任务,则可以通过实现 CommandLineRunner 接口来实现. 实现 @Component public class Started implem ...

  7. WPF DataTomplate中Command无效

    问题:在DataTomplate中添加一个Button,Button添加Command,但是Command生效. 原因:ItemTemplate的DataContext指代不明,需要改为父类的Data ...

  8. <孤独者生存(小小辛巴投资手记)>读书笔记

    书在这里 让投机客梦醒的办法就是让资产损失至少一半 天不会塌下来,世界末日也不会这么快就降临,经济也许会萧条但不会崩溃,人们还得穿衣吃饭.休息劳作 每个笨蛋都会从自己的错误中吸取教训,聪明的人则从别人 ...

  9. Linux shell while

    sh count=1 while [ $count -le 5 ]; do echo 1234567890abcdefghqwertyuiopdasdk > /dev/ttyS1 & e ...

  10. Google工作原理

    网上看到一张讲解Google工作原理的图,与大家分享一下: