读取obj文件用Mesh创建实例化
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创建实例化的更多相关文章
- [计算机图形学] OpenGL读取obj文件并显示其3D效果
读取三维网格模型(Wavefront OBJ文件) 无法向立方体:cube.obj 有法向兔子模型:bunny.obj 有法向有纹理八字模型:Eight.obj OBJ文件的格式可参考:http: ...
- 软件光栅器实现(四、OBJ文件加载)
本节介绍软件光栅器的OBJ和MTL文件加载,转载请注明出处. 在管线的应用程序阶段,我们需要设置光栅器所渲染的模型数据.这些模型数据包括模型顶点的坐标.纹理.法线和材质等等,可以由我们手动编写,也可以 ...
- 用eclipse做项目中常遇到的问题-如何创建并读取properties文件
在用eclipse做项目开发的时候我们常常会将一些重要的内容写在配置文件里面, 特别是连接数据库的url,username,password等信息,我们常常会新建一个properties文件将所有信息 ...
- 在C#中创建和读取XML文件
1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...
- 手工创建tomcat应用,以及实现js读取本地文件内容
手工创建tomcat应用: 1.在webapps下面新建应用目录文件夹 2.在文件夹下创建或是从其他应用中复制:META-INF,WEB-INF这两个文件夹, 其中META-INF清空里面,WEB-I ...
- Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)
首先,我们先来认识下CreateFile函数,它的原型如下 HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名的指针 DWORD dwDesired ...
- 使用univocity-parsers创建和读取csv文件
import com.univocity.parsers.csv.CsvFormat;import com.univocity.parsers.csv.CsvParser;import com.uni ...
- C# -- 使用Aspose.Cells创建和读取Excel文件
使用Aspose.Cells创建和读取Excel文件 1. 创建Excel Aspose.Cells.License li = new Aspose.Cells.License(); li.SetLi ...
- Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流
/* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创 ...
随机推荐
- ubuntu 14.04常见问题
1. 改root密码 sudo passwd root 2. 显示登录框 sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 添加 ...
- a 标签 name 属性 页面定位 (一)
a(§b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
- VS中ashx文件关键字没有高亮标记的解决办法
VS --- 工具 --- 选项 --- 文本编辑器 --- 文件扩展名,只要在右侧添加 ashx ,选中MS-VS c# 保存后
- 【前端布局】px与rpx的简述
本文只以移动设备为例说明. 注意:设计师以iphone6为标准出设计稿的话,1rpx=0.5px=1物理像素.Photoshop里面量出来的尺寸为物理像素点.所以可以直接使用标注尺寸数据. [像素Pi ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- BZOJ 1878 hh的项链(简单莫队)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- 数据库架构设计的三种模式:share nothing , share everythong , share disk
数据库构架设计中主要有Shared Everthting.Shared Nothing.和Shared Disk: Shared Everthting:一般是针对单个主机,完全透明共享CPU/MEMO ...
- vmware开发包之vSphere Management SDK
vSphere Management SDK关于vmware管理等相关功能的.net和java的代码示例. 在其5.5的解压包中 eam:esx agent management表示esx虚机生产环境 ...
- zookeeper 开机启动
第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行,其中export JAVA_HOME=/usr/java/jdk1.8.0_112是 ...
- iis 部署webapi常见错误及解决方案
iis 部署webapi常见错误及解决方案 错误一: 原因:asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问, ...