unity 导入STL格式模型(STL 文本ASCII码格式文件)
using System.Collections;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEngine;
public class ASCII : MonoBehaviour
{ private string _fileName = "";
private string _trianglescount = "";
private int _total;//三角形个数,_total*3即为三角形顶点个数
private int _number;
private BinaryReader _binaryReader;
private List<Vector3> _vertices;
private List<int> _triangles;
/// <summary>
/// 创建STL模型实例
/// </summary>
private void CreateInstance()
{
_vertices = new List<Vector3>();//存储三角形顶点坐标
_triangles = new List<int>();//存储三角形索引
int gameObjectCount = 60000;//代表一个物体中包含多少个点(Unity中单个Mesh顶点数量最多为65000个)
string fullPath = "E:\unity\project\test\Assets\STL\tui.stl";
StreamReader sr = new StreamReader(fullPath);
String line;
while ((line = sr.ReadLine()) != null)
{
string str = line.ToString().TrimStart();
if (str.Substring(0, 6) == "vertex")
{
string[] Vertex = new string[3] { "12", "12", "23" };
string[] strs = str.Split(new Char[] { ' ' }, 4);
str = str.Substring(strs[0].Length);
str = str.TrimStart();
strs = str.Split(new Char[] { ' ' }, 3);
Vertex[0] = strs[0];
//Console.WriteLine(Vertex[0]);
str = str.Substring(strs[0].Length);
str = str.TrimStart();
strs = str.Split(new Char[] { ' ' }, 2);
Vertex[1] = strs[0];
str = str.Substring(strs[0].Length);
str = str.TrimStart();
strs = str.Split(new Char[] { ' ' }, 1);
Vertex[2] = strs[0];
Vector3 vec1 = new Vector3(Convert.ToSingle(Vertex[0]), Convert.ToSingle(Vertex[1]), Convert.ToSingle(Vertex[2]));
_vertices.Add(vec1);
}
}
//将索引写入列表中,值为0到每个物体中顶点个数减一
for (int triNum = 0; triNum < _vertices.Count; triNum++)
{
int gameObhectIndex = triNum / gameObjectCount;//标记着当前正在给第几个物体赋值
_triangles.Add(triNum - gameObhectIndex * gameObjectCount);
}
for (int meshNumber = 0; meshNumber < _vertices.Count; meshNumber += gameObjectCount)
{
//创建GameObject
GameObject tem = new GameObject(Path.GetFileNameWithoutExtension(fullPath));
tem.name = meshNumber.ToString();
MeshFilter mf = tem.AddComponent<MeshFilter>();
MeshRenderer mr = tem.AddComponent<MeshRenderer>();
Mesh m = new Mesh();
mr.name = meshNumber.ToString();
if ((_vertices.Count - meshNumber) >= gameObjectCount)
{
m.vertices = _vertices.ToArray().Skip(meshNumber).Take(gameObjectCount).ToArray();
m.triangles = _triangles.ToArray().Skip(meshNumber).Take(gameObjectCount).ToArray();
}
else
{
m.vertices = _vertices.ToArray().Skip(meshNumber).Take(_vertices.Count - meshNumber).ToArray();
m.triangles = _triangles.ToArray().Skip(meshNumber).Take(_vertices.Count - meshNumber).ToArray();
}
m.RecalculateNormals();
mf.mesh = m;
mr.material = new Material(Shader.Find("Standard"));
}
}
// Start is called before the first frame update
void Start()
{
CreateInstance();
}
// Update is called once per frame
void Update()
{
}
}
usin