未来的游戏开发程序媛,现在的努力学习菜鸡
本专栏是我关于游戏开发的网格编程方面学习笔记
本篇是unity的网格编程系列01-mesh基础属性
在Unity中,网格编程Mesh是一种用于定义3D对象形状的基本组件。它定义了一个对象的顶点、三角形、法向量和UV贴图坐标等基本属性。
顶点(Vertices):是对象的顶点,为Vector3类型的数组。
注:所有的图形都是点和面(三角形的面)构成的。
三角序列(Triangles):由三个顶点组成的面,也称为“网格面”或“多边形”。是一个int数组,并且个数是三的倍数。
法向量(Normals):法向量在计算光照和投影时至关重要,通常用于计算光照效果。
注:法向量为正方向的面为正面。(为了优化性能,反面不渲染,也就是反面是不可见的)
UV贴图坐标(UV Coordinates):它是网格表面上的纹理坐标,用于将纹理映射到网格表面。每个顶点都有一个对应的UV贴图坐标。
颜色(Colors):它是与网格相对应的颜色数组,用于设置网格的材质颜色和纹理。
切线(Tangents):用于计算网格表面上的光照效果。它们定义了网格表面上的切线方向。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]//自动挂载MeshFilter和MeshRenderer
public class GenerateMesh01 : MonoBehaviour
{
void Start()
{
//初始化
Mesh mesh = new Mesh();
MeshFilter meshfilter = GetComponent<MeshFilter>();
meshfilter.mesh = mesh;
//获取顶点坐标和三角序列
mesh.vertices = GetVertices();
mesh.triangles = GetTriangles();
}
private Vector3[] GetVertices()
{//赋值顶点坐标
return new Vector3[]
{
new Vector3(0,0,0),
new Vector3(1,0,0),
new Vector3(1,1,0),
};
}
private int[] GetTriangles()
{//赋值三角序列
return new int[]
{
0,1,2,
};
}
}
图解:左边是我们原先的三角形,现在只需要在多加一个顶点以及三角序列就可以,根据基础知识,顺时针为正方向,新加的三角序列为0,2,3
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]//自动挂载MeshFilter和MeshRenderer
public class GenerateMesh01 : MonoBehaviour
{
void Start()
{
//初始化
Mesh mesh = new Mesh();
MeshFilter meshfilter = GetComponent<MeshFilter>();
meshfilter.mesh = mesh;
//获取顶点坐标和三角序列
mesh.vertices = GetVertices();
mesh.triangles = GetTriangles();
}
private Vector3[] GetVertices()
{//赋值顶点坐标
return new Vector3[]
{
new Vector3(0,0,0),
new Vector3(1,0,0),
new Vector3(1,1,0),
new Vector3(0,1,0),//添加了顶点
};
}
private int[] GetTriangles()
{//赋值三角序列
return new int[]
{
0,1,2,
0,2,3,//添加了三角序列
};
}
}
知识点:UV坐标和顶点的关系
1.为空物体直接添加一个贴图,不赋值UV,启动后结果是这样的:贴图没有正常显示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]//自动挂载MeshFilter和MeshRenderer
public class GenerateMesh01 : MonoBehaviour
{
void Start()
{
//初始化
Mesh mesh = new Mesh();
MeshFilter meshfilter = GetComponent<MeshFilter>();
meshfilter.mesh = mesh;
//获取顶点坐标和三角序列
mesh.vertices = GetVertices();
mesh.triangles = GetTriangles();
//获取UV坐标
mesh.uv = GetUV();
}
private Vector3[] GetVertices()
{//赋值顶点坐标
return new Vector3[]
{
new Vector3(0,0,0),
new Vector3(1,0,0),
new Vector3(1,1,0),
new Vector3(0,1,0),
};
}
private int[] GetTriangles()
{//赋值三角序列
return new int[]
{
0,1,2,
0,2,3,
};
}
private Vector2[] GetUV()
{//UV
return new Vector2[]
{
new Vector2(1,0),
new Vector2(0,0),
new Vector2(0,1),
new Vector2(1,1),
};
}
}
用法:在脚本前加上[RequireComponent(typeof (X))]
其中X为其它脚本,或者Unity组件
当你挂载这个脚本时,X会和当前脚本一起被挂载上去。
更多内容请前往主页置顶或点击链接直达:【unity3D】游戏开发专栏的目录