网格(Mesh)基础
Posted 热心市民亮仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网格(Mesh)基础相关的知识,希望对你有一定的参考价值。
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 * size public 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;
MATLAB绘图—三维网格绘图(mesh)
MATLAB绘图—三维网格绘图(mesh)
MATLAB基础代码/优化技术探讨:WX: ZB823618313
原创不易,路过的各位大佬请点个赞
《MATLAB绘图—三维绘图-I》博客主要讲了三维曲线图的绘制,本博客主要讲
三维网格图
三维曲线绘图
三维曲面图
https://blog.csdn.net/weixin_44044161/article/details/116741630
柱面和球面图
三维图形等值线
https://blog.csdn.net/weixin_44044161/article/details/116742144
一、三维网格图
1、mesh命令
该命令生成X Y Z 指定的网线面,使用格式见下面:
首先介绍meshgrid函数的用途和语法:
close all
x=-4:0.25:4;
y=x;
[X,Y]=meshgrid(x,y);
Z=-X.^4+Y.^5;
mesh(Z)
title('网格面')
xlabel('x'),ylabel('y'),zlabel('z')
close all
t=-4:0.1:4;
[X,Y]=meshgrid(t);
Z=peaks(X,Y);
mesh(X,Y,Z)
title('显示网格')
2、meshc和meshz命令
meshc:加等高线
meshz:曲面图与零平面的网格图
close all
t=-4:0.1:4;
[X,Y]=meshgrid(t);
Z=peaks(X,Y);hidden off
subplot(1,2,1)
meshc(X,Y,Z)
title('meshc')
subplot(1,2,2)
meshz(X,Y,Z)
title('meshz')
3、ezmesh命令
该命令是专门用来绘制符号函数 f ( x , y ) f(x,y) f(x,y)的网格图,语法如下
close all
syms x y
f=sin(x)*exp(y)-cos(y)*exp(x)+ exp(x)+ exp(y);
ezmesh(f,[-pi,pi],30)
title('带网格线的三维表面图')
以上是关于网格(Mesh)基础的主要内容,如果未能解决你的问题,请参考以下文章
[Unity 学习] - 进阶篇 - Mesh基础系列1:生成网格
Unity3D网格 Mesh ( 网格概念 | 网格示例 | Unity 中 3D 物体渲染模式 | 着色模式 | 线框模式 | 线框着色模式 )