Unity3D的Mesh与MeshFilter的使用
Mesh and MeshFilter
需要修改模型的网格数据,首先第一步是要想办法获得模型的mesh,这里我们需要Mesh Filter,unity文档中的解释如下:
The Mesh Filter takes a mesh from your assets and passes it to the Mesh Renderer for rendering on the screen.
如上图,Robot手里拿的枪的网格数据保存在以gun_model命名的Mesh里,而这个Mesh则隶属于Gun_model的MeshFilter。知道了网格数据保存的位置,接下来需要做的就是获取这些数据并修改它们。下面使用一个简单的cliff模型为例子介绍如何修改模型的网格数据。
Simple Example
首先来看原始的模型长什么样?
现在需要修改模型的网格数据,把模型最高点的高度坐标挑高一倍,代码如下:
- using UnityEngine;
- using System.Collections;
- [RequireComponent(typeof(MeshFilter))]
- public class example : MonoBehaviour {
- void Update() {
- Mesh mesh = GetComponent<MeshFilter>().mesh;
- Vector3 [] vertices = mesh.vertices;
- int p = 0;
- int flag = -1;
- float maxheight = 0.0F;
- while (p < vertices.Length) {
- if(vertices[p].z > maxheight) {
- maxheight = vertices[p].z;
- flag = p;
- }
- p++;
- }
- vertices[flag] += new Vector3(0, 0, maxheight);
- mesh.vertices = vertices;
- mesh.RecalculateNormals();
- }
- }
注意:本例所使用的模型的local坐标系的z轴相当于unity的y轴,因此上述代码时对z轴进行修改。代码运行的结果如下:
是不是很简单!unity强大的接口以及较为详细的文档对开发者来说确实是一个福音,另外使用C#编程对于我这苦逼的不合格C++程序员来说确实很爽!
另外有一点值得注意:上述代码所对应的脚本一定要drag到GameObject里MeshFilter的拥有者,才能使代码生效。如下图5必须要把script拖拽到Cliffs01才能生效,因为在cliffs_1cm的GameObject里只有Cliffs01拥有MeshFilter(如图6)
图 6