using UnityEngine;

using System.Collections;

using System.IO;

using System.Collections.Generic;

using System.Globalization;

using UnityEngine.Networking;

using System;

using System.Threading;

using UnityEngine.UI;

public class ObjToUnityNO : MonoBehaviour

{

public Material red;

public Text []AAA;

public static ObjToUnityNO Ins_ObjToUnityNo;

private Mesh dq_mesh;

Vector3[] _vertexArray;

ArrayList _vertexArrayList = new ArrayList();

Vector3[] _normalArray;

ArrayList _normalArrayList = new ArrayList();

Vector2[] _uvArray;

ArrayList _uvArrayList = new ArrayList();

int[] _triangleArray;

ArrayList _facesVertNormUV = new ArrayList();

private void Start()

{

Ins_ObjToUnityNo = this;

}

public void meshas()

{

//调用创建Mesh方法

Draw_mesh(Application.persistentDataPath + "/Sphere_0.obj");//安卓路径(可以)

//Draw_mesh(Application.streamingAssetsPath + "/Cube_0.obj");//PC路径

}

public  void Draw_mesh(string Obj_Path)

{

//初始化mesh

GetComponent<MeshFilter>().mesh = dq_mesh = new Mesh();

dq_mesh.name = "Meshs";

//赋材质

//this.gameObject.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Diffuse"));

this.gameObject.GetComponent<MeshRenderer>().material = red;

//调用方法,获取点、面、法线

init_mesh(Obj_Path);

//点、面、法线赋值生成mesh

dq_mesh.vertices = _vertexArray;

dq_mesh.triangles = _triangleArray;

dq_mesh.normals = _normalArray;

}

void init_mesh(string Obj_Path)

{

if (File.Exists(Obj_Path))

{

//查找对应文件,加载读取

//UnityWebRequest uwr = UnityWebRequest.Get("file://" + Application.streamingAssetsPath + "/Cube_0.obj");

//UnityWebRequest uwr = UnityWebRequest.Get(Application.persistentDataPath + "/Cube_0.obj");

UnityWebRequest uwr = UnityWebRequest.Get("file://" + Obj_Path);

uwr.Send();

Thread.Sleep(2000);//时间等待

//yield return uwr.Send();或用协同程序形式

//分割读取的obj文件

if (uwr.isDone && string.IsNullOrEmpty(uwr.error))

{

string s = uwr.downloadHandler.text;

s = s.Replace("  ", " ");

s = s.Replace("  ", " ");

//调用方法,去分割好的string中找点、面、法线等,给相应的数组赋值

LoadFile(s);

}

else

{

Debug.Log("Don't DownLoad ");

}

}

}

public void LoadFile(string s)

{

string[] lines = s.Split("\n"[0]);

foreach (string item in lines)

{

//调用方法,去分割好的string中找点、面、法线等,给相应的数组赋值

ReadLine(item);

}

ArrayList tempArrayList = new ArrayList();

for (int i = 0; i < _facesVertNormUV.Count; ++i)

{

if (_facesVertNormUV[i] != null)

{

PlacesByIndex indextemp = new PlacesByIndex(i);

indextemp._places.Add(i);

for (int j = 0; j < _facesVertNormUV.Count; ++j)

{

if (_facesVertNormUV[j] != null)

{

if (i != j)

{

Vector3 iTemp = (Vector3)_facesVertNormUV[i];

Vector3 jTemp = (Vector3)_facesVertNormUV[j];

if (iTemp.x == jTemp.x && iTemp.y == jTemp.y)

{

indextemp._places.Add(j);

_facesVertNormUV[j] = null;

}

}

}

}

tempArrayList.Add(indextemp);

}

}

_vertexArray = new Vector3[tempArrayList.Count];

_uvArray = new Vector2[tempArrayList.Count];

_normalArray = new Vector3[tempArrayList.Count];

_triangleArray = new int[_facesVertNormUV.Count];

int teller = 0;

foreach (PlacesByIndex item in tempArrayList)

{

foreach (int item2 in item._places)

{

_triangleArray[item2] = teller;

}

Vector3 vTemp = (Vector3)_facesVertNormUV[item._index];

_vertexArray[teller] = (Vector3)_vertexArrayList[(int)vTemp.x - 1];

if (_uvArrayList.Count > 0)

{

Vector3 tVec = (Vector3)_uvArrayList[(int)vTemp.y - 1];

_uvArray[teller] = new Vector2(tVec.x, tVec.y);

}

if (_normalArrayList.Count > 0)

{

_normalArray[teller] = (Vector3)_normalArrayList[(int)vTemp.z - 1];

}

teller++;

}

}

//读文件内容

public void ReadLine(string s)

{

AAA[3].text = "ReadLine";

char[] charsToTrim = { ' ', '\n', '\t', '\r' };

s = s.TrimEnd(charsToTrim);

string[] words = s.Split(" "[0]);

foreach (string item in words)

item.Trim();

if (words[0] == "v")

_vertexArrayList.Add(new Vector3(System.Convert.ToSingle(words[1], CultureInfo.InvariantCulture), System.Convert.ToSingle(words[2], CultureInfo.InvariantCulture), System.Convert.ToSingle(words[3], CultureInfo.InvariantCulture)));

if (words[0] == "vn")

_normalArrayList.Add(new Vector3(System.Convert.ToSingle(words[1], CultureInfo.InvariantCulture), System.Convert.ToSingle(words[2], CultureInfo.InvariantCulture), System.Convert.ToSingle(words[3], CultureInfo.InvariantCulture)));

if (words[0] == "vt")

_uvArrayList.Add(new Vector3(System.Convert.ToSingle(words[1], CultureInfo.InvariantCulture), System.Convert.ToSingle(words[2], CultureInfo.InvariantCulture)));

if (words[0] == "f")

{

ArrayList temp = new ArrayList();

ArrayList triangleList = new ArrayList();

for (int j = 1; j < words.Length; ++j)

{

Vector3 indexVector = new Vector3(0, 0);

string[] indices = words[j].Split("/"[0]);

indexVector.x = System.Convert.ToInt32(indices[0], CultureInfo.InvariantCulture);

if (indices.Length > 1)

{

if (indices[1] != "")

indexVector.y = System.Convert.ToInt32(indices[1], CultureInfo.InvariantCulture);

}

if (indices.Length > 2)

{

if (indices[2] != "")

indexVector.z = System.Convert.ToInt32(indices[2], CultureInfo.InvariantCulture);

}

temp.Add(indexVector);

}

for (int i = 1; i < temp.Count - 1; ++i)

{

triangleList.Add(temp[0]);

triangleList.Add(temp[i]);

triangleList.Add(temp[i + 1]);

}

foreach (Vector3 item in triangleList)

{

_facesVertNormUV.Add(item);

}

}

}

}

internal class PlacesByIndex

{

public PlacesByIndex(int index)

{

_index = index;

}

public int _index;

public ArrayList _places = new ArrayList();

}

注:此脚本根据obj格式大神代码,根据自己需求,进行读取obj文件,添加数组,构建mesh,进行实例化,可在安卓和PC端实现功能,其他平台未尝试,obj文件不要太大,否则会造成unity卡死情况。如有雷同或更好的方案,可在评论区留言讨论.........

读取obj文件用Mesh创建实例化的更多相关文章

  1. [计算机图形学] OpenGL读取obj文件并显示其3D效果

     读取三维网格模型(Wavefront OBJ文件) 无法向立方体:cube.obj 有法向兔子模型:bunny.obj 有法向有纹理八字模型:Eight.obj OBJ文件的格式可参考:http: ...

  2. 软件光栅器实现(四、OBJ文件加载)

    本节介绍软件光栅器的OBJ和MTL文件加载,转载请注明出处. 在管线的应用程序阶段,我们需要设置光栅器所渲染的模型数据.这些模型数据包括模型顶点的坐标.纹理.法线和材质等等,可以由我们手动编写,也可以 ...

  3. 用eclipse做项目中常遇到的问题-如何创建并读取properties文件

    在用eclipse做项目开发的时候我们常常会将一些重要的内容写在配置文件里面, 特别是连接数据库的url,username,password等信息,我们常常会新建一个properties文件将所有信息 ...

  4. 在C#中创建和读取XML文件

    1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...

  5. 手工创建tomcat应用,以及实现js读取本地文件内容

    手工创建tomcat应用: 1.在webapps下面新建应用目录文件夹 2.在文件夹下创建或是从其他应用中复制:META-INF,WEB-INF这两个文件夹, 其中META-INF清空里面,WEB-I ...

  6. Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)

    首先,我们先来认识下CreateFile函数,它的原型如下   HANDLE CreateFile( LPCTSTR lpFileName,    //指向文件名的指针 DWORD dwDesired ...

  7. 使用univocity-parsers创建和读取csv文件

    import com.univocity.parsers.csv.CsvFormat;import com.univocity.parsers.csv.CsvParser;import com.uni ...

  8. C# -- 使用Aspose.Cells创建和读取Excel文件

    使用Aspose.Cells创建和读取Excel文件 1. 创建Excel Aspose.Cells.License li = new Aspose.Cells.License(); li.SetLi ...

  9. Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流

    /* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创 ...

随机推荐

  1. 安装并使用PICT,生成测试用例

    一.PICT简介 PICT工具是在微软公司内部使用的一款承兑组合的命令行生成工具,现在已经对外提供,可以在 http://download.microsoft.com/download/f/5/5/f ...

  2. 直接通过Response输出流写文件,浏览器表现为下载文件

    response.setContentType("application/x-download"); response.addHeader("Content-Dispos ...

  3. Android-Activity临时数据的保存

    Activity临时数据的保存是非常重要的,例如:一款小说APP应用,读者使用这款APP看到了223页,用户也没有去记看了多少页: 突然去接了个电话,或者开启的应用程序太多了,可能会导致这款APP应用 ...

  4. vs附加调试

    已解决.项目-属性-调试-启用调试器选择启用本机代码调试,不知道怎么的选成启用Visual Studio承载进程了.

  5. WebApi中跨域请求的解决方案和原理

    跨域请求仅发生在JavaScript发起Ajax请求时,浏览器对请求的限制,通常只允许访问同一个域中的资源,或者目标服务器明确的通知浏览器允许该域访问资源. 那么什么叫跨域的:主机地址或者ip地址或者 ...

  6. 写一个Singleton出来。

    单例模式是一种创建模式. 这种模式只涉及一个单独的类,它负责创建自己的对象. 该类确保只创建单个对象. 这个类提供了一种访问其唯一对象的方法. 例子: MainWindow类的构造函数是私有的,并且有 ...

  7. leetcode 18 4Sum JAVA

    题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出 ...

  8. Mac与iPhone的使用

    1.mac操作 苹果Mac操作系统下怎么显示隐藏文件(shift+cmmand+. ) Mac屏幕录制Gif Mac 键盘快捷键 Mac 上安装python3 2.iPhone操作 iPhone如何设 ...

  9. while 小项目练习

    # (1) 用双层while 写十行十列小星星 j = 0 while j < 10: #打印一行十个小星星 i = 0 while i <10: print("*", ...

  10. “全栈2019”Java第六十章:如何定义接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...