Unity3D之Mesh(七)绘制长方体
前言:
从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体。
一、基本思路
由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:vertices与索引的三角形(即负责管理每个三角形的三点的索引顺序):triangles。长方体:一般会得知:长宽高;即今天我们由长宽高为参数得到vertices与triangles。
二、基本程序框架
创建一个empty的gameobject,挂在脚本。
由基本思路可得基本框架,之后,实现函数功能即可;
using UnityEngine; [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class cube_mesh : MonoBehaviour
{
public float Length = ; //长方体的长
public float Width = ; //长方体的宽
public float Heigth = ; //长方体的高
private MeshFilter meshFilter; void Start()
{
meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = CreateMesh(Length, Width, Heigth);
} Mesh CreateMesh(float length, float width, float heigth)
{
//vertices(顶点、必须):
//......... //triangles(索引三角形、必须):
//......... //uv:
//......... //负载属性与mesh
Mesh mesh = new Mesh();
//.........
return mesh;
}
}

三、绘制函数的实现以及整个程序代码
using UnityEngine; [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class cube_mesh : MonoBehaviour
{
public float Length = ; //长方体的长
public float Width = ; //长方体的宽
public float Heigth = ; //长方体的高
private MeshFilter meshFilter; void Start()
{
meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = CreateMesh(Length, Width, Heigth);
} Mesh CreateMesh(float length, float width, float heigth)
{ //vertices(顶点、必须):
int vertices_count = *; //顶点数(每个面4个点,六个面)
Vector3[] vertices = new Vector3[vertices_count];
vertices[] = new Vector3(, , ); //前面的左下角的点
vertices[] = new Vector3(, heigth, ); //前面的左上角的点
vertices[] = new Vector3(length, , ); //前面的右下角的点
vertices[] = new Vector3(length, heigth, ); //前面的右上角的点 vertices[] = new Vector3(length, , width); //后面的右下角的点
vertices[] = new Vector3(length, heigth, width); //后面的右上角的点
vertices[] = new Vector3(, , width); //后面的左下角的点
vertices[] = new Vector3(, heigth, width); //后面的左上角的点 vertices[] = vertices[]; //左
vertices[] = vertices[];
vertices[] = vertices[];
vertices[] = vertices[]; vertices[] = vertices[]; //右
vertices[] = vertices[];
vertices[] = vertices[];
vertices[] = vertices[]; vertices[] = vertices[]; //上
vertices[] = vertices[];
vertices[] = vertices[];
vertices[] = vertices[]; vertices[] = vertices[]; //下
vertices[] = vertices[];
vertices[] = vertices[];
vertices[] = vertices[]; //triangles(索引三角形、必须):
int 分割三角形数 = * ;
int triangles_cout = 分割三角形数 * ; //索引三角形的索引点个数
int[] triangles = new int [triangles_cout]; //索引三角形数组
for(int i=,vi=;i< triangles_cout;i+=,vi+=)
{
triangles[i] = vi;
triangles[i+] = vi+;
triangles[i+] = vi+; triangles[i+] = vi+;
triangles[i+] = vi+;
triangles[i+] = vi+; } //uv:
//......... //负载属性与mesh
Mesh mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
return mesh;
}
}
四、效果图

五、其他相关的说明
1、冗余的顶点坐标
正方体6个面,每个面由2个三角形组成,所以共需要36个三角形顶点索引。但是正方体只有8个顶点,为什么需要24个顶点坐标数据呢?
答案是:Unity3D的Mesh.triangles是三角形索引数组,不仅依靠这个索引值索引三角形顶点坐标,而且索引纹理坐标,索引法线向量。即正方体的每个顶点都参与了3个平面,而这3个平面的法线向量是不同的,该顶点在渲染这3个平面的时候需要索引到不同的法线向量。而由于顶点坐标和法线向量是由同一个索引值triangles[Index]取得的,例如,根据vertices[0],vertices[10],vertices[22]在vertices中索引到的顶点都为(0,0,0),但是在normals中索引到的法向量值各不相同。这就决定了在正方体中一个顶点,需要有3份存储。(如果你需要创建其它模型,需要根据实际情况决定顶点坐标的冗余度。实质上顶点坐标的冗余正是方便了法线坐标、纹理坐标的存取。)
2、三角形的渲染
准则:三角形有两面,正面可见,背面不可见。三角形的渲染顺序与三角形的正面法线呈左手螺旋定则。
这就决定了,如果我们需要渲染如下一个正方形面,那么就需要保证组成这个正方形的两个小三角形的正面法线都是指向屏幕外的。

程序中的顶点顺序为,三角形1: 0--->1--->2,三角形2:3--->2--->1 。
【欢迎转载】
转载请表明出处: 乐学习
Unity3D之Mesh(七)绘制长方体的更多相关文章
- Unity3D之Mesh(五)绘制圆
前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径 以及分割数: 一.实现过程 基本过程与之前的类似,最 ...
- Unity3D之Mesh(一)绘制三角形
前言: Unity自带几种简单的模型,如cube等:一般情况下,其余模型有3D建模软件生成,以合适的文件格式导入unity中:而mesh(以我目前很粗浅的了解)的一般用途就是:对现有的模型进行变形,以 ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- Istio Ambient Mesh七层服务治理图文详解
摘要:本文主要集中剖析Ambient mesh七层服务治理相关内容. 本文分享自华为云社区<Istio Ambient Mesh七层服务治理图文详解>,作者:华为云云原生团队. 由于Amb ...
- Unity3D之Mesh(四)绘制多边形
来自https://www.cnblogs.com/JLZT1223/p/6086191.html 1. 总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思 ...
- Unity3D之Mesh(六)绘制扇形、扇面、环形
前言: 绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法. 一.分析: 首先,结合绘制圆的过程绘制环形: 圆形是由segments个等腰三角形组成的(上一篇中, ...
- Unity3D之Mesh(三)绘制四边形
前言: 由於之前的基本介紹,所以有關的知識點不做贅述,只上案例,知識作爲自己做試驗的記錄,便於日後查看. 步驟: 1.創建一個empty 的gameobject: 2.添加一個脚本給這個game ob ...
- Unity3D学习笔记1——绘制一个三角形
目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...
- Unity3D之Mesh【创建动态Mesh的学习网站】
觉得不错!做记录! 1.http://gamerboom.com/archives/76484 2.http://jayelinda.com/ 3.几个私人的博客,可能有启发:http://blog. ...
随机推荐
- 4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(
新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...
- centos7.2 开发 部署 .net core
1.centos7.2 安装 nginx官方文档:http://nginx.org/en/linux_packages.html#mainline 创建nginx.repo 文件 Pre-Built ...
- 【ubantu】在Ubuntu上安装tar.gz,tar.bz以及deb文件(例:libreoffice安装)
参考文章: https://blog.csdn.net/zhuquan945/article/details/52986712 ==================================== ...
- php配置opcache
官网地址:http://php.net/opcache 使用下列推荐设置来获得较好的 性能: opcache.memory_consumption=128 opcache.interned_strin ...
- Visual Studion 2013 HTML 如何打开设计图
Visual Studion 2013 HTML 没有设计视图? 在解决方案中对要打开的HTML文件 右键-->打开方式-->HTML(Web窗体)编辑器 原地址>>:http ...
- MySQL 下 ROW_NUMBER / DENSE_RANK / RANK 的实现
原文链接:http://hi.baidu.com/wangzhiqing999/item/7ca215d8ec9823ee785daa2b MySQL 下 ROW_NUMBER / DENSE_RAN ...
- Android 新建一个类,在src新建一个类,使继承自活动
一:先新建一个包 右键src,新建包: 二:包中新建类 右建包,新建类,将超类改为andorid.app.Activity
- Angular中的$cacheFactory的作用和用法
1.Angular中的$cacheFactory的作用: (1)put(key,value); 在缓存对象中插入一个键值对(key,value). (2)get(key); 在缓存对象中通过指定 ...
- bash编程基础
bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...
- nginx的location
nginx的location分为普通location和正则location. 在普通location中,匹配规则是最大前缀匹配. 在正则location中,匹配规则是先到先得匹配.(最先匹配的正则lo ...