Unity3d Unity-如何使用网格三角形索引在单击时重新绘制三角形?

Unity3d Unity-如何使用网格三角形索引在单击时重新绘制三角形?,unity3d,Unity3d,我想知道当单击网格中的单个三角形时,如何将它们重新组合在一起。我下面的代码允许我检测3D空间中网格表面上的点击位置。从那里,我尝试从网格中获取三角形索引,并将颜色数组中的相应索引设置为红色 但是,我可以看到,我单击的位置(绿色立方体在图像中被转换到的位置)甚至不接近三角形在网格上重新着色的位置。是否需要进行某种索引或坐标转换,以便为光线投射/单击与网格碰撞的确切三角形着色 我正在为图像中的球体使用标准的未照亮着色器,有时会出现索引越界错误,这表明我在尝试将颜色设置为红色时超出了颜色数组的长度 任

我想知道当单击网格中的单个三角形时,如何将它们重新组合在一起。我下面的代码允许我检测3D空间中网格表面上的点击位置。从那里,我尝试从网格中获取三角形索引,并将颜色数组中的相应索引设置为红色

但是,我可以看到,我单击的位置(绿色立方体在图像中被转换到的位置)甚至不接近三角形在网格上重新着色的位置。是否需要进行某种索引或坐标转换,以便为光线投射/单击与网格碰撞的确切三角形着色

我正在为图像中的球体使用标准的未照亮着色器,有时会出现索引越界错误,这表明我在尝试将颜色设置为红色时超出了颜色数组的长度

任何对此的帮助或见解都将不胜感激。谢谢

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类MyRayDraw:单行为
{
公共游戏对象立方体;
私有网格渲染器;
网目;
向量3[]个顶点;
彩色[]彩色阵列;
私有void Start()
{
mesh=transform.GetComponent().mesh;
顶点=网格顶点;
//创建将在其中创建颜色的新颜色数组
colorArray=新颜色[顶点.长度];
对于(int k=0;k<顶点.长度;k++)
{
colorArray[k]=Color.white;
}
mesh.colors=colorArray;
}
无效更新()
{        
if(Input.GetMouseButtonDown(0))
{
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
if(物理光线投射(光线,外光线投射命中))
{
Log(hit.triangleIndex);
cube.transform.position=hit.point;
colorArray[hit.triangleIndex]=Color.red;
mesh.colors=colorArray;
}
其他的
{
Log(“无命中”);
}
}
}
}
顶点的颜色,而不是三角形的颜色

你要做的不是给一个顶点上色,而是给你碰到的三角形上色

数组是包含顶点数组索引的三角形列表。三角形数组的大小必须始终是3的倍数。只需索引到同一个顶点,即可共享顶点

在中,您可以找到如何为某个三角形索引获取相应顶点索引的示例

为了更好地理解这里,我留下一个立方体网格的例子

顶点是

INDEX | 3D-Position
0     | ( 0.5, -0.5,  0.5)
1     | (-0.5, -0.5,  0.5)
2     | ( 0.5,  0.5,  0.5)
3     | (-0.5,  0.5,  0.5)
4     | ( 0.5,  0.5, -0.5)
5     | (-0.5,  0.5, -0.5)
6     | ( 0.5, -0.5, -0.5)
7     | (-0.5, -0.5, -0.5)
8     | ( 0.5,  0.5,  0.5)
9     | (-0.5,  0.5,  0.5)
10    | ( 0.5,  0.5, -0.5)
11    | (-0.5,  0.5, -0.5)
12    | ( 0.5, -0.5, -0.5)
13    | ( 0.5, -0.5,  0.5)
14    | (-0.5, -0.5,  0.5)
15    | (-0.5, -0.5, -0.5)
16    | (-0.5, -0.5,  0.5)
17    | (-0.5,  0.5,  0.5)
18    | (-0.5,  0.5, -0.5)
19    | (-0.5, -0.5, -0.5)
20    | ( 0.5, -0.5, -0.5)
21    | ( 0.5,  0.5, -0.5)
22    | ( 0.5,  0.5,  0.5)
23    | ( 0.5, -0.5,  0.5)
引用从
0
23
的顶点索引的三角形列表如下所示

              (0, 2, 3, 0, 3, 1, 8, 4, 5, 8, 5, 9, 10, 6, 7, 10, 7, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23)

triangleIndex: 0        1        2        3        4         5          6           7           8           9           10          11
正如你所看到的,这是一个简单的列表。因此,为了从列表中删除某个三角形,首先必须使用
triangleIndex
跳过一定数量的顶点集,其中一个集合正好由3顶点索引组成

然后取三个连续的顶点索引,得到目标三角形的三个顶点

但是,对于球体,有
515
顶点,但有
2304
三角形!=>对于大多数
triangleIndex
来说,您通过尝试直接访问
mesh.Vertex[some index>511]
得到了一个
IndexOutOfRangeException

int[]三角形;
私有void Start()
{
...
三角形=网格。三角形;
}
私有void更新()
{
...
var vertIndex1=三角形[命中.triangleIndex*3+0];
var vertIndex2=三角形[hit.triangleIndex*3+1];
var vertIndex3=三角形[hit.triangleIndex*3+2];
colorArray[vert1]=Color.red;
colorArray[vert2]=Color.red;
colorArray[vert3]=Color.red;
mesh.colors=colorArray;
...
}

很好的解释,完全解决了我的问题-谢谢!