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

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

  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    107. Binary Tree Level Order Traversal II
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    104. Maximum Depth of Binary Tree
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    系统和进程相关信息
    文件I/0缓冲
    系统编程概念(文件系统mount等函数的使用)
  • 原文地址:https://www.cnblogs.com/bitzhuwei/p/explain-offset-and-tiling-with-Unity-and-3ds.html
Copyright © 2020-2023  润新知