Unity网格篇Mesh(二)

这篇具有很好参考价值的文章主要介绍了Unity网格篇Mesh(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

本文接上一遍Unity网格篇Mesh(二)

4.生成额外的顶点数据

  • 我们的网格目前处于一种特殊的情况下。因为我们到目前为止还没有给他们法线向量,默认的法线向量是(0,0,1)(垂直于屏幕向里),而我们需要的正好相反。
  • 法线工作原理是什么呢?
  • 法线是垂直于面的向量。我们通常使用单位长度的法向量,并向量指向面的外部,而不是内部。
  • 法线可以用于确定光线与顶点的夹角。这个细节的使用取决于Shader。
  • 作为三角面它永远是平的,因此它不应该需要被提供一个单独的法线信息。然而,我们需要造假。在现实中,顶点是不存在法线的,三角面才有。通过附加自定义顶点法线和三角面插值,我们可以假装有一个平滑的曲面代替一堆平的三角面。这个错觉是令人信服的,只要你不去注意网格锋利的轮廓(锯齿)。
  • 法线用于规定每个顶点,所以我们必须填充另一个向量数组。另一种选择,我们可以依据网格的三家面来计算出法线。我们可以偷懒,向下面这样做。
private void Generate () 
{
    …
    mesh.triangles = triangles;
    // 网格自动计算法线向量
    mesh.RecalculateNormals();
}
  • 法线是如何重新计算的?
  • Mesh.RecalculateNormals方法利用与顶点相连的三角面计算出每一个顶点的法线。计算平面三角形法线平均值,然后使用normalize方法单位化。

未计算法线

Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎

计算法线

Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎

没有法线vs有法线

  • 接下来是UV坐标。你可能注意到网格目前是颜色统一的,即便是我们给赋值一个带反射贴图的材质球。这很容易理解,因此我们没有自行给它提供UV坐标,它默认为(0,0)。
  • 想要纹理适应我们的网格,简单地划分顶点的位置通过网格的大小。
vertices = new Vector3[(xSize + 1) * (ySize + 1)];
Vector2[] uv = new Vector2[vertices.Length];
for (int i = 0, y = 0; y <= ySize; y++) 
{
    for (int x = 0; x <= xSize; x++, i++) 
    {
        vertices[i] = new Vector3(x, y);
        uv[i] = new Vector2(x / xSize, y / ySize);
    }
}
mesh.vertices = vertices;
mesh.uv = uv;

Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎

错误的UV坐标Clamping vs warpping

纹理现在显示了,但是他并没有覆盖整个网格。它的真实外观取决于纹理模式是Clamp模式或者是Repeat模式。产生这种现象是因为当前我们是通过整数划分的,UV坐标的计算结果是整数。为了得到正确的在0到1之间的坐标,我们必须要使用浮点数。

uv[i] = new Vector2((float)x / xSize, (float)y / ySize);
  • 纹理现在被投影到了整个纹理上。当我设置网格尺寸为(5,10),这个网格纹理将会出现横向拉伸,可以自动反向适应材质的纹理的平铺设置。设置X的坐标为(2,1)将产生双倍。如果把纹理模式设置为Repeat模式,我们可以看到四个方瓷砖网格。

Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎
Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎

Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎
Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎

正确的UV纹理,平铺(1,1) vs 平铺(2,1)

  • 另外一个表面细节的方法是使用法线贴图。这个贴图使用颜色值记录了法线向量。应用这个纹理到网格上将产生更多的灯光细节效果,它是单独使用顶点法线产生的。
    Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎
    Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎

凹凸不平的表面,产生了金属材质的效果

  • 目前应用这个材质球到我们的网格将不会产生任何的凹凸效果。我们需要给我们的网格添加切线向量。
  • 切线的工作原理是什么?
  • 法线贴图在切线空间中定义。这是一个流动在物理表面的3D空间。这个方法使我们能够使用相同的法线贴图在不同的空间和方向。
  • 表面法相用于描述空间中的向上方向。但是那个方向是正确的?它是由切线决定的。理论上,法线和切线的夹角是成90度的。两者的叉积可求出三维空间的第三个方向。但是现实中这个结果并不是90度,但是效果依然是比较满意的。
  • 所以切线是一个三维向量,但是在Unity中它是使用思维向量定义的。第四个值通常是1或者-1,用于控制第三切线空间维度方向朝前或朝后,这有助于展示法线贴图,通常用于左右对称的3D模型,像人一样。Unity的shader执行此计算要求我们使用-1。
  • 当我们有一个平面,所有的切线仅仅指向相同的方向,是正确的的。
vertices = new Vector3[(xSize + 1) * (ySize + 1)];
Vector2[] uv = new Vector2[vertices.Length];
Vector4[] tangents = new Vector4[vertices.Length];
Vector4 tangent = new Vector4(1f, 0f, 0f, -1f);
for (int i = 0, y = 0; y <= ySize; y++)
{
    for (int x = 0; x <= xSize; x++, i++) 
    {
        vertices[i] = new Vector3(x, y);
        uv[i] = new Vector2((float)x / xSize, (float)y / ySize);
        tangents[i] = tangent;
    }
}
mesh.vertices = vertices;
mesh.uv = uv;
mesh.tangents = tangents;

Unity网格篇Mesh(二),Unity,数据结构,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-797878.html

一个平面被伪装成凹凸不平的面

  • 现在你知道如何创建一个简单的网格并使得它在使用材质球的情况下看起来更加复杂。网格需要顶点,三角面,通常还需要UV坐标,经常也需要法线和切线。你也可以添加顶点颜色,尽管Unity标准着色器不使用这个属性。但是你可以自己创建Shader去使用这个颜色属性。

到了这里,关于Unity网格篇Mesh(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】程序创建Mesh(一)Mesh网格、代码创建模型、顶点信息、三角形信息、MeshFilter、MeshRenderer

    Mesh在Unity中是一个核心的组件,被称为网格组件,它主要用于表示3D几何体的数据结构。Mesh由顶点、三角形面以及可选的材质等组成,这些元素共同构建了3D模型的基础。 在Unity中,Mesh的功能非常强大且多样化。它不仅可以用来创建3D模型、绘制几何体、渲染场景,还支持多

    2024年04月15日
    浏览(31)
  • 【Unity】为网格生成顶点法线(Mesh.RecalculateNormals计算异常的解决方案)

    我们通过代码动态创建的网格,因为没有法线,不会接收到光照。 正常情况下调用Mesh.RecalculateNormals方法,重新生成法线即可。 但特定情况下通过此方法计算出的顶点发现都是(0, 0,0),这种情况下只能手动生成法线了 如下图,左边物体有正确的法线,可以接收光照信息,

    2024年02月13日
    浏览(30)
  • 关于unity粒子系统renderer设为mesh(网格)模式后无法旋转的问题

     将其中的render alignment设为local就可以了

    2024年02月12日
    浏览(34)
  • [游戏开发]Unity随机网格中空位置_二叉树

    在做个小游戏,需要随机在网格的空位置上生成方块,在随机的时候,感觉简单随机的方式效率很低而且不稳定。就在想有没有比较快的方式能够随机到想要的位置。最后是用二叉树记录下权重并进行随机,很稳定而且效率还不错。所以写个文章记录一下,以供参考。 在一个

    2024年02月12日
    浏览(36)
  • Tecplot数据结构——结构数据(结构网格)与非结构数据(非结构网格)

    结构数据可以是一维、二维或三维的,下面以二维的数据格式为例。 在记事本中写入以下字符,并将文件以.plt或.dat为后缀命名。 其中数据总数为I*J=20,结构数据顺序为point格式,顺序为:(I,J)=(1,1), (I,J)=(2,1), … (I,J)=(Imax,1), (I,J)=(1,2), (I,J)=(2,2), (I,J)=(Imax,2), … (I,J)=(Imax,Jmax).

    2024年02月15日
    浏览(31)
  • Unity中常用的数据结构

    Unity中常用的数据结构有以下几种: 数组(Array):是一种线性数据结构,可以存储相同类型的多个元素,并通过索引访问和操作。在Unity中,数组是最常用的数据结构之一,用于存储游戏对象、材质、纹理等。 列表(List):也是一种线性数据结构,与数组类似,但具有更灵

    2024年02月04日
    浏览(29)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(48)
  • 23. Unity - 3D游戏开发小计02 --- 动画结束UI、导航网格代理、场景搭建插件(ProGrids,ProBuilder,Polybrush)

    1. 动画结束UI 一个游戏在通过后,都是需要一个界面显示当前游戏已经结束,即需要给游戏添加一个结束的界面,可以做一个简单的游戏结束界面,用一个图片展示: 首先在 层级窗口 添加两层UI中的Image,其中第一层的Image仅作背景,可将其填充颜色设置为纯黑色,第二层的

    2024年02月05日
    浏览(30)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(49)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包