1. public class Geometry
  2. {
  3. public Geometry(string name, Data data, Hashtable hash)
  4. {
  5. Debug.Log("解析type为Geometry的模型---开始");
  6. GameObject gameobject = new GameObject();
  7. gameobject.name = name;
  8. gameobject.AddComponent<MeshFilter>();
  9. gameobject.AddComponent<MeshRenderer>();
  10.  
  11. //从json中取到的数组
  12. int[] _faces = data.faces;
  13. float[] _vertices = data.vertices;
  14. float[] uvss = data.uvs;
  15.  
  16. List<Vector3> verticesOld = new List<Vector3>();
  17. List<Vector3> vertices = new List<Vector3>();
  18. List<int> faces = new List<int>();
  19.  
  20. List<Vector2> _uvs = new List<Vector2>();
  21. List<Vector2> uvs = new List<Vector2>();
  22.  
  23. //通过array构造顶点
  24. for (int i = ; i < _vertices.Length; i += )
  25. {
  26. verticesOld.Add(new Vector3(_vertices[i], _vertices[i + ], _vertices[i + ]));
  27. }
  28.  
  29. Debug.Log(name + " uvs.Length:" + uvss.Length);
  30. for (int i = ; i < uvss.Length; i += )
  31. {
  32. _uvs.Add(new Vector2(uvss[i],uvss[i+]));
  33. }
  34.  
  35. //根据_faces中的顶点,uv数据对顶点和uv进行重构。
  36. int count = ;
  37.  
  38. if (_faces.Length > )
  39. {
  40. int loop = ;
  41. //faces中包含uv数据
  42. if (_faces[] != )
  43. {
  44. int i;
  45. for (i = ; i < _faces.Length; )
  46. {
  47. if (_faces[i] == )
  48. {
  49. loop = ;
  50. }else if (_faces[i] == )
  51. {
  52. loop = ;
  53. }else if (_faces[i] == )
  54. {
  55. loop = ;
  56. }
  57.  
  58. vertices.Add(verticesOld[_faces[i + ]]);
  59. vertices.Add(verticesOld[_faces[i + ]]);
  60. vertices.Add(verticesOld[_faces[i + ]]);
  61.  
  62. faces.Add(count++);
  63. faces.Add(count++);
  64. faces.Add(count++);
  65.  
  66. uvs.Add(_uvs[_faces[i + ]]);
  67. uvs.Add(_uvs[_faces[i + ]]);
  68. uvs.Add(_uvs[_faces[i + ]]);
  69. //打印未考虑到的type
  70. if (_faces[i] != && _faces[i] != && _faces[i] != )
  71. {
  72. Debug.Log("faces中未包含type:"+_faces[i]+","+_faces[i+]+","+_faces[i+]);
  73. }
  74.  
  75. i += loop;
  76. }
  77. }
  78. //faces中不包含uv
  79. else if (_faces[] == )
  80. {
  81. loop = ;
  82. for (int i = ; i < _faces.Length; i += loop)
  83. {
  84. vertices.Add(verticesOld[_faces[i + ]]);
  85. vertices.Add(verticesOld[_faces[i + ]]);
  86. vertices.Add(verticesOld[_faces[i + ]]);
  87.  
  88. faces.Add(count++);
  89. faces.Add(count++);
  90. faces.Add(count++);
  91. }
  92. }
  93. }
  94.  
  95. Mesh mesh = new Mesh();
  96. mesh.name = name;
  97.  
  98. mesh.vertices = vertices.ToArray();
  99. mesh.triangles = faces.ToArray();
  100. mesh.uv = uvs.ToArray();
  101.  
  102. gameobject.GetComponent<MeshFilter>().mesh = mesh;
  103. //将网格资源存入给定的磁盘路径下,以便导出
  104. AssetDatabase.CreateAsset(mesh, ExportClass.prePath + name + "mesh.asset");
  105.  
  106. //渲染材质
  107. if (hash["materials"] != null)
  108. {
  109. new MaterialComponent().setMaterialInfo((Materials)hash["materials"], gameobject);
  110. }
  111.  
  112. gameobject.GetComponent<MeshRenderer>().receiveShadows = (bool) hash["receiveShadow"];
  113. if ((bool) hash["castShadow"])
  114. {
  115. gameobject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
  116. }
  117. else
  118. {
  119. gameobject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
  120. }
  121.  
  122. setTransform((MatrixParse) hash["matrixParse"], gameobject);
  123. //挂在父对象下
  124. gameobject.transform.parent = GameObject.Find(hash["parentName"].ToString()).transform;
  125. Debug.Log("解析type为Geometry的模型---结束");
  126. }
  127.  
  128. //设置位移旋转缩放
  129. private void setTransform(MatrixParse matrixParse, GameObject gameObject)
  130. {
  131. gameObject.transform.localScale = matrixParse.GetLocalScale;
  132.  
  133. Vector3 pos = matrixParse.GetPosition;
  134. gameObject.transform.position = new Vector3(-pos.x,pos.y,pos.z);
  135.  
  136. gameObject.transform.Rotate(new Vector3(matrixParse.GetAngles.x,,),Space.Self);
  137. gameObject.transform.Rotate(new Vector3(,matrixParse.GetAngles.y,),Space.Self);
  138. gameObject.transform.Rotate(new Vector3(,,matrixParse.GetAngles.z),Space.Self);
  139.  
  140. //反转
  141. Reverse(gameObject.transform,matrixParse);
  142. }
  143.  
  144. private void Reverse(Transform form,MatrixParse matrixParse)
  145. {
  146. //反转
  147. Vector3 pos = matrixParse.GetPosition;
  148. form.position = new Vector3(-pos.x,pos.y,pos.z);
  149.  
  150. Vector3 scale = matrixParse.GetLocalScale;
  151. form.localScale = new Vector3(-scale.x,-scale.y,-scale.z);
  152.  
  153. form.Rotate(new Vector3(,,),Space.World);
  154. }
  155. }

unity还原three——顶点,三角面,uv的更多相关文章

  1. 【Unity Shader】(十) ------ UV动画原理及简易实现

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...

  2. unity还原three导出的json——基本模型,位移,旋转,缩放

    GameObject.CreatePrimitive(PrimitiveType.Cube); GameObject.CreatePrimitive(PrimitiveType.Plane); Gam ...

  3. [Unity Shader] 逐顶点光照和逐片元漫反射光照

    书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶 ...

  4. unity还原three之旋转

    http://www.360doc.com/content/16/0829/14/12282510_586760119.shtml unity使用左手坐标系,另外在做旋转的时候必须弄清楚旋转坐标轴和旋 ...

  5. Unity 自己使用顶点描绘圆形UI图片

    2020-09-10 在游戏的UI中,圆形图片的需求是很高的,但是,在Unity中想要实现圆形UI,一般的做法是是使用圆形Mask(遮罩),但是使用Mask的缺点很明显,主要有三点: 1.比较麻烦,使 ...

  6. unity代码创建草和模拟风的效果

    void Start() { Test4(); } //草 private Vector3[] grassArray = new Vector3[7]; private GameObject gras ...

  7. Unity MegaFiers 顶点动画

        使用 MegaFiers 插件,能够使得Unity支持顶点动画的播放. 官方视频教程例如以下: 在这里简单測试使用下,环境例如以下: Blender 2.72 Unity 4.5.4 Mega ...

  8. 顶点与UV

    1.顶点坐标和UV坐标是三维模型重要的两个坐标系统. 2.什么是UV?UV分别是图像在显示器水平和垂直方向上坐标,值在 0 - 1 之间 ,即水平方向的第 U 个做像素/图片宽度,垂直方向的第 V 个 ...

  9. Unity -----一些可能存在的错误

    关于Unity中的资源管理,你可能遇到这些问题 张鑫 8 个月前 原文链接:关于Unity中的资源管理,你可能遇到这些问题 - Blog 在优化Unity项目时,对资源的管理可谓是个系统纷繁的大工程. ...

随机推荐

  1. (第六周)课上Scrum站立会议演示

    组名:连连看 组长:张政 组员:张金生.李权.武志远 时间:2016.10.13   20:20——20:40 会议内容: 已完成的内容: 1.选定编译语言,安装软件并配置环境,完成了游戏的基本模型. ...

  2. 安装Visual studio 2013并进行单元测试

    刚开始在没有老师的指导下自己弄了一个简单的单元测试,最后与老师的对比发现错误百出,于是另起一篇.安装VS2013没有什么问题,安装过程如下图: 接下来别开始练习书上的单元测试. 先是简单的创建C#的类 ...

  3. Task 8 找水王

    任务: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你 ...

  4. Internet History, Technology and Security (Week5.1)

    Week5 The Transport layer is built on the Internetwork layer and is what makes our network connectio ...

  5. Unity如何判断网络状态?

    根据Application.internetReachability来判断网络状态 NetworkReachability.NotReachable 网络不可用 NetworkReachability ...

  6. mybati内sql查询语句在两个日期内

    装载自: http://blog.csdn.net/u010442302/article/details/72902441?locationNum=9&fps=1   <select i ...

  7. [2017BUAA软工]第2次个人作业

    软工第2次个人作业--代码复审 一.代码复审Check List 1.概要部分 代码能符合需求和规格说明么? 能正确处理题目要求,代码能符合需求和规格. 代码设计是否有周全的考虑? 能正确生成和解出数 ...

  8. GDI+ 支持的图片文件格式

    您可以使用许多标准格式将位图储存在磁盘文件中.GDI+ 支持以下各种图片文件格式. o 位图 (BMP) 位图是 Windows 用来储存设备无关和与应用程序无关的图片的标准格式.文件头决定了指定的位 ...

  9. Springboot 和 Mybatis集成开发

    Springboot 和 Mybatis集成开发 本项目使用的环境: 开发工具:Intellij IDEA 2017.1.3 jdk:1.7.0_79 maven:3.3.9 额外功能 PageHel ...

  10. 把打印的内容保存成文件(PDF)

    有时候网页的内容和打印的内容会有一些差异,需要把打印的内容倒出来.是有办法的. 1.以谷歌为内核的浏览器示例,按Ctrl+p快捷键打开打印对话框,如图: 2.点击更改按钮,更改打印机,会出现选择目标打 ...