我经常要在Unity中生成一些网格,但是这些网格需要交给美工修改,所以又要将网格输出为模型。于是就有了下面的代码:

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Text;
  7. /// <summary>
  8. /// 将“一个”选中的对象输出为obj格式
  9. /// </summary>
  10. public class EditorObjExporter : ScriptableObject
  11. {
  12. private static int vertexOffset = 0;
  13. private static int normalOffset = 0;
  14. private static int uvOffset = 0;
  15.  
  16. private static string targetFolder = "Assets/ExportedObj";//文件路径,创建后需要打开路径才能看到刷新的模型
  17.  
  18. //核心代码,将网格转为能被obj读取的数据
  19. private static string MeshToString(MeshFilter mf, List<string> meshList)
  20. {
  21. Mesh m = mf.sharedMesh;
  22. StringBuilder sb = new StringBuilder ();
  23. sb.Append ("g").Append (mf.name).Append ("\n");
  24. foreach (Vector3 lv in m.vertices) {
  25. Vector3 wv = mf.transform.TransformPoint (lv);
  26.  
  27. sb.Append (string.Format ("v {0} {1} {2} \n", -wv.x, wv.y, wv.z));
  28. }
  29. sb.Append ("\n");
  30.  
  31. foreach (Vector3 lv in m.normals) {
  32. Vector3 wv = mf.transform.TransformDirection (lv);
  33.  
  34. sb.Append (string.Format ("vn {0} {1} {2} \n", -wv.x, wv.y, wv.z));
  35. }
  36. sb.Append ("\n");
  37.  
  38. foreach (Vector3 v in m.uv) {
  39. sb.Append (string.Format ("vt {0} {1} \n", v.x, v.y));
  40. }
  41.  
  42. for (int material = 0; material < m.subMeshCount; material++) {
  43. sb.Append ("\n");
  44. int[] triangles = m.GetTriangles (material);
  45. for (int i = 0; i < triangles.Length; i += 3) {
  46. sb.Append (string.Format ("f {1}/{1}/{1} {0}/{0}/{0} {2}/{2}/{2}\n", triangles [i] + 1 + vertexOffset, triangles [i + 1] + 1 + normalOffset, triangles [i + 2] + 1 + uvOffset));
  47. }
  48. }
  49.  
  50. vertexOffset += m.vertices.Length;
  51. normalOffset += m.normals.Length;
  52. uvOffset += m.uv.Length;
  53.  
  54. return sb.ToString ();
  55. }
  56.  
  57. private static void MeshesToFile(MeshFilter[] mf, string folder, string filename)
  58. {
  59. vertexOffset = 0;
  60. normalOffset = 0;
  61. uvOffset = 0;
  62. List<string> meshList = new List<string> ();
  63. using(StreamWriter sw = new StreamWriter (folder + "/" + filename + ".obj")){//创建一个obj文件
  64. for (int i = 0; i < mf.Length; i++) {
  65. sw.Write (MeshToString (mf [i], meshList));//往obj文件中写入数据,即生成模型
  66. }
  67. }
  68. }
  69. //创建文件夹
  70. private static bool CreateTargetFolder()
  71. {
  72. try {
  73. System.IO.Directory.CreateDirectory (targetFolder);//已经创建文件夹时不会再创建
  74. } catch {
  75. return false;
  76. }
  77. return true;
  78. }
  79.  
  80. [MenuItem("Custom/Export OBJ")]
  81. static void ExportOBJ()
  82. {
  83. if (!CreateTargetFolder ())
  84. return;
  85.  
  86. Transform[] selection = Selection.GetTransforms (SelectionMode.Editable | SelectionMode.ExcludePrefab);
  87.  
  88. if (selection== null) {
  89. EditorUtility.DisplayDialog ("未选中", "请选择模型!", "确定");
  90. return;
  91. }
  92.  
  93. int exportedObjects = 0;
  94.  
  95. for (int i = 0; i < selection.Length; i++) {
  96. Component[] meshfilter = selection [i].GetComponentsInChildren<MeshFilter> ();
  97.  
  98. MeshFilter[] mf = new MeshFilter[meshfilter.Length];
  99.  
  100. for (int m = 0; m < meshfilter.Length; m++) {
  101. exportedObjects++;
  102. mf [m] = (MeshFilter)meshfilter [m];
  103. }
  104.  
  105. MeshesToFile (mf, targetFolder, selection [i].name + "_" + i);
  106. }
  107.  
  108. if (exportedObjects > 0) {
  109. EditorUtility.DisplayDialog ("成功", "已输出!", "确定");
  110. } else
  111. EditorUtility.DisplayDialog ("失败", "未输出!", "确定");
  112. }
  113.  
  114. }

  

LittleTools之网格输出为模型的更多相关文章

  1. [ThinkPHP] 输出、模型的使用

    # # ThinkPHP 3.1.2 输出和模型使用 # 讲师:赵桐正 微博:http://weibo.com/zhaotongzheng   本节课大纲: 一.ThinkPHP 3 的输出      ...

  2. thinkPHP模板的输出和模型的使用

    a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休要修改配置文件中的配置项 'TMPL_L_DELIM' ...

  3. ThinkPHP 3.1.2 输出和模型使用 配置项等 - 2

    一.ThinkPHP 3 的输出      (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休 ...

  4. 懒人福利:Xcode插件将JSON格式化输出为模型的属性->ESJsonFormat-Xcode

    这是一个直接将json数据转换为模型数据的插件,只需要在控制台输入json数据,就可以在模型文件的.h文件中生成对应的模型数据 对于模型套模型的数据也做了处理,比较方便. 有需要的人可以尝试一下,但不 ...

  5. ThinkPHP的输出和模型使用

    1.假设在v层需要输出一个变量怎么办呢?即如同在html当中输出php代码. 可以直接使用{$name}代替.花括号被称之为标识符.可以通过修改配置项('TMPL_L_DELIM'=>'< ...

  6. 使用GridSearchCV进行网格搜索微调模型

    import numpy as np import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer f ...

  7. 机器学习之路:python 网格搜索 并行搜索 GridSearchCV 模型检验方法

    git:https://github.com/linyi0604/MachineLearning 如何确定一个模型应该使用哪种参数? k折交叉验证: 将样本分成k份 每次取其中一份做测试数据 其他做训 ...

  8. Assimp场景模型输出Collada,STL,3DPDF

    本文介绍开源库模型的几种输出格式:DAE,STL,3DPDF. Assimp是C++写的,AssimpNet是C#重构其中主要数据结构,并开通Assimp中重要方法的调用接口,为不熟悉C++的码农带来 ...

  9. mfix中输出DEM颗粒的固相速度到网格

    基于mfix-19.1.2版本 方法一:直接输出差值网格固相速度 注:这种方式只适用于garg 2012颗粒差值格式在DEM中,默认是无法输出固相速度的网格值的: 但是通过搜索des文件夹下V_s关键 ...

随机推荐

  1. linux系统下的shell脚本

    #!/bin/bash  说明我需要启用bin目录下的bash解释器解释脚本##将第一个文件拷贝到第二个文件,如果出错将错误输出到/dev/null 的空.if判断cp的返回值是否为1,1为成功,0为 ...

  2. MVC去掉传参时的验证:从客户端中检测到有潜在危险的Request.QueryString值

    解决方法:给Action添加属性[ValidateInput(false)]. 例: [ValidateInput(false)] public ActionResult Index(string o ...

  3. Collection和Collections的区别

    Collection 是集合类的上级接口,继承它的接口主要有set和list.Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作.

  4. 解决win8找不到没有AppData文件夹

    现象:今天打开win8,由于是从xp直接过渡到win8,所以想寻找类似于AppData的文件夹.但是在user/用户名/下面木有. 解决:这是个隐藏文件,和xp一样,取消隐藏文件夹即可看到. 然后就可 ...

  5. 第三章—Windows程序

    这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以 ...

  6. PHP漏洞全解(八)-HTTP响应拆分

    本文主要介绍针对PHP网站HTTP响应拆分,站在攻击者的角度,为你演示HTTP响应拆分. HTTP请求的格式 1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.ph ...

  7. 引擎渲染速度测试--我js代码写得少你不要骗我

    上一张图,很多人都看过的 地址:http://aui.github.io/artTemplate/test/test-speed.html 这个地址是在看artTemplate的时候看到的,很早都看过 ...

  8. ASP.NET MVC中HttpContext, HttpContextBase, HttpContextWrapper联系

    ttpContext HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试.HttpContext没有base class,并且不是virtual,所以不能 ...

  9. HDU 1400 (POJ 2411 ZOJ 1100)Mondriaan's Dream(DP + 状态压缩)

    Mondriaan's Dream Problem Description Squares and rectangles fascinated the famous Dutch painter Pie ...

  10. easyui源码翻译1.32--TimeSpinner(时间微调)

    前言 扩展自$.fn.spinner.defaults.使用$.fn.timespinner.defaults重写默认值对象.下载该插件翻译源码 时间微调组件的创建基于微调组件.它和数字微调类似,但是 ...