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

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
/// <summary>
/// 将“一个”选中的对象输出为obj格式
/// </summary>
public class EditorObjExporter : ScriptableObject
{
private static int vertexOffset = 0;
private static int normalOffset = 0;
private static int uvOffset = 0; private static string targetFolder = "Assets/ExportedObj";//文件路径,创建后需要打开路径才能看到刷新的模型 //核心代码,将网格转为能被obj读取的数据
private static string MeshToString(MeshFilter mf, List<string> meshList)
{
Mesh m = mf.sharedMesh;
StringBuilder sb = new StringBuilder ();
sb.Append ("g").Append (mf.name).Append ("\n");
foreach (Vector3 lv in m.vertices) {
Vector3 wv = mf.transform.TransformPoint (lv); sb.Append (string.Format ("v {0} {1} {2} \n", -wv.x, wv.y, wv.z));
}
sb.Append ("\n"); foreach (Vector3 lv in m.normals) {
Vector3 wv = mf.transform.TransformDirection (lv); sb.Append (string.Format ("vn {0} {1} {2} \n", -wv.x, wv.y, wv.z));
}
sb.Append ("\n"); foreach (Vector3 v in m.uv) {
sb.Append (string.Format ("vt {0} {1} \n", v.x, v.y));
} for (int material = 0; material < m.subMeshCount; material++) {
sb.Append ("\n");
int[] triangles = m.GetTriangles (material);
for (int i = 0; i < triangles.Length; i += 3) {
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));
}
} vertexOffset += m.vertices.Length;
normalOffset += m.normals.Length;
uvOffset += m.uv.Length; return sb.ToString ();
} private static void MeshesToFile(MeshFilter[] mf, string folder, string filename)
{
vertexOffset = 0;
normalOffset = 0;
uvOffset = 0;
List<string> meshList = new List<string> ();
using(StreamWriter sw = new StreamWriter (folder + "/" + filename + ".obj")){//创建一个obj文件
for (int i = 0; i < mf.Length; i++) {
sw.Write (MeshToString (mf [i], meshList));//往obj文件中写入数据,即生成模型
}
}
}
//创建文件夹
private static bool CreateTargetFolder()
{
try {
System.IO.Directory.CreateDirectory (targetFolder);//已经创建文件夹时不会再创建
} catch {
return false;
}
return true;
} [MenuItem("Custom/Export OBJ")]
static void ExportOBJ()
{
if (!CreateTargetFolder ())
return; Transform[] selection = Selection.GetTransforms (SelectionMode.Editable | SelectionMode.ExcludePrefab); if (selection== null) {
EditorUtility.DisplayDialog ("未选中", "请选择模型!", "确定");
return;
} int exportedObjects = 0; for (int i = 0; i < selection.Length; i++) {
Component[] meshfilter = selection [i].GetComponentsInChildren<MeshFilter> (); MeshFilter[] mf = new MeshFilter[meshfilter.Length]; for (int m = 0; m < meshfilter.Length; m++) {
exportedObjects++;
mf [m] = (MeshFilter)meshfilter [m];
} MeshesToFile (mf, targetFolder, selection [i].name + "_" + i);
} if (exportedObjects > 0) {
EditorUtility.DisplayDialog ("成功", "已输出!", "确定");
} else
EditorUtility.DisplayDialog ("失败", "未输出!", "确定");
} }

  

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. EF 的 霸气配置

    通过EF 作为操作数据库的工具有一段时间了,也做了几个相对不大的项目,慢慢的也对EF的使用摸索出来了一些规则,虽然说不是技术难点,但是,我说的是但是,能够提高我们开发效率的棉花糖有时我们还是必须要吃的 ...

  2. c#画正弦波

    /// <summary> /// 画正弦曲线 /// </summary> /// <param name="sender"></par ...

  3. Nginx+uWSGI+bottle 在Linux上部署

    在/data/lujianxing/bottle 文件夹中创建三个文件: bottle.py bottle的源文件 a.py from bottle import Bottle, run mybott ...

  4. python zookeeper 学习笔记

    1.安装zookeeper 下载zookeeper后,解压,安装 cd zookeeper-/src/c ./configure make make install 2.启动zookeeper服务 c ...

  5. C语言中的指针学习(小黑板)

    指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结. 欢迎批阅. (1)指针的含义指针的本质也是数据类型,它是指向地址的变量.例如: { int a = 10; ...

  6. C++函数转换成C#函数

            ///                        /// </param>         /// <returns></returns>    ...

  7. Elasticsearch基础概念理解

    熟悉ES中的几个关键概念: 节点(Node):一个elasticsearch运行的实例,其实就是一个java进程.一般情况下,一台机器运行在一台机器上. 集群(Cluster): 好几个有相同集群名称 ...

  8. SVN服务器使用(一)

    源代码版本控制软件很多,像VSS,SVN还有其他的软件,各有优缺点.Subversion是优秀的版本控制工具,下面主要介绍这个软件的使用. Subversion下载地址: http://subvers ...

  9. Citect:How do I translate Citect error messages?

    http://www.opcsupport.com/link/portal/4164/4590/ArticleFolder/51/Citect   To decode the error messag ...

  10. 对于数组使用sizeof(a)和使用sizeof(a[0])

    #include "stdafx.h" #include <iostream> using namespace std; int main() { ]={}; cout ...