unity 将文件导出成Obj格式存储在任意位置
2017-11-21 19:08
477 查看
接上一篇将对象存储为fbx这一篇文章就是将对象存储为obj格式。
优势是可以存储在任意位置,只要可以就可以。亲测可用移动端和pc端,应该是都可以的,因为可以存在沙盒中~~~~
劣势暂时还不知道,可能obj不支持其他一些3D引擎吧。。。
方法很简单,直接调用CreatMesh,传参即可。
path地址~例如 application.streamingasets+”acc/”
meshname 存储文件的文件名 例如 : “acc.obj”
ms 对象mesh网格
这个方法可以搭配我的上上篇文章使用,欢迎大家浏览我的博客~~~
嗯 就这样吧 这个比较简单 就不说太多了,具体的转化数据的那个方法,大家感兴趣可以自己测试
方法我是在网上找的,大家可以找找原著,我就不厚脸皮了~
大家可以一块交流有什么问题的话,我的qq 791719266
优势是可以存储在任意位置,只要可以就可以。亲测可用移动端和pc端,应该是都可以的,因为可以存在沙盒中~~~~
劣势暂时还不知道,可能obj不支持其他一些3D引擎吧。。。
方法很简单,直接调用CreatMesh,传参即可。
path地址~例如 application.streamingasets+”acc/”
meshname 存储文件的文件名 例如 : “acc.obj”
ms 对象mesh网格
这个方法可以搭配我的上上篇文章使用,欢迎大家浏览我的博客~~~
嗯 就这样吧 这个比较简单 就不说太多了,具体的转化数据的那个方法,大家感兴趣可以自己测试
方法我是在网上找的,大家可以找找原著,我就不厚脸皮了~
大家可以一块交流有什么问题的话,我的qq 791719266
/// <summary> /// 存储文件到沙盒中 /// </summary> public static void CreatMesh(string path, string meshname, Mesh ms) { //回掉 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (StreamWriter streamWriter = new StreamWriter(path + meshname)) { streamWriter.Write(MeshToString(ms, new Vector3(-1f, 1f, 1f))); streamWriter.Close(); } } /// <summary> /// mesh转化为数据 /// </summary> /// <param name="mf"></param> /// <param name="scale"></param> /// <returns></returns> public static string MeshToString(Mesh mf, Vector3 scale) { Mesh mesh = mf; //Material[] sharedMaterials = mf.GetComponent<Renderer>().sharedMaterials; //Vector2 textureOffset = mf.GetComponent<Renderer>().material.GetTextureOffset("_MainTex");//这里对于我来说么用,去掉了 //Vector2 textureScale = mf.GetComponent<Renderer>().material.GetTextureScale("_MainTex");//这里对于我来说么用,就改掉了1,1 Vector2 textureOffset = new Vector2(0, 0); Vector2 textureScale = new Vector2(1, 1); StringBuilder stringBuilder = new StringBuilder().Append("mtllib design.mtl") .Append("\n") .Append("g ") .Append(mf.name) .Append("\n"); Vector3[] vertices = mesh.vertices; for (int i = 0; i < vertices.Length; i++) { Vector3 vector = vertices[i]; stringBuilder.Append(string.Format("v {0} {1} {2}\n", vector.x * scale.x, vector.y * scale.y, vector.z * scale.z)); } stringBuilder.Append("\n"); Dictionary<int, int> dictionary = new Dictionary<int, int>(); if (mesh.subMeshCount > 1) { int[] triangles = mesh.GetTriangles(1); for (int j = 0; j < triangles.Length; j += 3) { if (!dictionary.ContainsKey(triangles[j])) { dictionary.Add(triangles[j], 1); } if (!dictionary.ContainsKey(triangles[j + 1])) { dictionary.Add(triangles[j + 1], 1); } if (!dictionary.ContainsKey(triangles[j + 2])) { dictionary.Add(triangles[j + 2], 1); } } } for (int num = 0; num != mesh.uv.Length; num++) { Vector2 vector2 = Vector2.Scale(mesh.uv[num], textureScale) + textureOffset; if (dictionary.ContainsKey(num)) { stringBuilder.Append(string.Format("vt {0} {1}\n", mesh.uv[num].x, mesh.uv[num].y)); } else { stringBuilder.Append(string.Format("vt {0} {1}\n", vector2.x, vector2.y)); } } for (int k = 0; k < mesh.subMeshCount; k++) { stringBuilder.Append("\n"); if (k == 0) { stringBuilder.Append("usemtl ").Append("Material_design").Append("\n"); } if (k == 1) { stringBuilder.Append("usemtl ").Append("Material_logo").Append("\n"); } int[] triangles2 = mesh.GetTriangles(k); for (int l = 0; l < triangles2.Length; l += 3) { stringBuilder.Append(string.Format("f {0}/{0} {1}/{1} {2}/{2}\n", triangles2[l] + 1, triangles2[l + 2] + 1, triangles2[l + 1] + 1)); } } return stringBuilder.ToString(); }
相关文章推荐
- unity导出.obj模型文件
- Unity MeshFilter导出OBJ文件
- Blender软件导出的obj数据格式文件内容解读
- Unity的动作文件关键帧存储格式的问题
- 将Unity场景(包含物件和地形)导出到.obj文件
- unity导出obj格式
- Android将SQLite数据表导出到csv格式文件 分类: Android数据存储 2014-06-20 13:28 85人阅读 评论(0) 收藏
- mysql文件目录格式及存储位置
- Unity导出场景地形网格到.obj文件
- CSDN上面的一段导出Excel格式文件的存储过程
- 3dmax导出three.js使用的obj格式文件时缺少贴图
- unity 加载obj文件的方法(可读取任意地址的文件包括沙盒中之类的)
- Unity动态创建的Mesh,导出为Obj模型文件,并生成Prefab文件
- python读取和存储dict()与.json格式文件
- bcp怎么导出一个表数据为带列名的csv格式文件
- Hadoop文件的存储格式
- PE 与COFF OBJ 文件格式
- Heritrix使用UTF-8编码格式存储文件
- Java实现任意文件在bmp中的隐藏与导出
- WPF RTSP存储到一个文件中的位置