Unity绘制点云(二)(untiy draw point cloud)

上一篇中主要都是静态的点云,这篇简单说下动态的点云
实际上就是拿到的数据点是动态的,绘制要实时刷新,mesh我就不推荐了
这里说说粒子的就好

先看下效果

这里模拟了一个动态的点,实际以动态点的位置为准,然后实时刷新绘制就可以了
代码如下:

using UnityEngine;
using System.Collections;
using System.IO;

public class DrawParticlePoint : MonoBehaviour
{

    ParticleSystem particleSystem;                  // 整个粒子系统
    int pointCount;                                 // 粒子数目

    ArrayList list = new ArrayList();
    ArrayList dynamicList = new ArrayList();
    // Use this for initialization
    void Start()
    {
        particleSystem = GetComponent();

        // 1. 读取数据
        list = ReadFile();

        dynamicList = list;

        //2.粒子显示
        DrawPointCloud(list);

    }

    private void FixedUpdate()
    {
        DynamicPoint();
        DrawPointCloud(dynamicList);
    }

    ArrayList ReadFile()
    {
        // 提前将点云存成csv文件放在Assert/StreamingAssets文件夹下,文本的每行代表一个点,由点的x,y,z
        //csv文件存储数据,用逗号分隔,比较容易读取处理
        string path = (Application.streamingAssetsPath + "/" + "elephant.csv");
        FileInfo fInfo = new FileInfo(path);

        string s = "";
        StreamReader r;
        ArrayList vecList = new ArrayList();

        if (fInfo.Exists)
        {
            r = new StreamReader(path);
        }
        else
        {
            Debug.Log("文件不存在");
            return null;
        }
        // 点云数据存入队列
        while ((s = r.ReadLine()) != null)
        {
            string[] words = s.Split(","[0]);

            Vector3 xyz = new Vector3(float.Parse(words[0]), -float.Parse(words[1]), float.Parse(words[2])) * 10;
            vecList.Add(xyz);
        }

        return vecList;
    }

    ParticleSystem.Particle[] allParticles;         // 所有粒子的集合
    void DrawPointCloud(ArrayList drawList)
    {
        var main = particleSystem.main;
        main.startSpeed = 0.0f;                           // 设置粒子的初始速度为0
        main.startLifetime = 1000.0f;

        var pointCount = drawList.Count;
        allParticles = new ParticleSystem.Particle[pointCount];
        main.maxParticles = pointCount;
        particleSystem.Emit(pointCount);
        particleSystem.GetParticles(allParticles);
        for (int i = 0; i < pointCount; i++)
        {
            allParticles[i].position = (Vector3)drawList[i];    // 设置每个点的位置
            //allParticles[i].startColor = Color.yellow;    // 设置每个点的rgb
            allParticles[i].startSize = 0.05f;
        }

        particleSystem.SetParticles(allParticles, pointCount);      // 将点云载入粒子系统
    }


    void DynamicPoint()
    {
        for (int i = 0; i < dynamicList.Count; i++)
        {
            if (i % 4 == 0)
            {
                dynamicList[i] = (Vector3)dynamicList[i] - new Vector3(0.01f, 0, 0);
            }
            else if (i % 4 == 1)
            {
                dynamicList[i] = (Vector3)dynamicList[i] + new Vector3(0, 0.01f, 0);
            }
            else if (i % 4 == 2)
            {
                dynamicList[i] = (Vector3)dynamicList[i] + new Vector3(0.01f, 0, 0);
            }
            else if (i % 4 == 3)
            {
                dynamicList[i] = (Vector3)dynamicList[i] - new Vector3(0, 0.01f, 0);
            }
        }
    }
}

就这样就可以了,这个就不贴资源了,在上篇中简单改下就好了

你可能感兴趣的:(Unity3d)