zoukankan      html  css  js  c++  java
  • unity 导出模型

    不论unity是否运行,到处其中的模型方法:

    1.如下图建立相关文件目录,并建立如下脚本

    2.脚本代码

    using UnityEngine;
    using UnityEditor;
    using System.Collections;
    using System.IO;
    using System.Text;
    
    public class ObjExporterScript
    {
        private static int StartIndex = 0;
    
        public static void Start()
        {
            StartIndex = 0;
        }
        public static void End()
        {
            StartIndex = 0;
        }
    
    
        public static string MeshToString(MeshFilter mf, Transform t)
        {
            Vector3 s = t.localScale;
            Vector3 p = t.localPosition;
            Quaternion r = t.localRotation;
    
    
            int numVertices = 0;
            Mesh m = mf.sharedMesh;
            if (!m)
            {
                return "####Error####";
            }
            Material[] mats = mf.GetComponent<Renderer>().sharedMaterials;
    
            StringBuilder sb = new StringBuilder();
    
            foreach (Vector3 vv in m.vertices)
            {
                Vector3 v = t.TransformPoint(vv);
                numVertices++;
                sb.Append(string.Format("v {0} {1} {2}
    ", v.x, v.y, -v.z));
            }
            sb.Append("
    ");
            foreach (Vector3 nn in m.normals)
            {
                Vector3 v = r * nn;
                sb.Append(string.Format("vn {0} {1} {2}
    ", -v.x, -v.y, v.z));
            }
            sb.Append("
    ");
            foreach (Vector3 v in m.uv)
            {
                sb.Append(string.Format("vt {0} {1}
    ", v.x, v.y));
            }
            for (int material = 0; material < m.subMeshCount; material++)
            {
                sb.Append("
    ");
                sb.Append("usemtl ").Append(mats[material].name).Append("
    ");
                sb.Append("usemap ").Append(mats[material].name).Append("
    ");
    
                int[] triangles = m.GetTriangles(material);
                for (int i = 0; i < triangles.Length; i += 3)
                {
                    sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}
    ",
                        triangles[i] + 1 + StartIndex, triangles[i + 1] + 1 + StartIndex, triangles[i + 2] + 1 + StartIndex));
                }
            }
    
            StartIndex += numVertices;
            return sb.ToString();
        }
    }
    
    public class ObjExporter : ScriptableObject
    {
        [MenuItem("File/Export/Wavefront OBJ")]
        static void DoExportWSubmeshes()
        {
            DoExport(true);
        }
    
        [MenuItem("File/Export/Wavefront OBJ (No Submeshes)")]
        static void DoExportWOSubmeshes()
        {
            DoExport(false);
        }
    
    
        static void DoExport(bool makeSubmeshes)
        {
            if (Selection.gameObjects.Length == 0)
            {
                Debug.Log("Didn't Export Any Meshes; Nothing was selected!");
                return;
            }
    
            string meshName = Selection.gameObjects[0].name;
            string fileName = EditorUtility.SaveFilePanel("Export .obj file", "", meshName, "obj");
    
            ObjExporterScript.Start();
    
            StringBuilder meshString = new StringBuilder();
    
            meshString.Append("#" + meshName + ".obj"
                                + "
    #" + System.DateTime.Now.ToLongDateString()
                                + "
    #" + System.DateTime.Now.ToLongTimeString()
                                + "
    #-------"
                                + "
    
    ");
    
            Transform t = Selection.gameObjects[0].transform;
    
            Vector3 originalPosition = t.position;
            t.position = Vector3.zero;
    
            if (!makeSubmeshes)
            {
                meshString.Append("g ").Append(t.name).Append("
    ");
            }
            meshString.Append(processTransform(t, makeSubmeshes));
    
            WriteToFile(meshString.ToString(), fileName);
    
            t.position = originalPosition;
    
            ObjExporterScript.End();
            Debug.Log("Exported Mesh: " + fileName);
        }
    
        static string processTransform(Transform t, bool makeSubmeshes)
        {
            StringBuilder meshString = new StringBuilder();
    
            meshString.Append("#" + t.name
                            + "
    #-------"
                            + "
    ");
    
            if (makeSubmeshes)
            {
                meshString.Append("g ").Append(t.name).Append("
    ");
            }
    
            MeshFilter mf = t.GetComponent<MeshFilter>();
            if (mf)
            {
                meshString.Append(ObjExporterScript.MeshToString(mf, t));
            }
    
            for (int i = 0; i < t.childCount; i++)
            {
                meshString.Append(processTransform(t.GetChild(i), makeSubmeshes));
            }
    
            return meshString.ToString();
        }
    
        static void WriteToFile(string s, string filename)
        {
            using (StreamWriter sw = new StreamWriter(filename))
            {
                sw.Write(s);
            }
        }
    }

    3.点击想要导出的模型,然后按file-export-Wavefront obj菜单选择导出即可

  • 相关阅读:
    【华为云技术分享】【测试微课堂】测试金字塔和持续自动化测试
    【华为云技术分享】【测试微课堂】典型测试设计方法介绍
    【华为云技术分享】测试微课堂 | 有的放矢制定测试计划
    【华为云技术分享】【测试微课堂】DevOps敏捷测试之道
    【华为云技术分享】使用CloudIDE快速体验基于华为云ModelArts SDK的AI开发
    【华为云技术分享】Linux内核发展史 (2)
    前端常见面试题
    网站上面的倒计时功能
    基本的排序算法
    微信支付配置文件WxPay.Config.php如何读取数据库配置信息
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/8258499.html
Copyright © 2011-2022 走看看