Unity鼠标点击删除Mesh中的三角面

来源:互联网 发布:adobe reader百度软件 编辑:程序博客网 时间:2024/05/21 14:46
Unity中模型通过Mesh来渲染,Mesh由顶点坐标vertices和三角形数组组成。废话不多说,直接上代码。
using UnityEngine;using System.Collections;using System.Collections.Generic;public class SelectObjects : MonoBehaviour{    void Update(){/**点选*/if(Input.GetMouseButtonDown (0)) {//点出鼠标左键//通过鼠标点击,摄像机从屏幕上一点发射出一条射线,此处的参数应为屏幕坐标Ray ray= Camera.main.ScreenPointToRay (Input.mousePosition);RaycastHit hit;//用来保存射线碰撞信息//射线投射if (Physics.Raycast (ray, out hit)) {if(hit.transform==null)//如果射线没有碰撞到Transform,return       return;   //获取hit.transform的MeshFilter组件MeshFilter meshFilter=hit.transform.GetComponent();if (meshFilter == null)return;//获取hit.transform的meshMesh mesh = meshFilter.mesh ;                            //取出mesh的顶点和三角形数组int[] triangles = mesh.triangles;            //new一个List将mesh的三角形数组拷贝来,方便删除修改            //将Array数组转换为ListList tris = new List (triangles);//hit.triangleIndex为射线碰撞到的三角面的索引,从0开始//三角面由三个顶点组成,//tris(hit.triangleIndex*3+2)为第triangleIndex个三角面的第三个顶点            //tris(hit.triangleIndex*3+2)为第triangleIndex个三角面的第二个顶点            //tris(hit.triangleIndex*3+2)为第triangleIndex个三角面的第一个顶点            tris.RemoveAt(hit.triangleIndex * 3 + 2);            tris.RemoveAt(hit.triangleIndex * 3 + 1);            tris.RemoveAt (hit.triangleIndex*3);            //将List转换为Array数组int[] newTri = tris.ToArray ();mesh.triangles = newTri;//更新三角面数组mesh.RecalculateNormals ();//更新法线mesh.RecalculateBounds ();//更新包围体            //获取MeshCollider组件,更新用于检测碰撞的sharedMesh            MeshCollider collider1 = hit.transform.GetComponent();            collider1.sharedMesh = mesh;            //检测碰撞必须给物体添加MeshCollider组件                        }}}}
原创粉丝点击