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
}
相关文章推荐
- C#-using用法详解
- C#-using用法详解
- C#追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件
- C# 打开和保存文件对话框
- C#学习点点滴滴 e.Handled的意思
- c#中的快捷键
- C#实现动态生成静态页面的类详解
- C# GET 和 SET作用
- C#界面设计之Ping服务器IP地址
- c#之线性表(单链表)实现(第四季)
- C#简易播放器(基于开源VLC)
- C# Directory操作
- 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML
- c# windows服务程序
- 关于WCF的InstanceContextMode,与会话相关
- C# RSA加密解密
- C#调用银联接口 posinf.dll方法调用
- c#控制台输入语句
- C# DataGridView 导出Excle代码和总结(转)
- C# Winform 遍历面板控件,写入XML