任何一个模型都是由许多网格面组成的,而面又是由许多三角形组成的。
操作环境:Win7操作系统、Unity3D 4.0
创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。
添加组件的方法有2种:
(Ⅰ)选择一个游戏对象,然后执行Component→Mesh→Mesh Filter 和Mesh Renderer。
(Ⅱ)通过脚本实现:
-
//添加MeshFilter
-
gameObject.AddComponent<MeshFilter>();
-
//添加MeshRenderer
-
gameObject.AddComponent<MeshRenderer>();
-
//获得Mesh
-
mesh = GetComponent<MeshFilter>().mesh;
【理论分析】
由于网格面是由三角形组成的,所以我们有必要知道三角的三个顶点的位置。数组mesh.vertices就是用于存储三角形顶点坐标。
当顶点数超过3个的时候,我们连接点的顺序不同,就会绘制出不同形状的图形,所以我们必须要获得我们想要的连接点的顺序。数组mesh.triangles就是用来记录连接三角形的顺序的。由于每绘制一个三角形需要知道其三个顶点的顺序,那么绘制n个三角形就需要知道3*n个点的顺序。即数组mesh.triangles的长度是3的倍数。
如上图,如果我们已知顶点的坐标和顺序如上,怎样绘制出这样的图形?
已知5个点,选择3个点来连接,将其全部连接完有很多种方式,这里我就不计算了~嘻嘻嘻。但是不是每一种方式都能连接成上面的图形的。例如:(0,1,2),(1,2,3),(2,3,4)就无法完成上面的图形。所以我们必须要获得三角形顶点的索引顺序。完成上面图形我采用的顺序:(0,1,2),(0,2,3),(0,3,4)。大家也可以使用其他的顺序。那么我的mesh.triangles=new int[]{0,1,2,0,2,3,0,3,4};而mesh.vertices的值就是点的坐标了。
【案例】拖动鼠标来绘制一个圆弧
-
using UnityEngine;
-
using System.Collections;
-
using System.Collections.Generic;
-
-
public class MeshTest : MonoBehaviour {
-
-
//用于存储绘制三角形的顶点坐标
-
private Vector3[] vertices;
-
//用于记录绘制三角形所需要的顶点ID顺序
-
private int[] triangles;
-
//记录顶点数
-
private int count=0;
-
//定义Mesh
-
private Mesh mesh;
-
//定义一个链表用于记录所有点的坐标
-
private List<Vector3> list;
-
-
void Start () {
-
-
//添加MeshFilter
-
gameObject.AddComponent<MeshFilter>();
-
//添加MeshRenderer
-
gameObject.AddComponent<MeshRenderer>();
-
//new一个链表
-
list = new List<Vector3>();
-
//获得Mesh
-
mesh = GetComponent<MeshFilter>().mesh;
-
//修改Mesh的颜色
-
GetComponent<MeshRenderer>().material.color =Color.green;
-
//选择Mesh中的Shader
-
GetComponent<MeshRenderer>().material.shader = Shader.Find("Transparent/Diffuse");
-
//清空所有点,用于初始化!
-
mesh.Clear();
-
-
-
}
-
-
-
void Update () {
-
-
//点击鼠标左键
-
if (Input.GetMouseButton(0))
-
{
-
//顶点数+1
-
count++;
-
//将获得的鼠标坐标转换为世界坐标,然后添加到list链表中。
-
list.Add(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.8f)));
-
-
}
-
-
//如果顶点数>=3,那么就开始渲染Mesh
-
if (count >= 3)
-
{
-
//根据顶点数来计算绘制出三角形的所以顶点数
-
triangles = new int[3 * (count - 2)];
-
//根据顶点数来创建记录顶点坐标
-
vertices = new Vector3[count];
-
//将链表中的顶点坐标赋值给vertices
-
for (int i = 0; i < count; i++)
-
{
-
vertices[i] = list[i];
-
-
}
-
-
//三角形个数
-
int triangles_count = count - 2;
-
//根据三角形的个数,来计算绘制三角形的顶点顺序(索引)
-
for (int i = 0; i < triangles_count; i++)
-
{
-
//这个算法好好琢磨一下吧~
-
triangles[3 * i] = 0;
-
triangles[3 * i + 1] = i + 2;
-
triangles[3 * i + 2] = i + 1;
-
}
-
//设置顶点坐标
-
mesh.vertices = vertices;
-
//设置顶点索引
-
mesh.triangles = triangles;
-
}
-
-
}
-
}
【效果图】
|