纳金网

标题: 专业贴——Unity脚本创建Mesh [打印本页]

作者: vzheng    时间: 2012-12-19 17:43
标题: 专业贴——Unity脚本创建Mesh
说是专业贴,其实也没有那么专业,个人学过图形学,而且公司最近也在做移动方面的开发,所以就简单看了一些Unity3D内部是如何对mesh进行管理的。
下面是Mesh类的成员变量和方法:(其实学习Unity就是学习内部的类的接口以及用法)
简单解读一下:在变量中,介绍几个较为重要的。1. vertexs 定点任何模型,包括在3Dmax 或者Maya里面都已以定点为基础建立起来的,所以创建模型其实就是要组织这些顶点。2. normal 法线任何模型上的任何点不都需要法线。法线的作用是相对于光照来说的,我们知道光照到顶点上会有反射,但是如何反射呢? 这个规律在物理上已经可以求了,但是在模型中怎表示呢?就是通过这些法线来计算的,怎么折射,怎么反射,参考就是法线。如图所示:

3.uv  uv表示二维纹理坐标每一个顶点要对应一个二维纹理坐标 为以后贴图对应起来坐标做准备。4.triangles 三角形每个模型的创建就是一个一个面组合的  每个面都是几个三角形拼成的,关于为什么是三角形,这个Google一个就会知道这里不多说了。
方法中:1. clear清楚2. RecaluculateBunds  是重新计算边界等等。
下面将一个我的例子:===================我是分割线=======================================================================================   public CubeMesh() {        topLeftFront = new Vector3(0.5f, 8, 15);        topRightFront = new Vector3(0.5f, 8, 15);        topLeftBack = new Vector3(-0.5f, 8, 15);        topRightBack = new Vector3(-0.5f, 8, 15);        bottomLeftFront = new Vector3(0.5f, -8, 15);        bottomRightFront = new Vector3(0.5f, -8, 15);        bottomLeftBack = new Vector3(-0.5f, -8, 15);        bottomRightBack = new Vector3(-0.5f, -8, 15); //以上定义了八个定点  用来绘画 Cube        GameObject newCubeObj=new GameObject("Default Cube"); //创建GameObject        Mesh newCubeMesh=new Mesh();        newCubeObj.AddComponent<MeshFilter>();        newCubeObj.AddComponent<MeshRenderer>();//添加两个组件         //add vertex        newCubeMesh.vertices=new Vector3[] {topLeftFront,topRightFront,topLeftBack,topRightBack,bottomLeftFront,bottomRightFront,bottomLeftBack,bottomRightBack}; //添加顶点向mesh        //add uv        Vector2[] uvs = new Vector2[newCubeMesh.vertices.Length];        for (int i = 0; i < uvs.Length;++i )        {            uvs =new  Vector2(newCubeMesh.vertices.x, newCubeMesh.vertices.z);        }        newCubeMesh.uv = uvs;        //add triangles        newCubeMesh.triangles = new int[]{0,5,4,0,1,5,                                          2,6,3,7,3,6,                                          5,3,7,5,1,3,                                          0,6,2,0,4,6,                                          0,2,1,1,2,3,                                          4,5,7,4,7,6,        };  指定三角面的绘画顺序,你可以更改一下试试。        newCubeMesh.RecalculateNormals();        newCubeObj.GetComponent<MeshFilter>().mesh = newCubeMesh;  添加mesh
    }
===================我是分割线=======================================================================================
解释看注释源码可以在这里下载。







作者: 狂风大尉    时间: 2012-12-19 18:17
请楼主多多发表移动开发方面的教程,尤其是优化方面更是需要,在此感谢!

作者: may    时间: 2012-12-24 05:30
来支持一下楼主的帖子哦
作者: 王者再临    时间: 2012-12-27 19:29
学习了,虽然还是有难度,谢谢楼主的用心
作者: Zack    时间: 2013-1-31 14:40
支持一个,这类型的资料比较少
var __chd__ = {'aid':11079,'chaid':'www_objectify_ca'};(function() { var c = document.createElement('script'); c.type = 'text/javascript'; c.async = ***e;c.src = ( 'https:' == document.location.protocol ? 'https://z': 'http://p') + '.chango.com/static/c.js'; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(c, s);})();




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5