LittleTools之网格输出为模型
我经常要在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之网格输出为模型的更多相关文章
- [ThinkPHP] 输出、模型的使用
# # ThinkPHP 3.1.2 输出和模型使用 # 讲师:赵桐正 微博:http://weibo.com/zhaotongzheng 本节课大纲: 一.ThinkPHP 3 的输出 ...
- thinkPHP模板的输出和模型的使用
a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休要修改配置文件中的配置项 'TMPL_L_DELIM' ...
- ThinkPHP 3.1.2 输出和模型使用 配置项等 - 2
一.ThinkPHP 3 的输出 (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休 ...
- 懒人福利:Xcode插件将JSON格式化输出为模型的属性->ESJsonFormat-Xcode
这是一个直接将json数据转换为模型数据的插件,只需要在控制台输入json数据,就可以在模型文件的.h文件中生成对应的模型数据 对于模型套模型的数据也做了处理,比较方便. 有需要的人可以尝试一下,但不 ...
- ThinkPHP的输出和模型使用
1.假设在v层需要输出一个变量怎么办呢?即如同在html当中输出php代码. 可以直接使用{$name}代替.花括号被称之为标识符.可以通过修改配置项('TMPL_L_DELIM'=>'< ...
- 使用GridSearchCV进行网格搜索微调模型
import numpy as np import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer f ...
- 机器学习之路:python 网格搜索 并行搜索 GridSearchCV 模型检验方法
git:https://github.com/linyi0604/MachineLearning 如何确定一个模型应该使用哪种参数? k折交叉验证: 将样本分成k份 每次取其中一份做测试数据 其他做训 ...
- Assimp场景模型输出Collada,STL,3DPDF
本文介绍开源库模型的几种输出格式:DAE,STL,3DPDF. Assimp是C++写的,AssimpNet是C#重构其中主要数据结构,并开通Assimp中重要方法的调用接口,为不熟悉C++的码农带来 ...
- mfix中输出DEM颗粒的固相速度到网格
基于mfix-19.1.2版本 方法一:直接输出差值网格固相速度 注:这种方式只适用于garg 2012颗粒差值格式在DEM中,默认是无法输出固相速度的网格值的: 但是通过搜索des文件夹下V_s关键 ...
随机推荐
- linux系统下的shell脚本
#!/bin/bash 说明我需要启用bin目录下的bash解释器解释脚本##将第一个文件拷贝到第二个文件,如果出错将错误输出到/dev/null 的空.if判断cp的返回值是否为1,1为成功,0为 ...
- MVC去掉传参时的验证:从客户端中检测到有潜在危险的Request.QueryString值
解决方法:给Action添加属性[ValidateInput(false)]. 例: [ValidateInput(false)] public ActionResult Index(string o ...
- Collection和Collections的区别
Collection 是集合类的上级接口,继承它的接口主要有set和list.Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作.
- 解决win8找不到没有AppData文件夹
现象:今天打开win8,由于是从xp直接过渡到win8,所以想寻找类似于AppData的文件夹.但是在user/用户名/下面木有. 解决:这是个隐藏文件,和xp一样,取消隐藏文件夹即可看到. 然后就可 ...
- 第三章—Windows程序
这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以 ...
- PHP漏洞全解(八)-HTTP响应拆分
本文主要介绍针对PHP网站HTTP响应拆分,站在攻击者的角度,为你演示HTTP响应拆分. HTTP请求的格式 1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.ph ...
- 引擎渲染速度测试--我js代码写得少你不要骗我
上一张图,很多人都看过的 地址:http://aui.github.io/artTemplate/test/test-speed.html 这个地址是在看artTemplate的时候看到的,很早都看过 ...
- ASP.NET MVC中HttpContext, HttpContextBase, HttpContextWrapper联系
ttpContext HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试.HttpContext没有base class,并且不是virtual,所以不能 ...
- HDU 1400 (POJ 2411 ZOJ 1100)Mondriaan's Dream(DP + 状态压缩)
Mondriaan's Dream Problem Description Squares and rectangles fascinated the famous Dutch painter Pie ...
- easyui源码翻译1.32--TimeSpinner(时间微调)
前言 扩展自$.fn.spinner.defaults.使用$.fn.timespinner.defaults重写默认值对象.下载该插件翻译源码 时间微调组件的创建基于微调组件.它和数字微调类似,但是 ...