我经常要在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. 【Error listenerStart】 Error listenerStart Context [] startup failed due to previous errors

    发给 报错信息 八月 12, 2015 11:58:19 上午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandle ...

  2. Windows操作系统常用快捷键

    复制:ctrl+c       剪切:ctrl+x      粘贴:ctrl+v       全选:ctrl+a         撤消:ctrl+z      保存:ctrl+s 运行:win+r   ...

  3. vm安装ubuntu桥接模式无法联网

    桥接模式,就是和主机不同的ip,其他都是一样的. 编辑网络连接 查看自己机子的ip ipconfig 一般情况下是 ip 192.168.1.XXX 子网掩码 255.255.255.0 网关 192 ...

  4. @Transient注解

    以下两个包都包含@Transient注解 java.beans.Transient; javax.persistence.Transient; 使用@Transient时注意区别二者

  5. 静态分析安全测试(SAST)优缺点探析

    静态分析安全测试(SAST)是指不运行被测程序本身,仅通过分析或者检查源程序的语法.结构.过程.接口等来检查程序的正确性,那么采用静分析安全测试的方法有什么优缺点呢,且让小编给你说道说道. 许多公司都 ...

  6. Global中的事件执行顺序

    The Global.asax file, sometimes called the ASP.NET application file, provides a way to respond to ap ...

  7. c#中的delegate(委托)和event(事件)

    c#中的delegate(委托)和event(事件) 一.delegate是什么东西? 完全可以把delegate理解成C中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能 ...

  8. 快速排序法QuickSort

    /** * * @author Administrator * 功能:交换式排序之快速排序 */ package com.test1; import java.util.Calendar; publi ...

  9. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-005-以path parameters的形式给action传参数(value=“{}”、@PathVariable)

    一 1.以path parameters的形式给action传参数 @Test public void testSpittle() throws Exception { Spittle expecte ...

  10. Android TextView中的ellipsize属性

    TextView中有个ellipsize属性,作用是当文字过长时,该控件该如何显示,解释如下: android:ellipsize=”start”—–省略号显示在开头 android:ellipsiz ...