Unity3D 动态创建Mesh_unity 动态创建mesh-程序员宅基地

技术标签: Unity3D  unity3d  mesh  

1.Mesh、MeshFilter、MeshRenderer关系整理

在Unity3D中创建一个Cube,在Inspector可以看到其中含有MeshFilter、MeshRenderer组件。

MeshFilter含有一个Public成员 Mesh。

在Mesh中存储着三维模型的数据:vertices(顶点数据数组Vector3[])、triangles(三角形顶点索引数组,int[])、normals(法线向量数组,Vector3[])、uv(纹理坐标数组,Vector2[])。

2.使用Mesh创建一个Cube

创建一个脚本dyn3d.cs,成为Main Camera的组件,点击运行即可看到动态生成的Cube

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class dyn3d : MonoBehaviour {
 5 
 6     // Use this for initialization
 7     void Start () {
 8     
 9         CreateCube();
10     }
11     
12     // Update is called once per frame
13     void Update () {
14 
15     }
16 
17     void CreateCube()
18     {
19 
20         GameObject obj=new GameObject("cube");
21         MeshFilter mf=obj.AddComponent<MeshFilter>();
22         MeshRenderer mr=obj.AddComponent<MeshRenderer>();
23         
24         
25         Vector3[] vertices=new Vector3[24];
26         int[] triangles=new int[36];
27 
28         //forward
29         vertices[0].Set(0.5f,-0.5f,0.5f);
30         vertices[1].Set(-0.5f,-0.5f,0.5f);
31         vertices[2].Set(0.5f,0.5f,0.5f);
32         vertices[3].Set(-0.5f,0.5f,0.5f);
33         //back
34         vertices[4].Set(vertices[2].x,vertices[2].y,-0.5f);
35         vertices[5].Set(vertices[3].x,vertices[3].y,-0.5f);
36         vertices[6].Set(vertices[0].x,vertices[0].y,-0.5f);
37         vertices[7].Set(vertices[1].x,vertices[1].y,-0.5f);
38         //up
39         vertices[8]=vertices[2];
40         vertices[9]=vertices[3];
41         vertices[10]=vertices[4];
42         vertices[11]=vertices[5];
43         //down
44         vertices[12].Set(vertices[10].x,-0.5f,vertices[10].z);
45         vertices[13].Set(vertices[11].x,-0.5f,vertices[11].z);
46         vertices[14].Set(vertices[8].x,-0.5f,vertices[8].z);
47         vertices[15].Set(vertices[9].x,-0.5f,vertices[9].z);
48         //right
49         vertices[16]=vertices[6];
50         vertices[17]=vertices[0];
51         vertices[18]=vertices[4];
52         vertices[19]=vertices[2];
53         //left
54         vertices[20].Set(-0.5f,vertices[18].y,vertices[18].z);
55         vertices[21].Set(-0.5f,vertices[19].y,vertices[19].z);
56         vertices[22].Set(-0.5f,vertices[16].y,vertices[16].z);
57         vertices[23].Set(-0.5f,vertices[17].y,vertices[17].z);
58         
59         int currentCount=0;
60         for(int i=0;i<24;i=i+4)
61         {
62             triangles[currentCount++]=i;
63             triangles[currentCount++]=i+3;
64             triangles[currentCount++]=i+1;
65             
66             triangles[currentCount++]=i;
67             triangles[currentCount++]=i+2;
68             triangles[currentCount++]=i+3;
69             
70         }
71 
72         mf.mesh.vertices=vertices;
73         mf.mesh.triangles=triangles;
74         
75     }
76 }
复制代码

在这里定义vertices数组存储顶点坐标信息,定义triangles数组存储三角形顶点索引。但是这个Mesh不包含normals和uv信息,所以显示出来的正方体是无纹理贴图,并且不能反应环境光照的。

 3.冗余的顶点坐标

正方体6个面,每个面由2个三角形组成,所以共需要36个三角形顶点索引。但是正方体只有8个顶点,为什么需要24个顶点坐标数据呢?

答案是:Unity3D的Mesh.triangles是三角形索引数组,不仅依靠这个索引值索引三角形顶点坐标,而且索引纹理坐标,索引法线向量。即正方体的每个顶点都参与了3个平面,而这3个平面的法线向量是不同的,该顶点在渲染这3个平面的时候需要索引到不同的法线向量。而由于顶点坐标和法线向量是由同一个索引值triangles[Index]取得的,例如,根据triangles[0],triangles[14],triangles[17]在vertices中索引到的顶点都为(0.5,-0.5,0.5),但是在normals中索引到的法向量值各不相同。这就决定了在正方体中一个顶点,需要有3份存储。(如果你需要创建其它模型,需要根据实际情况决定顶点坐标的冗余度。实质上顶点坐标的冗余正是方便了法线坐标、纹理坐标的存取。)

4.三角形的渲染

准则:三角形有两面,正面可见,背面不可见。三角形的渲染顺序与三角形的正面法线呈左手螺旋定则

这就决定了,如果我们需要渲染如下一个正方形面,那么就需要保证组成这个正方形的两个小三角形的正面法线都是指向屏幕外的。

我在程序中的顶点顺序为,三角形1: 0->3->1,三角形2: 0->2->3 。

复制代码
 1 int currentCount=0;
 2 for(int i=0;i<24;i=i+4)
 3 {
 4         //三角形1
 5     triangles[currentCount++]=i;
 6     triangles[currentCount++]=i+3;
 7     triangles[currentCount++]=i+1;
 8     //三角形2        
 9     triangles[currentCount++]=i;
10     triangles[currentCount++]=i+2;
11     triangles[currentCount++]=i+3;
12 }
复制代码

这段代码保证了正方体的6个面,12个三角形的都正确被渲染(正面法线朝外)。



转载:http://www.cnblogs.com/kyokuhuang/p/4191169.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ycl295644/article/details/51276199

智能推荐

【图片格式转换】ICO、JPG、JPEG、PNG图片格式在线免费转换-程序员宅基地

文章浏览阅读663次,点赞26次,收藏2次。在线图片格式转换,支持ICO、JPG、JPEG、PNG等。

用计算机采集卡检测压力传感器信号故障,计算机联网检测系统在机动车检测中的应用...-程序员宅基地

文章浏览阅读232次。[摘 要] 计算机联网检测技术在机动车检测方面应用广泛。文章介绍计算机联网检测系统的类型及检测原理,探讨系统的维护、使用及故障诊断的技术与方法。[关键词] 计算机 联网 机动车检测 应用计算机联网检测系统是电子技术、仪表技术、计算机技术、网络技术与检测设备的集成,通过网络集成而构成的自动控制系统,按照规范的通讯协议在检测设备与计算机之间实现数据传输和信息交换,从而实现控制与管理一体化的综合自动控制..._检车线力传感器电脑怎么测量

ANSYS or Abaqus? 一个过来人的工作感悟_abaqus和ansys哪个好-程序员宅基地

文章浏览阅读3.2w次,点赞65次,收藏255次。小孩子才做选择题,大人肯定都要。从入门到入门我是在研究生阶段开始接触有限元分析的。我本科学的高分子材料,研究生学的是复合材料,因此开始接触结构分析。14年上研究生,教研室同时有材料学院的学生(复合材料专业)和理学院的学生(力学专业),力学专业的主要依托材料来做一些理论研究性的内容。在15年的时候,我开始跟着教研室学习有限元分析,使用的是ANSYS,那时候跟着实验室从APDL学起,发现很费劲,也就学了一点点就中止了,那时候也压根没想着去学习有限元理论等等,就是好奇的学一下。后来16年到了中科院工程._abaqus和ansys哪个好

STM32CubeMX应用教程 第二章 USART(通用同步异步收发器)_cubemx usart lin-程序员宅基地

文章浏览阅读960次。软件:STM32CubeMX Version 6.2.1      MDK5 for ARM硬件:战舰精英V3 STM32F103ZET6文章目录前言一、使能USART的外设时钟(AHB-APB2)1.1.时钟总线框图1.2.GPIO时钟寄存器1.3.使能GPIO时钟的代码二、配置工作模式2.1.输入/输出模式2.2.翻转速率2.3.GPIO控制相关寄存器三、配置GPIO初始化3.1.配置F103STM32CubeMX使用HAL库;3.1.1 配置输出LED灯;3.1.2 配置输入按键;3.1.3 _cubemx usart lin

MQTT协议及其在Golang中的实现_golang mqtt-程序员宅基地

文章浏览阅读1.2k次。MQTT协议是由IBM开发的,最初用于连接远程遥测设备到物联网中的服务器。它是一种轻量级的、开放的协议,通过TCP/IP网络进行消息传输。MQTT采用发布/订阅(publish/subscribe)模式,其中设备可以作为发布者(publisher)发布消息,也可以作为订阅者(subscriber)订阅消息。_golang mqtt

Android音频浅析及各种音频场景下的audio data path_audiodata-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏42次。转自:Android智能手机上的音频浅析Android智能手机中各种音频场景下的audio data path1. 硬件下图是Android智能手机中目前主流的跟音频相关的硬件框图。上图中AP是应用处理器(application processor),现在用的最多的是ARM的处理器,在上面主要运行的是操作系统(OS,例如android)和应用程序。CP是通信处理器(communication processor),也叫基带处理器(baseband processor,BP)或者modem,上面_audiodata

随便推点

1010 一元多项式求导-程序员宅基地

文章浏览阅读173次。设计函数求一元多项式的导数。(注xn(n为整数)的一阶导数为nxn−1。)_1010 一元多项式求导

如何不重打包调试Android应用_androdi 不打包 修改-程序员宅基地

文章浏览阅读765次。前言:在前面的文章中介绍过一种方法如何修改Android的ro属性 不明白的可以先看看,这里是第二种方法安全工程师在进行Android逆向的时候常常会有动态调试的需求,由于厂商对外发布的APP都是release版,发布产品时都会将debuggable设置为 false,使第三方不能直接调试分析APP。目前流行的方法是修改APK的 AndroidManifest.xml 将 android:debu..._androdi 不打包 修改

解决mac突然连不上wifi了(wifi出现灰色小感叹号!)_mac电脑wifi显示灰色叉-程序员宅基地

文章浏览阅读2.2w次,点赞11次,收藏25次。记一次可怕的经历,不知道是不是我装VPN软件还是点啥了,突然我的mac就连不上wifi了,电脑的wifi图标上出现一个灰色的小感叹号。但是手机,ipad都能连上wifi上网,不能上网的mac它还叫mac嘛?后面到处搜了无数帖子,真是一段崩溃而又无助并且彷徨中带着些许烦躁的时间,试了无数的法子,终于让心爱的本本恢复了正常。记下这段可怕的经历的解决办法,希望它再也不要发神经了。第一步,打开访达按住command + shift + G出现一个搜索框,输入/资源库/Preferences/Syst_mac电脑wifi显示灰色叉

苹果Swift编程语言_苹果swift编程怎么下载-程序员宅基地

文章浏览阅读836次。https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399_苹果swift编程怎么下载

python 列表套字典_python中列表内能否套字典?-程序员宅基地

文章浏览阅读1.9k次。python中能否将字典当做值赋给列表呢?我在对代码做了一个简单的演示,但是为什么不行呢?还是说python就不能列表套字典,只能是字典套列表?>>> a=[]>>> b=0>>> a[b]={'key':'vi'}Traceback (most recent call last):File "<pyshell#2>", line ..._字典套字典套列表

R语言-多元统计学分析课程报告_r语言课程设计报告-程序员宅基地

文章浏览阅读3.2k次,点赞5次,收藏100次。R语言中多元统计分析的课程报告,想要完整程序跟Word文档的可以私我_r语言课程设计报告