Unity3d Unity-单击网格时如何设置单个面的颜色?

Unity3d Unity-单击网格时如何设置单个面的颜色?,unity3d,Unity3d,昨天,堆栈溢出上的其他人帮助我确定,它工作得很好,唯一的问题是重新着色的3个顶点在三角形之间共享。这会导致颜色看起来有点模糊。我真的希望有一种方法可以只给一张脸涂上颜色(如果你愿意的话,也可以涂上正常的颜色) 我已将以下脚本附加到我的网格,该网格使用光线投射来确定曲面坐标并在那里平移绿色立方体。下面的gif将更好地说明这个问题 再一次,我们将非常感谢您对这方面的任何帮助或见解。谢谢 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 公共类

昨天,堆栈溢出上的其他人帮助我确定,它工作得很好,唯一的问题是重新着色的3个顶点在三角形之间共享。这会导致颜色看起来有点模糊。我真的希望有一种方法可以只给一张脸涂上颜色(如果你愿意的话,也可以涂上正常的颜色)

我已将以下脚本附加到我的网格,该网格使用光线投射来确定曲面坐标并在那里平移绿色立方体。下面的gif将更好地说明这个问题

再一次,我们将非常感谢您对这方面的任何帮助或见解。谢谢

使用系统集合;
使用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(物理光线投射(光线,外光线投射命中))
{
捕捉(点击);//移动绿色立方体
int[]三角形=网格三角形;
var vertIndex1=三角形[hit.triangleIndex*3+0];
var vertIndex2=三角形[hit.triangleIndex*3+1];
var vertIndex3=三角形[hit.triangleIndex*3+2];
colorArray[vertIndex1]=Color.red;
colorArray[vertIndex2]=Color.red;
colorArray[vertIndex3]=Color.red;
mesh.colors=colorArray;
}
其他的
{
Log(“无命中”);
}
}
}
}

正如您所说,问题在于三角形之间共享顶点,但着色始终基于顶点

解决方案的想法是:

  • 对于命中三角形的每个顶点,检查它是否被其他三角形使用
  • 如果是,请复制其位置以创建新的分离顶点
  • 更新三角形以使用新创建的顶点索引
  • (evtl.)使用
    重新计算三角形
    使三角形面向外部,而不必考虑所提供顶点的顺序
使用System.Linq;
使用UnityEngine;
公共类MyRayDraw:单行为
{
公共游戏对象立方体;
//最好参考Inspector中已有的内容
[SerializeField]专用MeshFilter MeshFilter;
[SerializeField]私有网格渲染器;
[SerializeField]专用MeshCollider MeshCollider;
私有网格(u-Mesh),;
私人空间
{
如果(!meshFilter)meshFilter=GetComponent();
如果(!meshRenderer)meshRenderer=GetComponent();
如果(!meshCollider)meshCollider=GetComponent();
_mesh=meshFilter.mesh;
//创建将在其中创建颜色的新颜色数组
var colors=新颜色[_mesh.vertices.Length];
对于(var k=0;k1)
{
添加(vert1Pos);
添加(新颜色());
Vert1索引=新顶点。计数-1;
}
如果(顶点2发生率>1)
{
添加(vert2Pos);
添加(新颜色());
vert2Index=新顶点。计数-1;
}
如果(顶点出现次数>1)
{
添加(vert3Pos);
添加(新颜色());
vert3Index=新