文章出處

圖文詳解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,就可以做一點有趣的事了。

本文的模型是從坦克艦隊里分析轉化得到的。我將在另一篇文章里說明轉化方法。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()