Unity 中关于SubMesh的拾取问题
问题背景
最近在开发一个功能,钻孔功能,每一层(段)都需要单独拾取,显示不同的颜色,使用不同材质
问题分析
对于这个功能,由于上述需求,很容易想到用submesh实现,但是主要问题是在于对于Submesh的拾取,如何知道拾取到那一段?
解决方案:
通过Unity中自带的RaycastHit解决,里面的触碰的三角形索引,根据三角面判断所在Submesh。
上代码
获取钻孔Mesh
1 /// <summary> 2 /// 获取gameobject的mesh 3 /// </summary> 4 /// <param name="gameobject">目标物体</param> 5 /// <returns></returns> 6 private Mesh GetMesh(GameObject gameobject) 7 { 8 if (gameobject) 9 { 10 MeshFilter meshFilter = gameobject.GetComponent<MeshFilter>(); 11 if (meshFilter) 12 { 13 Mesh mesh = meshFilter.sharedMesh; 14 if (!mesh) { mesh = meshFilter.mesh; } 15 if (mesh) 16 { 17 return mesh; 18 } 19 } 20 } 21 return (Mesh)null; 22 }
获取拾取Submesh索引逻辑
1 /// <summary> 2 /// 获取拾取的submesh索引 3 /// </summary> 4 /// <param name="mesh"></param> 5 /// <returns></returns> 6 private int GetSubmeshIndex(Mesh mesh, RaycastHit hit) 7 { 8 int index = 0; 9 if (mesh) 10 { 11 int[] hittedTriangle = new int[] 12 { 13 mesh.triangles[hit.triangleIndex * 3], 14 mesh.triangles[hit.triangleIndex * 3 + 1], 15 mesh.triangles[hit.triangleIndex * 3 + 2] 16 }; 17 for (int i = 0; i < mesh.subMeshCount; i++) 18 { 19 int[] subMeshTris = mesh.GetTriangles(i); 20 for (int j = 0; j < subMeshTris.Length; j += 3) 21 { 22 if (subMeshTris[j] == hittedTriangle[0] && 23 subMeshTris[j + 1] == hittedTriangle[1] && 24 subMeshTris[j + 2] == hittedTriangle[2]) 25 { 26 Debug.Log(string.Format("triangle index:{0} submesh index:{1} submesh triangle index:{2}", hit.triangleIndex, i, j / 3)); 27 } 28 } 29 } 30 } 31 return index; 32 }
就这样,欢迎指正。
欲戴王冠 必承其重