分享

<Unity3D>Unity3D中MeshRenderer的使用

 雪柳花明 2016-04-19

任何一个模型都是由许多网格面组成的,而面又是由许多三角形组成的。

操作环境:Win7操作系统、Unity3D 4.0

创建网格面的核心就是为其添加2个组件:Mesh Renderer(网格渲染器)和Mesh Filter(网格过滤器)。

添加组件的方法有2种:

(Ⅰ)选择一个游戏对象,然后执行Component→Mesh→Mesh Filter 和Mesh Renderer。

 

(Ⅱ)通过脚本实现:

[csharp] view plaincopy
  1. //添加MeshFilter  
  2. gameObject.AddComponent<MeshFilter>();  
  3. //添加MeshRenderer  
  4. gameObject.AddComponent<MeshRenderer>();  
  5. //获得Mesh  
  6. 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的值就是点的坐标了。

 

 【案例】拖动鼠标来绘制一个圆弧

[csharp] view plaincopy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. public class MeshTest : MonoBehaviour {  
  6.   
  7.     //用于存储绘制三角形的顶点坐标  
  8.     private Vector3[] vertices;  
  9.     //用于记录绘制三角形所需要的顶点ID顺序  
  10.     private int[] triangles;  
  11.     //记录顶点数  
  12.     private int count=0;  
  13.     //定义Mesh  
  14.     private Mesh mesh;  
  15.     //定义一个链表用于记录所有点的坐标  
  16.     private List<Vector3> list;  
  17.   
  18.     void Start () {  
  19.   
  20.         //添加MeshFilter  
  21.         gameObject.AddComponent<MeshFilter>();  
  22.         //添加MeshRenderer  
  23.         gameObject.AddComponent<MeshRenderer>();  
  24.         //new一个链表  
  25.         list = new List<Vector3>();  
  26.         //获得Mesh  
  27.         mesh = GetComponent<MeshFilter>().mesh;  
  28.         //修改Mesh的颜色  
  29.         GetComponent<MeshRenderer>().material.color =Color.green;  
  30.         //选择Mesh中的Shader  
  31.         GetComponent<MeshRenderer>().material.shader = Shader.Find("Transparent/Diffuse");  
  32.         //清空所有点,用于初始化!  
  33.         mesh.Clear();         
  34.           
  35.       
  36.     }  
  37.       
  38.       
  39.     void Update () {  
  40.   
  41.         //点击鼠标左键  
  42.         if (Input.GetMouseButton(0))  
  43.         {      
  44.             //顶点数+1  
  45.             count++;  
  46.             //将获得的鼠标坐标转换为世界坐标,然后添加到list链表中。  
  47.             list.Add(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.8f)));  
  48.               
  49.         }  
  50.   
  51.         //如果顶点数>=3,那么就开始渲染Mesh  
  52.         if (count >= 3)  
  53.         {  
  54.             //根据顶点数来计算绘制出三角形的所以顶点数  
  55.             triangles = new int[3 * (count - 2)];  
  56.             //根据顶点数来创建记录顶点坐标  
  57.             vertices = new Vector3[count];  
  58.             //将链表中的顶点坐标赋值给vertices  
  59.             for (int i = 0; i < count; i++)  
  60.             {  
  61.                 vertices[i] = list[i];  
  62.   
  63.             }  
  64.   
  65.             //三角形个数  
  66.             int triangles_count = count - 2;  
  67.             //根据三角形的个数,来计算绘制三角形的顶点顺序(索引)  
  68.             for (int i = 0; i < triangles_count; i++)  
  69.             {  
  70.                 //这个算法好好琢磨一下吧~  
  71.                 triangles[3 * i] = 0;  
  72.                 triangles[3 * i + 1] = i + 2;  
  73.                 triangles[3 * i + 2] = i + 1;  
  74.             }  
  75.             //设置顶点坐标  
  76.             mesh.vertices = vertices;  
  77.             //设置顶点索引  
  78.             mesh.triangles = triangles;  
  79.         }  
  80.       
  81.     }  
  82. }  

【效果图】

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多