前言:

从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体。


一、基本思路

由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:vertices与索引的三角形(即负责管理每个三角形的三点的索引顺序):triangles。长方体:一般会得知:长宽高;即今天我们由长宽高为参数得到vertices与triangles。


二、基本程序框架

创建一个empty的gameobject,挂在脚本。

由基本思路可得基本框架,之后,实现函数功能即可;

  1. using UnityEngine;
  2.  
  3. [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
  4. public class cube_mesh : MonoBehaviour
  5. {
  6. public float Length = ; //长方体的长
  7. public float Width = ; //长方体的宽
  8. public float Heigth = ; //长方体的高
  9. private MeshFilter meshFilter;
  10.  
  11. void Start()
  12. {
  13. meshFilter = GetComponent<MeshFilter>();
  14. meshFilter.mesh = CreateMesh(Length, Width, Heigth);
  15. }
  16.  
  17. Mesh CreateMesh(float length, float width, float heigth)
  18. {
  19. //vertices(顶点、必须):
  20. //.........
  21.  
  22. //triangles(索引三角形、必须):
  23. //.........
  24.  
  25. //uv:
  26. //.........
  27.  
  28. //负载属性与mesh
  29. Mesh mesh = new Mesh();
  30. //.........
  31. return mesh;
  32. }
  33. }


三、绘制函数的实现以及整个程序代码

  1. using UnityEngine;
  2.  
  3. [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
  4. public class cube_mesh : MonoBehaviour
  5. {
  6. public float Length = ; //长方体的长
  7. public float Width = ; //长方体的宽
  8. public float Heigth = ; //长方体的高
  9. private MeshFilter meshFilter;
  10.  
  11. void Start()
  12. {
  13. meshFilter = GetComponent<MeshFilter>();
  14. meshFilter.mesh = CreateMesh(Length, Width, Heigth);
  15. }
  16.  
  17. Mesh CreateMesh(float length, float width, float heigth)
  18. {
  19.  
  20. //vertices(顶点、必须):
  21. int vertices_count = *; //顶点数(每个面4个点,六个面)
  22. Vector3[] vertices = new Vector3[vertices_count];
  23. vertices[] = new Vector3(, , ); //前面的左下角的点
  24. vertices[] = new Vector3(, heigth, ); //前面的左上角的点
  25. vertices[] = new Vector3(length, , ); //前面的右下角的点
  26. vertices[] = new Vector3(length, heigth, ); //前面的右上角的点
  27.  
  28. vertices[] = new Vector3(length, , width); //后面的右下角的点
  29. vertices[] = new Vector3(length, heigth, width); //后面的右上角的点
  30. vertices[] = new Vector3(, , width); //后面的左下角的点
  31. vertices[] = new Vector3(, heigth, width); //后面的左上角的点
  32.  
  33. vertices[] = vertices[]; //左
  34. vertices[] = vertices[];
  35. vertices[] = vertices[];
  36. vertices[] = vertices[];
  37.  
  38. vertices[] = vertices[]; //右
  39. vertices[] = vertices[];
  40. vertices[] = vertices[];
  41. vertices[] = vertices[];
  42.  
  43. vertices[] = vertices[]; //上
  44. vertices[] = vertices[];
  45. vertices[] = vertices[];
  46. vertices[] = vertices[];
  47.  
  48. vertices[] = vertices[]; //下
  49. vertices[] = vertices[];
  50. vertices[] = vertices[];
  51. vertices[] = vertices[];
  52.  
  53. //triangles(索引三角形、必须):
  54. int 分割三角形数 = * ;
  55. int triangles_cout = 分割三角形数 * ; //索引三角形的索引点个数
  56. int[] triangles = new int [triangles_cout]; //索引三角形数组
  57. for(int i=,vi=;i< triangles_cout;i+=,vi+=)
  58. {
  59. triangles[i] = vi;
  60. triangles[i+] = vi+;
  61. triangles[i+] = vi+;
  62.  
  63. triangles[i+] = vi+;
  64. triangles[i+] = vi+;
  65. triangles[i+] = vi+;
  66.  
  67. }
  68.  
  69. //uv:
  70. //.........
  71.  
  72. //负载属性与mesh
  73. Mesh mesh = new Mesh();
  74. mesh.vertices = vertices;
  75. mesh.triangles = triangles;
  76. return mesh;
  77. }
  78. }

四、效果图


五、其他相关的说明

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(七)绘制长方体的更多相关文章

  1. Unity3D之Mesh(五)绘制圆

    前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最 ...

  2. Unity3D之Mesh(一)绘制三角形

    前言: Unity自带几种简单的模型,如cube等:一般情况下,其余模型有3D建模软件生成,以合适的文件格式导入unity中:而mesh(以我目前很粗浅的了解)的一般用途就是:对现有的模型进行变形,以 ...

  3. Unity3D学习笔记2——绘制一个带纹理的面

    目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...

  4. Istio Ambient Mesh七层服务治理图文详解

    摘要:本文主要集中剖析Ambient mesh七层服务治理相关内容. 本文分享自华为云社区<Istio Ambient Mesh七层服务治理图文详解>,作者:华为云云原生团队. 由于Amb ...

  5. Unity3D之Mesh(四)绘制多边形

    来自https://www.cnblogs.com/JLZT1223/p/6086191.html 1. 总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思 ...

  6. Unity3D之Mesh(六)绘制扇形、扇面、环形

    前言: 绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法. 一.分析: 首先,结合绘制圆的过程绘制环形: 圆形是由segments个等腰三角形组成的(上一篇中, ...

  7. Unity3D之Mesh(三)绘制四边形

    前言: 由於之前的基本介紹,所以有關的知識點不做贅述,只上案例,知識作爲自己做試驗的記錄,便於日後查看. 步驟: 1.創建一個empty 的gameobject: 2.添加一個脚本給這個game ob ...

  8. Unity3D学习笔记1——绘制一个三角形

    目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...

  9. Unity3D之Mesh【创建动态Mesh的学习网站】

    觉得不错!做记录! 1.http://gamerboom.com/archives/76484 2.http://jayelinda.com/ 3.几个私人的博客,可能有启发:http://blog. ...

随机推荐

  1. dedecms织梦如何调用指定的多个栏目导航

    {dede:channelartlist row='2' typeid='1,2这里输入多个指定的栏目ID' } <li><a href='{dede:field name='typ ...

  2. Wormholes - poj 3259 (Bellman-Ford算法)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 34934   Accepted: 12752 Description W ...

  3. window安装redis

    1.redis简介redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...

  4. java后端技术

    技术概论:Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构 我在恒生工作,主要开发金融互联网第三方平台的对接项目.目前已经对接 ...

  5. linux使用rsync+inotify-tools+ssh实现文件实时同步

    假设某服务器架构中有两台web服务器(IP为192.168.1.252和192.168.1.254),一台代码更新发布服务器(IP为192.168.1.251),需要同步的目录是/data/www/, ...

  6. TP框架的修改,删除

    先把数据库的素具显示出来 public function xiugai() { $code= "n001";//修改的主键值 $n = M("nation"); ...

  7. json-lib-2.4-jdk15.jar 报错 net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案(Hibernate)

    使用hibernate容易出现该问题,主要是由于pojo类属性存在级联关系.比如说员工和部门,在员工表里面有部门属性,而在部门表里面有个员工集合,这样就存在了嵌套引用的问题了,就会抛出这个异常. 解决 ...

  8. hdu 4414 Finding crosses【简单模拟】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4414 CSUST:点击打开链接 Finding crosses Time Limit: 2000/1000 ...

  9. Protobuf 语法 - 史上最简教程

    Protobuf 语法简明教程 疯狂创客圈 死磕Netty 亿级流量架构系列之12 [博客园 总入口 ] 在protobuf中,协议是由一系列的消息组成的.因此最重要的就是定义通信时使用到的消息格式. ...

  10. 两个Java项目之间相互调用

    转自:http://dysfzhoulong.iteye.com/blog/1008747 一个项目A另一个项目B:(项目A和项目B都是Java写的项目) 在A项目中怎么调用B项目中的类和方法 有两种 ...