我经常要在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. 懒人福利:Xcode插件将JSON格式化输出为模型的属性-&gt;ESJsonFormat-Xcode

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

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

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

  5. Unity3D脚印6——模型动画

    原地址:http://www.cnblogs.com/ybgame/archive/2013/02/21/2920009.html 如何导入一个模型,导入的模型在unity3d的project面板中是 ...

  6. (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(1)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选,其余章节将陆续放出.上一篇:Wow ...

  7. 深度神经网络(DNN)模型与前向传播算法

    深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础,而要理解DNN,首先我们要理解DNN模型,下面我们就对DNN的模型与前向传播算法做一个总结. 1. 从感知机 ...

  8. 循环神经网络(RNN)模型与前向反向传播算法

    在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Rec ...

  9. 使用sklearn进行数据挖掘-房价预测(6)—模型调优

    通过上一节的探索,我们会得到几个相对比较满意的模型,本节我们就对模型进行调优 网格搜索 列举出参数组合,直到找到比较满意的参数组合,这是一种调优方法,当然如果手动选择并一一进行实验这是一个十分繁琐的工 ...

随机推荐

  1. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  2. python3 不同目录间模块调用

    #Author by Andy #_*_ coding:utf-8 _*_ #__file__获取当前程序的相对路径 import os,sys #print(__file__) # os.path. ...

  3. css预处理语言的模块化实践

    编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋.对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...

  4. C#委托学习

    标签(空格分隔): C# 看Markdown效果支持的不大好. 买来<CLR Via C#>这本书很久了,一直也没有对其进行总结,看的非常凌乱,趁此机会好好总结一下,也算对C#学习的一个总 ...

  5. qq2440启动linux后插入u盘出现usb 1-1: device descriptor read/64, error -110,usb 1-1: device not accepting address 8, error -110

    上位机:ubuntu14.04 64bit 下位机:qq2440 交叉编译器:arm-linux-gcc 3.4.1 下位机使用的linux内核版本:kernel2.6.13 1.插入u盘时错误信息如 ...

  6. CentOS 7 编译安装 Code::Blocks

    CentOS 7 编译安装 Code::Blocks yum install cairo-devel yum install pango-devel yum install atk-devel yum ...

  7. [JQuery EasyUI系列]简介

    一.jQuery EasyUI是一个基于jQuery的框架,继承了各种用户界面插件. 二.jQuery EasyUI框架提供了创建网页所需的一切,可以轻松建立站点. easyui是一个基于jQuery ...

  8. centos chrome

    在centos6.X和redhat enterprise 中安装chrome,我找了很久都不行,今天终于找到了可以用下脚本那安装: #! /bin/bash # Google Chrome Insta ...

  9. &lt;Linux下FTP服务的搭建&gt;

    默认安装好ftp软件包匿名用户是可以下载的.匿名以后可以上传:anon_upload_enable=YES# getsebool -a | grep ftpallow_ftpd_anon_write ...

  10. MVC3+AutoFac实现程序集级别的依赖注入

    1.介绍      所谓程序集级别的依赖注入是指接口和实现的依赖不使用配置文件或硬代码实现(builder.RegisterType<UserInfoService>().As<IU ...