Unity3D之Mesh(七)绘制长方体

前言:

从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型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 = 5;              //长方体的长
 7     public float Width = 6;               //长方体的宽
 8     public float Heigth = 7;              //长方体的高
 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 = 5;              //长方体的长
 7     public float Width = 6;               //长方体的宽
 8     public float Heigth = 7;              //长方体的高
 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*6;                                 //顶点数(每个面4个点,六个面)
22         Vector3[] vertices = new Vector3[vertices_count];
23         vertices[0] = new Vector3(0, 0, 0);                     //前面的左下角的点
24         vertices[1] = new Vector3(0, heigth, 0);                //前面的左上角的点
25         vertices[2] = new Vector3(length, 0, 0);                //前面的右下角的点
26         vertices[3] = new Vector3(length, heigth, 0);           //前面的右上角的点
27
28         vertices[4] = new Vector3(length, 0, width);           //后面的右下角的点
29         vertices[5] = new Vector3(length, heigth, width);      //后面的右上角的点
30         vertices[6] = new Vector3(0, 0, width);                //后面的左下角的点
31         vertices[7] = new Vector3(0, heigth, width);           //后面的左上角的点
32
33         vertices[8] = vertices[6];                              //左
34         vertices[9] = vertices[7];
35         vertices[10] = vertices[0];
36         vertices[11] = vertices[1];
37
38         vertices[12] = vertices[2];                              //右
39         vertices[13] = vertices[3];
40         vertices[14] = vertices[4];
41         vertices[15] = vertices[5];
42
43         vertices[16] = vertices[1];                              //上
44         vertices[17] = vertices[7];
45         vertices[18] = vertices[3];
46         vertices[19] = vertices[5];
47
48         vertices[20] = vertices[2];                              //下
49         vertices[21] = vertices[4];
50         vertices[22] = vertices[0];
51         vertices[23] = vertices[6];
52
53
54         //triangles(索引三角形、必须):
55         int 分割三角形数 = 6 * 2;
56         int triangles_cout = 分割三角形数 * 3;                  //索引三角形的索引点个数
57         int[] triangles = new int [triangles_cout];            //索引三角形数组
58         for(int i=0,vi=0;i< triangles_cout;i+=6,vi+=4)
59         {
60             triangles[i] = vi;
61             triangles[i+1] = vi+1;
62             triangles[i+2] = vi+2;
63
64             triangles[i+3] = vi+3;
65             triangles[i+4] = vi+2;
66             triangles[i+5] = vi+1;
67
68         }
69
70         //uv:
71         //.........
72
73         //负载属性与mesh
74         Mesh mesh = new Mesh();
75         mesh.vertices = vertices;
76         mesh.triangles = triangles;
77         return mesh;
78     }
79 }


四、效果图



五、其他相关的说明

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 。



【欢迎转载】

转载请表明出处: 乐学习

时间: 2024-08-19 09:19:38

Unity3D之Mesh(七)绘制长方体的相关文章

Unity3D之Mesh(五)绘制圆

前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最基本的依然是顶点以及三角形索引数组,即:我们需要根据圆的半径以及预备的分割数,通过算法得到:顶点的Vector3数组 以及对应的三角形索引数组: 1.基本的程序实现架构如下: using UnityEngine; [RequireComponent(typeof(MeshRenderer), typ

如何在CAD中绘制长方体?只需简单四步

如何在CAD中绘制长方体?只需简单四步.在日常的工作中,特别是一些CAD行业,日常的基本工作就是编辑绘制CAD图纸,在绘制CAD图纸的时候需要借助一下工具来进行绘制,比如说CAD编辑器来绘制CAD图纸既方便又快捷,但是在绘制图纸的时候也会遇到许多的文件,那就是如何在CAD中绘制长方体?有什么好的办法吗?具体要怎么来进行操作?下面我们就来一起看看具体操作步骤吧. 使用步骤一:首先电脑中没有下载安装CAD编辑器的小伙伴们,还是需要在日常使用的电脑中任意的打开一个浏览器,在浏览器的搜索框中搜索迅捷CA

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

前言: 绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法. 一.分析: 首先,结合绘制圆的过程绘制环形: 圆形是由segments个等腰三角形组成的(上一篇中,将圆分为segments份,即segments个等腰三角形),圆环就是有segments个等腰梯形组成的. 那么等腰梯形由什么组成?两个三角形(多个也是可以的). 故:添加一个变量,内圆半径. 即:到此时此刻,我们需要根据:外半径.内半径.分割的数目(  当然如果是扇形或扇面,我们还需要一个角度an

Unity3D之Mesh(四)绘制多边形

前言: 依然如故,由於之前的基本介紹,所以有關的知識點不做贅述,只上案例,知識作爲自己做試驗的記錄,便於日後查看. 一些知识点的说明记录与补充: 1. 总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思路就在于三角形的拆分.如果说一个平面有7个顶点,我们把它们分别编号0到6,拆分情况如图所示: 即:如果用n来表示顶点的个数,那么在同一个平面内,可以分割的三角形个数是:n-2; 2. 在这里,我们选择应用Mesh Filter组件来进行绘制,Mesh F

Unity3D使用mesh创建一个正方形

using UnityEngine; using System.Collections; public class Quad : MonoBehaviour { // Use this for initialization void Start () { CreateQuad (); } private float m_width = 1; private float m_length = 1; public void CreateQuad() { /* 1. 顶点,三角形,法线,uv坐标, 绝

Unity3D 动态创建Mesh(一)

1.Mesh.MeshFilter.MeshRenderer关系整理 在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter.MeshRenderer组件. MeshFilter含有一个Public成员 Mesh. 在Mesh中存储着三维模型的数据:vertices(顶点数据数组Vector3[]).triangles(三角形顶点索引数组,int[]).normals(法线向量数组,Vector3[]).uv(纹理坐标数组,Vector2[]). 2.使用M

Unity3D脚本中文系列教程(八)

◆ static var matrix : Matrix4x4 描述:设置用于渲染所有gizmos的矩阵. 类方法 ◆ Static function DrawCube(center:Vector3,size:Vector3):void 描述:用center和size绘制一个立方体.function OnDrawGizmosSelected() {        //在变换位置处绘制一个变透明的蓝色立方体        Gizmos.color=Color(1,0,0,5);        Gi

matlab 三维绘制

1. mesh(Z)语句 mesh(Z)语句可以给出矩阵Z元素的三维消隐图,网络表面由Z坐标点定义,与前面叙述的x-y平面的线格相同,图形由邻近的点连接而成.它可用来显示用其它方式难以输出的包含大量数据的大型矩阵,也可用来绘制Z变量函数. 显示两变量的函数Z=f(x,y),第一步需产生特定的行和列的x-y矩阵.然后计算函数在各网格点上的值.最后用mesh函数输出. 下面我们绘制sin(r)/r函数的图形.建立图形用以下方法: x=-10:1:10; y=x'; x=ones(size(y))*x

零基础unity3d游戏开发系列目录

零基础Unity3D游戏开发系列 第一章:游戏开发与游戏引擎(一) 零基础Unity3D游戏开发系列 第一章:游戏开发与游戏引擎(二) 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)界面... 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)创建与打开项目I 零基础unity3d游戏开发系列 第二章:unity3d概览(一)创建与打开项目II 零基础Unity3D游戏开发系列 第二章:Unity3D概览(一)创建与打开项目III 零基础Unity3D游戏开发