Unity3D中MeshRenderer的使用

转载自:http://www.manew.com/forum.php?mod=viewthread&tid=17133

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

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

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

  添加组件的方法有2种:

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

 

  (Ⅱ)通过脚本实现:

[AppleScript]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
10
/ / 添加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;
	private int[] triangles;
	private int count = 0;
	private Mesh mesh;
	private List<Vector3> list;

	void Start()
	{
		gameObject.AddComponent<MeshFilter> ();
		gameObject.AddComponent<MeshRenderer> ();

		list = new List<Vector3> ();
		mesh = GetComponent<MeshFilter> ().mesh;
		GetComponent<MeshRenderer> ().material.color = Color.green;
		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;
		}	
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值