1.Mesh概念与组成

Unity中想要显示一个3D模型,必须要知道该模型的形状,这个形状其实就是mesh数据。有了mesh数据后,再通过Mesh Filter组件将mesh数据发送给Mesh Renderer组件进行渲染。Mesh Filter组件不一定每个gameObject对象都有,但是Mesh Rnderer组件是一定有的。我们也可以自定义mesh的数据,然后挂上一个Mesh Renderer组件从而渲染出我们想要的效果。

Mesh概念:Mesh是模型的网格,通过点构成线,再由线构成三角形,最后由三角形构成面,然后通过材质来进行网格表面的表达,如阴影,贴图等。Unity除了ui的mesh,其他都需要MeshFilter来确定网格形状,通过Material以及MeshRenderer来进行网格渲染。

Mesh组成:

1.顶点坐标(vertex):顶点是网格最基础的组成部分,可通过mesh.vertices获取和赋值。
mesh.vertices是一个Vector3的数组,每个Vector3为此顶点与此游戏物体的相对坐标(local position)。
顶点的位置,数量没有任何限制。几个同样的顶点可以组合成若干不同形状,不同数量的三角形。

2.法线(normal):法线就是垂直于面的一条线,它有方向,没有大小。可通过mesh.normals获取和赋值。法线数组存放mesh每个顶点的法线,大小与顶点坐标对应,normal[i]对应顶点vertex[i]的法线。法线向外的面就是正面,相反的就是背面,一般来讲,从正面看才能看到面,背面看面是看不到的。可以通过mesh.RecalculateNormals()来计算。

3.纹理坐标(uv):Unity中想要显示一个3D模式,必须要知道该模式的形状,这个形状其实就是mesh数据。有了mesh数据后,再通过Mesh Filter组件将mesh数据发送给Mesh Renderer组件进行渲染。Mesh Filter组件不一定每个gameObject对象都有,但是Mesh Rnderer组件是一定有的。那么我们就可以自定义mesh的数据,然后挂上一个Mesh Renderer组件从而渲染出我们想要的效果。
uv值用处很多,例如材质texture的采样,或是利用它的一些特性(范围0-1;同一个uv区域每个像素的uv值皆不同)进行GPU内的一些计算。mesh.uv作为一个Vector2数组与mesh.vertices的长度必须一致,每个uv的顺序与vertices的顺序也是一一对应,既uv[0]代表的是vertices[0]的uv值。而与三角形组成的顺序无关。当每个顶点被赋予uv值后,在片段着色阶段,片段着色器将会根据顶点的uv值将此三角形覆盖的每个像素的uv值进行自动插值。uv插值是以三角形为单位进行的,既三角形ABC内各个像素的uv值与其他周边三角形各顶点的uv值是无关的。

4.三角形序列(triangle):triangles是一个int数组,这个数组是包含顶点数组索引的三角形列表。
三角形数组的大小是3的倍数,每三个int代表的是由哪三个顶点并由什么顺序(朝向)来组成一个三角形。
mesh.triangles决定了网格中的三角形的形状和朝向。三角形的渲染顺序与三角形的正面法线呈左手螺旋定则。三角形的三个点顺时针的是朝向我们,逆时针则背对我们。

5.MeshFilter(网格过滤器):MeshFilter含有一个Public成员 Mesh。在Mesh中存储着三维模型的数据(uv,triangle,vertex等)

二.四边形Mesh源码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class QuadMeshTest:MeshTest
{//2 * sizepublic int size = 20;//顶点protected override Vector3[] Vertices{get{Vector3[] vertices = new Vector3[4];vertices[0] = new Vector3(-1, 1, 0) * size;vertices[1] = new Vector3(-1, -1, 0) * size;vertices[2] = new Vector3(1, -1, 0) * size;vertices[3] = new Vector3(1, 1, 0) * size;return vertices;}}//三角形序列protected override int[] Triangles{get{//顺时针面向int[] triangles = new int[6]{1, 0, 3, 3, 2, 1};// //逆时针背对// int[] triangles = new int[6]// {//     1, 2, 3, 3, 0, 1,// };//// //双面网格// int[] triangles = new int[12]// {//     1, 2, 3, 3, 0, 1, 1, 0, 3, 3, 2, 1// };return triangles;}}protected override string MeshName{get{return "QuadMesh";}}//纹理坐标protected override Vector2[] Uvs{get{Vector2[] uvs = new Vector2[4];uvs[0] = new Vector2(0, 1);uvs[1] = new Vector2(0, 0);uvs[2] = new Vector2(1, 0);uvs[3] = new Vector2(1, 1);return uvs;}}//法线protected override Vector3[] Normals{get{mesh.RecalculateNormals();return mesh.normals;}}
}

网格(Mesh)基础相关推荐

  1. [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格

    [Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格 本文并非原创,只是本人的学习记录,原文是由放牛的星星老师翻译Catlike系列教程 链接: https://mp.weixin.qq ...

  2. 【Shader】网格 Mesh

    Mesh 1. 网格 Mesh 2. Mesh的组成 2.1 Vertex Data 2.2 Topology 2.3 Index data 1. 网格 Mesh Mesh指的就是模型的网格,它决定物 ...

  3. Unity Mesh基础知识

    Unity Mesh基础知识 什么是Mesh Mesh的组成部分 利用Mesh创建一个Cube 创建Cube 顶点坐标 渲染 转载链接 什么是Mesh     Mesh是指的模型的网格,3D模型是由多 ...

  4. 【MATLAB】三维图形绘制 ( 三维平面图 | 二维网格 | meshgrid 函数 | 绘制网格 | mesh 函授 | 绘制平面 | surf 函数 | 绘制等高线 | contour 函数 )

    文章目录 一.二维网格 1.线图 与 平面图 2.meshgrid 函数生成二维网格 二.绘制网格 1.mesh 函数绘制网格 2.代码示例 三.绘制平面 1.surf 函数绘制平面 2.代码示例 四 ...

  5. oracle 12c dg新特性,oracle 12c:新特性-网格(Grid)基础架构的增强

    oracle 12c:新特性-网格(Grid)基础架构的增强,传统标准集群和Flex集群. Flex 集群 Oracle 12c 在集群安装时支持两类配置:传统标准集群和Flex集群.在一个传统标准集 ...

  6. OpenGL 网格Mesh

    OpenGL 网格Mesh 网格Mesh简介 初始化 渲染 网格Mesh简介 通过使用Assimp,我们可以加载不同的模型到程序中,但是载入后它们都被储存为Assimp的数据结构.我们最终仍要将这些数 ...

  7. 万丈高楼平地起 ——浅谈网格计算基础

    万丈高楼平地起 --浅谈网格计算基础 网格技术的产生.发展必须具备以下三个基本条件:计算资源的广域分布.网络技术(特别是Internet)以及不断增长的对资源共享的需求.在计算器技术发展的早期阶段,只 ...

  8. D3D中的网格(Mesh)

    该教程基于DirectX 8.0 Graphics, 一部分内容由DirectX 8.0 SDK 英文文档翻译而来,一部分是自己工作经验的总结,作者对此享有著作权,读者可任意拷贝和传播,但不包含商业的 ...

  9. opengl网格mesh

    和材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中.Scene对象也包含了场景根节点的引用. 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列 ...

  10. 自己动手实现蓝牙MESH应用系列 | 第一篇:蓝牙MESH基础概念介绍

    文章目录 1. 前言 2. 概述 2.1. 蓝牙风格(Flavors) 2.2. mesh网络的动机 2.3. mesh网络中的消息传输方式 2.3.1. 以消息为中心的通信 - 发布/订阅(publ ...

最新文章

  1. vue webpack打包入口文件是哪个_Vue项目起步
  2. python nltk lemmatizer_Python聊天机器人–使用NLTK和Keras构建第一个聊天机器人
  3. python正则r的作用_Python正则表达式,这一篇就够了!
  4. matlab1 3倍频程,瞬时声压时域数据怎么用matlab进行1/3倍频程声压级分析
  5. VS2012快捷键突然不能用怎么办
  6. Linux命令su、sudo、sudo su、sudo -i使用和区别
  7. 10个有关RESTful API良好设计的最佳实践
  8. 深度学习|三维重建:R-MVSNet
  9. Hadoop中MR程序的几种提交运行模式
  10. 清华大学计算机系网络课程,资源分享:清华大学计算机系网络课程.pdf
  11. yaml 变量引用_Yaml语法使用
  12. 放大器的频率特性(2)-- 共源极的频率特性
  13. 网络私有云存储的几点优势
  14. MATLAB图像处理_YUV格式详解
  15. 【广告算法工程师入门 32】从直播答题,跳一跳,抢红包等产品策略扯到用户受益商业变现
  16. 第八章 界面外观——Qt
  17. 在Ubuntu中配置中文输入法
  18. 《算法导论》第六章之堆和优先级队列相关算法C语言实现
  19. Python 办公小助手:读取 PDF 中表格并重命名
  20. Iocomp Components Full Sources Product

热门文章

  1. 图的四色着色(C语言)
  2. MVC 过滤器使用 ActionFilterAttribute
  3. 杰奇CMS phpmyadmin清空数据库ID归零重新入库数据SQL语句教程
  4. Istio 流量治理
  5. 惯性导航和惯性器件(一)
  6. 使用Emulator时的坏习惯
  7. 深度学习图像超分辨率开山之作SRCNN——原理分析及代码(效果基本可以达到论文中的效果)
  8. 【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)
  9. IDA中点击apply patches to 显示 patching canceled..导致无法使用
  10. android 最新微信支付,android最新微信支付总结