您的位置:首页 > 编程语言 > C#

c# 点云效果

2016-04-20 11:50 495 查看


using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class MESHRENDER : MonoBehaviour {

//显示网格使用
public GameObject gaModelMain = null;
private Mesh mesh = null;
private Vector3[] vertices;
private int[] triangles;
private int[] indexBuffer;
private Vector3[] lines;
private int nBaseVers = 65000;
private GameObject gaTrigers;
private int nMaxTriger = 0;
private int  nYuShu = 0;
private Transform[] tro;
// Use this for initialization
void Start () {
fnLineInit ();
}

// Update is called once per frame
void Updat
4000
e () {

}
#region 绘制点状网格初始化
void fnLineInit()
{
if (!gaModelMain)
return;

//获取该物体下面的子物体
int tempCountChild = gaModelMain.transform.childCount;
tro = new Transform[tempCountChild];
for(int k = 0;k<tempCountChild;k ++){
tro[k] = gaModelMain.transform.GetChild(k);
}

//创建总物体
gaTrigers = GameObject.CreatePrimitive(PrimitiveType.Cube);
//放在摄像机可以看见的层次
gaTrigers.layer = 9;
gaTrigers.name = "Control_LineAll";
gaTrigers.transform.position = new Vector3(0, 0, 0);
gaTrigers.transform.rotation = new Quaternion(0, 0, 0, 0);
//删除材质
Destroy(gaTrigers.renderer);
//删除碰撞
Destroy(gaTrigers.collider);
//删除网格
Destroy(gaTrigers.GetComponent<MeshFilter>());

//多个子物体的情况
for (int j = 0; j < tro.Length; j++)
{
//多个物体的情况下要去掉父物体
if (tro[j].name == gaModelMain.name && tro.Length > 1)
continue;
//创建总物体
GameObject gaTrigers2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
//放在摄像机可以看见的层次
gaTrigers2.layer = 9;
gaTrigers2.name = tro[j].name;
//删除材质
Destroy(gaTrigers2.renderer);
//删除碰撞
Destroy(gaTrigers2.collider);
//删除网格
Destroy(gaTrigers2.GetComponent<MeshFilter>());

mesh = tro[j].GetComponent<MeshFilter>().sharedMesh;
vertices = mesh.vertices;
triangles = mesh.triangles;
lines = new Vector3[triangles.Length];
for (int t = 0; t < triangles.Length; t++)
{
lines[t] = (vertices[triangles[t]]);
}

//获得子物体数量
nMaxTriger = lines.Length / nBaseVers + 1;
//获得余数
nYuShu = lines.Length % nBaseVers;

//开始给子物体附加材质球
for (int i = 0; i < nMaxTriger; i++)
{
GameObject objTemp = GameObject.CreatePrimitive(PrimitiveType.Cube);
objTemp.name = "line_child";
objTemp.layer = 9;
objTemp.transform.position = new Vector3(0, 0, 0);
objTemp.transform.rotation = new Quaternion(0, 0, 0, 0);
//objTemp.renderer.enabled = false;

Mesh GeneratedMesh = new Mesh();

//考虑模型的面数小于基本面数
if (nMaxTriger == 1)
GeneratedMesh.vertices = lines;
//大于基本面数 同时不是最后一位
else if (i < (nMaxTriger - 1))
{
Vector3[] vTemp = new Vector3[nBaseVers];
for (int k = 0; k < nBaseVers; k++)
{
vTemp[k] = lines[k + nBaseVers * i];
}
GeneratedMesh.vertices = vTemp;
}
//最后一位考虑余数
else if (i == (nMaxTriger - 1))
{
Vector3[] vTemp = new Vector3[nYuShu];
for (int k = 0; k < nYuShu; k++)
{
vTemp[k] = lines[k + nBaseVers * i];
}
GeneratedMesh.vertices = vTemp;
}

GeneratedMesh.name = "Generated Wireframe";

int LinesLength = GeneratedMesh.vertices.Length;

indexBuffer = new int[LinesLength];

Vector2[] uvs2 = new Vector2[LinesLength];

Vector3[] normals2 = new Vector3[LinesLength];

for (var m = 0; m < LinesLength; m++)
{
indexBuffer[m] = m;
uvs2[m] = new Vector2(0.0f, 1.0f); // 设置一个假的UV UV (FAST)
normals2[m] = new Vector3(1, 1, 1);// 设置一个假的法线 (Normal)
}
GeneratedMesh.uv = uvs2;
GeneratedMesh.normals = normals2;
GeneratedMesh.SetIndices(indexBuffer, MeshTopology.Points, 0);
objTemp.GetComponent<MeshFilter>().mesh = GeneratedMesh;
objTemp.transform.parent = gaTrigers2.transform;
}
//需要保存局部坐标
if (tro.Length > 1)
{
gaTrigers2.transform.position = tro[j].localPosition;
gaTrigers2.transform.rotation = tro[j].localRotation;
}
else
{
//gaTrigers2.transform.position = tro[j].position;
}
gaTrigers2.transform.localScale = tro[j].localScale;
gaTrigers2.transform.parent = gaTrigers.transform;
}

//将子物体装入父物体然后移动位置
gaTrigers.transform.position = gaModelMain.transform.position;
gaTrigers.transform.rotation = gaModelMain.transform.rotation;

// gaTrigers.SetActive(false);

#endregion

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: