Unity绘制点云(untiy draw point cloud)

Posted 御雪妃舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<ParticleSystem>();

        // 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);
            
        
    


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

以上是关于Unity绘制点云(untiy draw point cloud)的主要内容,如果未能解决你的问题,请参考以下文章

Unity自定义Untiy天空

学习进度12

Unity 实现《物理画线》Draw Physics Line 总览

Untiy截图更新,及截取透明图片签字

Untiy3D性能优化实战记录

Untiy3D性能优化实战记录