阅读背景:

unity 导入STL格式模型(STL 文本ASCII码格式文件)_亦 又的博客

来源:互联网 

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



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: