Unity网格篇Mesh(二)

news2024/11/19 15:28:07

Unity网格篇Mesh(二)

  • 介绍
  • 4.生成额外的顶点数据
    • 未计算法线
    • 计算法线
    • 没有法线vs有法线
    • 错误的UV坐标Clamping vs warpping
    • 正确的UV纹理,平铺(1,1) vs 平铺(2,1)
    • 凹凸不平的表面,产生了金属材质的效果
    • 一个平面被伪装成凹凸不平的面

介绍

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

4.生成额外的顶点数据

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

未计算法线

在这里插入图片描述

计算法线

在这里插入图片描述

没有法线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;

在这里插入图片描述

错误的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模式,我们可以看到四个方瓷砖网格。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

  • 另外一个表面细节的方法是使用法线贴图。这个贴图使用颜色值记录了法线向量。应用这个纹理到网格上将产生更多的灯光细节效果,它是单独使用顶点法线产生的。
    在这里插入图片描述
    在这里插入图片描述

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

  • 目前应用这个材质球到我们的网格将不会产生任何的凹凸效果。我们需要给我们的网格添加切线向量。
  • 切线的工作原理是什么?
  • 法线贴图在切线空间中定义。这是一个流动在物理表面的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;

在这里插入图片描述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SLAM算法与工程实践——相机篇:RealSense D435使用(1)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

layui(iconPickerFa)图标选择器插件,主要用于后台菜单图标管理

话不多说直接上代码 在页面中引入如下代码 <link rel"stylesheet" href"/template/admin/layui-v2.5.6/css/layui.css"> <script type"text/javascript" src"/template/admin/layui-v2.5.6/layui.js"></script> &…

LSTM的记忆能力实验

长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的特点是引入了一个新的内部状态&#xff08;Internal State) 和门控机制&#xff08;Gating Mechanism&#xff09;&am…

Java 将PDF 转为图片 工具 【Free Spire.PDF for Java】(免费版)

Java 将PDF 转为图片 使用工具&#xff1a;Free Spire.PDF for Java&#xff08;免费版&#xff09; Jar文件获取及导入&#xff1a; 方法1&#xff1a;通过官网下载jar文件包。下载后&#xff0c;解压文件&#xff0c;并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。 方…

C++ 比 C语言 增加的新特性 4 之 内存分配

1. 内存分配 1.1 面试题&#xff1a; C语言里的malloc和free与C里的new和delete有什么区别&#xff1f; C语言&#xff1a; malloc&#xff1a;用于动态内存分配 free&#xff1a;释放动态内存 C&#xff1a; new&#xff1a;用于动态内存的申请 delete&#xff1a;用于释放申请…

python爬虫进阶-每日一学(GIF验证码识别)

目的 学习更多的python反爬虫策略 测试网址 http://credit.customs.gov.cn/ccppserver/verifyCode/creator分析 01 下载gif图片 02 使用ddddocr逐帧识别 03 如指定字符串出现次数大于等于3&#xff0c;则认定为正确的识别结果 经验证&#xff0c;识别成功率95%源码 #!/usr…

如何对Sentinel-2进行 预处理

下载Sentinel-2数据后&#xff0c;可以自动对L1C数据进行预处理&#xff0c;它用于 Sentinel-2 Level 2A 产品生成和格式化的处理&#xff1b;它对大气层 1C 级输入数据进行大气、地形和卷云校正。Sen2Cor 创建大气层底部、可选的地形和卷云校正反射率图像&#xff1b;此外&…

IDEA相关操作

目录 连接MySQL IDEA配置Maven 配置全局Maven 导入Maven项目 方法一 方法二 安装Mybatisx插件 连接MySQL 填写user和Password之后测试连接 如果是第一次连接需要联网下载数据库连接驱动&#xff0c;安装提示下载即可 如果显示如下错误需要更改时区 Server returns …

Es三节点+vip集群搭建部署方案

线上环境Es三节点集群搭建部署方案 1. 目标 Es 集群架构图 ! 2. 搭建步骤 官网教程&#xff1a; https://elasticsearch.bookhub.tech/set_up_elasticsearch/installing_elasticsearch/ 确定 Es 安装目录 机器名内网IPEs 版本重点目录es-node01192.18.233.2407.15.1安装…

在k8s中使用cert-manager部署gitlab集群

写在前面的话&#xff1a;前面有详细的分享过在k8s集群中部署gitlab&#xff0c;不过当时使用gitlab的访问证书是阿里云上免费的ssl证书&#xff0c;今天特意专门介绍下另外一种基于cert-manager发布自签证书的方式实现部署gitlab到k8s集群中。 往期gitlab部署系列如&#xff1…

什么是数据可视化?数据可视化的流程与步骤

前言 数据可视化将大大小小的数据集转化为更容易被人脑理解和处理的视觉效果。可视化在我们的日常生活中非常普遍&#xff0c;但它们通常以众所周知的图表和图形的形式出现。正确的数据可视化以有意义和直观的方式为复杂的数据集提供关键的见解。 数据可视化定义 数据可视化…

扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批

近期&#xff0c;“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”&#xff08;简称“签约仪式”&#xff09;正式举行。合合信息与华为达成鸿蒙合作&#xff0c;旗下扫描全能王将基于HarmonyOS NEXT正式启动鸿蒙原生应用开发。据悉&#xff0c;扫描全能王是鸿蒙在智能扫…

【论文笔记】Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks

论文地址&#xff1a;Run, Dont Walk: Chasing Higher FLOPS for Faster Neural Networks 代码地址&#xff1a;https://github.com/jierunchen/fasternet 该论文主要提出了PConv&#xff0c;通过优化FLOPS提出了快速推理模型FasterNet。 在设计神经网络结构的时候&#xff…

Y9000P + ubuntu22.04 配置Anaconda+pycharm +pytorch

Anaconda3 的安装及使用方法安装 Anaconda3 Anaconda3 是 Anaconda 的具体版本 Anaconda3 中的 Python 解释器默认使用的是 Python3.x 版本&#xff0c;而不是 Python2.x 版本 Python2.x 版本中&#xff0c;字符串是以 ASCII 编码处理的&#xff0c;而在 Python3.x 版本中&am…

基于gradio快速部署自己的深度学习模型(目标检测、图像分类、语义分割模型)

gradio是一款基于python的算法快速部署工具&#xff0c;本博文主要介绍使用gradio部署目标检测、图像分类、语义分割模型的部署。相比于flask&#xff0c;使用gradio不需要自己构造前端代码&#xff0c;只需要将后端接口写好即可。此外&#xff0c;基于gradio实现的项目&#x…

浅谈数据仓库运营

一、背景 企业每天都会产生大量的数据&#xff0c;随着时间增长&#xff0c;数据会呈现几何增长&#xff0c;尤其在系统基建基础好的公司。好的数据仓库需要提前规划和好的运营&#xff0c;才能支持企业的发展&#xff0c;为企业提供数据分析基础。 二、目标 提高数据仓库存储…

排序算法讲解

1&#xff09;排序思想&#xff1a; 2&#xff09;排序代码&#xff1a; 3&#xff09;注意点&#xff1a; 4&#xff09;时间/空间复杂度和稳定性 下面的排序是以实现升序讲解的。 &#xff08;一&#xff09;直接插入排序 1&#xff09;排序思想&#xff1a; 把待排序的…

[Angular] 笔记 10:服务与依赖注入

什么是 Services & Dependency Injection? chatgpt 回答&#xff1a; 在 Angular 中&#xff0c;Services 是用来提供特定功能或执行特定任务的可重用代码块。它们可以用于处理数据、执行 HTTP 请求、管理应用程序状态等。Dependency Injection&#xff08;依赖注入&#…

竞赛保研 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

002、使用 Cargo 创建新项目,打印 Hello World

1. Cargo 简介 Cargo 是 Rust 的构建系统和包管理工具&#xff0c;比如构建代码、下载依赖的库、构建这些库等等。在安装 Rust 时&#xff0c;Cargo也会一起安装。 2. 创建新项目的具体步骤 步骤1&#xff1a; 我们在桌面新建一个文件夹&#xff0c;用于存放后面练习用的代码文…