public class Geometry
{
public Geometry(string name, Data data, Hashtable hash)
{
Debug.Log("解析type为Geometry的模型---开始");
GameObject gameobject = new GameObject();
gameobject.name = name;
gameobject.AddComponent<MeshFilter>();
gameobject.AddComponent<MeshRenderer>(); //从json中取到的数组
int[] _faces = data.faces;
float[] _vertices = data.vertices;
float[] uvss = data.uvs; List<Vector3> verticesOld = new List<Vector3>();
List<Vector3> vertices = new List<Vector3>();
List<int> faces = new List<int>(); List<Vector2> _uvs = new List<Vector2>();
List<Vector2> uvs = new List<Vector2>(); //通过array构造顶点
for (int i = ; i < _vertices.Length; i += )
{
verticesOld.Add(new Vector3(_vertices[i], _vertices[i + ], _vertices[i + ]));
} Debug.Log(name + " uvs.Length:" + uvss.Length);
for (int i = ; i < uvss.Length; i += )
{
_uvs.Add(new Vector2(uvss[i],uvss[i+]));
} //根据_faces中的顶点,uv数据对顶点和uv进行重构。
int count = ; if (_faces.Length > )
{
int loop = ;
//faces中包含uv数据
if (_faces[] != )
{
int i;
for (i = ; i < _faces.Length; )
{
if (_faces[i] == )
{
loop = ;
}else if (_faces[i] == )
{
loop = ;
}else if (_faces[i] == )
{
loop = ;
} vertices.Add(verticesOld[_faces[i + ]]);
vertices.Add(verticesOld[_faces[i + ]]);
vertices.Add(verticesOld[_faces[i + ]]); faces.Add(count++);
faces.Add(count++);
faces.Add(count++); uvs.Add(_uvs[_faces[i + ]]);
uvs.Add(_uvs[_faces[i + ]]);
uvs.Add(_uvs[_faces[i + ]]);
//打印未考虑到的type
if (_faces[i] != && _faces[i] != && _faces[i] != )
{
Debug.Log("faces中未包含type:"+_faces[i]+","+_faces[i+]+","+_faces[i+]);
} i += loop;
}
}
//faces中不包含uv
else if (_faces[] == )
{
loop = ;
for (int i = ; i < _faces.Length; i += loop)
{
vertices.Add(verticesOld[_faces[i + ]]);
vertices.Add(verticesOld[_faces[i + ]]);
vertices.Add(verticesOld[_faces[i + ]]); faces.Add(count++);
faces.Add(count++);
faces.Add(count++);
}
}
} Mesh mesh = new Mesh();
mesh.name = name; mesh.vertices = vertices.ToArray();
mesh.triangles = faces.ToArray();
mesh.uv = uvs.ToArray(); gameobject.GetComponent<MeshFilter>().mesh = mesh;
//将网格资源存入给定的磁盘路径下,以便导出
AssetDatabase.CreateAsset(mesh, ExportClass.prePath + name + "mesh.asset"); //渲染材质
if (hash["materials"] != null)
{
new MaterialComponent().setMaterialInfo((Materials)hash["materials"], gameobject);
} gameobject.GetComponent<MeshRenderer>().receiveShadows = (bool) hash["receiveShadow"];
if ((bool) hash["castShadow"])
{
gameobject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
}
else
{
gameobject.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
} setTransform((MatrixParse) hash["matrixParse"], gameobject);
//挂在父对象下
gameobject.transform.parent = GameObject.Find(hash["parentName"].ToString()).transform;
Debug.Log("解析type为Geometry的模型---结束");
} //设置位移旋转缩放
private void setTransform(MatrixParse matrixParse, GameObject gameObject)
{
gameObject.transform.localScale = matrixParse.GetLocalScale; Vector3 pos = matrixParse.GetPosition;
gameObject.transform.position = new Vector3(-pos.x,pos.y,pos.z); gameObject.transform.Rotate(new Vector3(matrixParse.GetAngles.x,,),Space.Self);
gameObject.transform.Rotate(new Vector3(,matrixParse.GetAngles.y,),Space.Self);
gameObject.transform.Rotate(new Vector3(,,matrixParse.GetAngles.z),Space.Self); //反转
Reverse(gameObject.transform,matrixParse);
} private void Reverse(Transform form,MatrixParse matrixParse)
{
//反转
Vector3 pos = matrixParse.GetPosition;
form.position = new Vector3(-pos.x,pos.y,pos.z); Vector3 scale = matrixParse.GetLocalScale;
form.localScale = new Vector3(-scale.x,-scale.y,-scale.z); form.Rotate(new Vector3(,,),Space.World);
}
}

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. 20162327WJH第二次实验——树

    20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验 ...

  2. Java自学基础用法

    在慕课上面简单学习了一下java语言的用法 简单的用法总结记录一下. 代码(学习输入,输出): package hello; import java.util.Scanner; public clas ...

  3. 微信小程序demo——入门级(附源码)

    最近小程序又蠢蠢欲动,出了一个公众号绑定小程序功能,目测不错,就看了下微信小程序文档,顺便写了几行代码,后续有空会持续更新维护. 源码:https://github.com/SibreiaDante/ ...

  4. CentOS 7.2修改网卡名称

    #!/bin/bash #Centos7.2修改网卡名称ens33为eth0 #2017/05/19 if [ -f /etc/sysconfig/grub ];then cd cp /etc/sys ...

  5. scrapy 直接在编辑器运行

    # *_*coding:utf-8 *_* from scrapy.cmdline import execute execute("scrapy crawl spbeen --nolog&q ...

  6. Windows 常见错误总结

    本篇主要记录Windows 系统使用中存在的问题和解决方案,会保持持续更新...(若你们遇到的问题或有更好的解决方法,还望在评论区留言,谢谢) 1.win10 unable to save C:\wi ...

  7. [转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此

    AMD.英特尔为何争相走向胶水多核处理器?真相在此 胶水多核到底好不好?这个事不是简单一句话能说明的,今天的超能课堂里我们就来聊聊MCM胶水多核技术的过去及未来. 作者:孟宪瑞来源:超能网|2018- ...

  8. ACM数论之旅8---组合数(组合大法好(,,• ₃ •,,) )

    组合数并不陌生(´・ω・`) 我们都学过组合数 会求组合数吗 一般我们用杨辉三角性质 杨辉三角上的每一个数字都等于它的左上方和右上方的和(除了边界) 第n行,第m个就是,就是C(n, m) (从0开始 ...

  9. log4net日志文件的应用

    日志作为快速定位程序问题的主要手段,日志几乎是所有程序都必须拥有的一部分,下面我们就看下怎么使用log4net.dll文件: 1.下载log4net.dll文件 2.创建自己的项目 3.在自己项目下的 ...

  10. 左连接,右连接和等值连接(left join,right join和inner join)

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...