Unity3d中实现点云效果

有一段时间没写博客了,主要是最近实在太忙,学校的毕设,论文,公司的项目,感情的事儿都加在一块儿,嗨,做男人真累啊!!!

今天跟大家分享的是个人在实现效果时的一个小技巧,希望对有相关兴趣的童鞋有所帮助,关于点云在Unity里面的实现,我在Asset Store上查了一下,还真有一个叫做Point Cloud Viewer and Tooll的插件:


Unity3d中实现点云效果_第1张图片

当然是收费插件,看他的介绍是用DX11的特性写了shader然后才显示出点来,关于写Shader我一向都不在行,想学却一直抽不出时间,等把毕设做的差不多了再说吧。我并没有让亲们去花钱买这个插件,那也没必要写这篇博文了,下面是我们的另类的实现方案,测试了一下,30万个点有一点点的卡,不过整体效果还好。

下面介绍不适用DX11特性的实现方案:  Particle System! 就是粒子啦。。。

其实这也是受unity官方案例 Procedural Examples中一个场景的启发,用粒子发射器发射固定量的粒子,然后给每个粒子一个位置和颜色信息就OK了,开始的时候让particleEmitter.emit 为 false , 然后调用一个particleEmitter.Emit(int count)的函数,里面的count就是总共的粒子,也就是点云的点的数目了!

这是效果图:

Unity3d中实现点云效果_第2张图片

这里可以改变粒子的position, color, size等属性,基本上满足需求。在上代码之前要说明一下的是:传统的Ellipsoid Particle Emitter 加上 Particle Renderer 才能实现上面的效果,但是有一个粒子数量的限制,好像一万多,我在拿同学一个点云文件读取的时候只是显示了很少的一部分。后来经过反复的查找才发现是其本身粒子数目有限制。 而用了新版的particle system 就没有这个限制了, 唯一觉得有点儿不足的就是它有一个lifetime的属性,就是粒子的生命周期,如果想要一直显示就必须给一个很大的值。而老版的并没有这个问题。


代码是根据官方案例改的,没有版权问题吧

using UnityEngine;
using System.Collections;

public class HeightMapGenerator : MonoBehaviour {


	
	public Texture2D heightMap;
	public Material material;
	public Vector3 size =new Vector3(200, 30, 200);

	ParticleSystem.Particle[] allParticles;

	public Texture2D curTexture;

	// Use this for initialization
	void Start () {

		particleSystem.emissionRate = 0;


		GenerateHeightmap();
	}
	

	void GenerateHeightmap ()
	{
		// Create the game object containing the renderer
		gameObject.AddComponent();
		gameObject.AddComponent();
		if (material)
			renderer.material = material;
		else
			renderer.material.color = Color.white;
		
		// Retrieve a mesh instance
		Mesh mesh = GetComponent().mesh;
		
		int width = Mathf.Min(heightMap.width, 255);
		int height = Mathf.Min(heightMap.height, 255);
		int y = 0;
		int x = 0;
		
		// Build vertices and UVs
		Vector3[] vertices = new Vector3[height * width];

	

		Vector2[] uv = new Vector2[height * width];
		Vector4[] tangents = new Vector4[height * width];
		
		Vector2 uvScale =new Vector2 (1.0f / (width - 1), 1.0f / (height - 1));
		Vector3 sizeScale = new Vector3 (size.x / (width - 1), size.y, size.z / (height - 1));

		particleSystem.Emit(height * width);

		allParticles = new ParticleSystem.Particle[width * height];

		int count = particleSystem.GetParticles(allParticles);

		for (y=0;y

从代码容易看出,粒子的位置是根据一张灰度图读到的,颜色是用的是另一张图。就是这样的,希望有兴趣的童鞋可以相互交流哈,

QQ: 626222539


你可能感兴趣的:(PCL,Unity3D)