【发布时间】:2019-08-09 15:42:28
【问题描述】:
昨天 Stack Overflow 上的其他人帮我确定了how to recolor a mesh triangle to red by clicking on it,它工作得很好,唯一的问题是重新着色的 3 个顶点在三角形之间共享。这导致颜色看起来相当模糊。我真的希望有一种方法可以只为一张脸着色(如果你愿意的话,也可以是正常的)。
我已将以下脚本附加到我的网格中,该脚本使用光线投射来确定表面坐标并在那里平移一个绿色立方体。下面的 gif 将更好地说明这个问题。
再次感谢任何对此的帮助或见解。谢谢!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyRayDraw : MonoBehaviour
{
public GameObject cube;
private MeshRenderer meshRenderer;
Mesh mesh;
Vector3[] vertices;
Color[] colorArray;
private void Start()
{
mesh = transform.GetComponent<MeshFilter>().mesh;
vertices = mesh.vertices;
colorArray = new Color[vertices.Length];
for (int k = 0; k < vertices.Length; k++)
{
colorArray[k] = Color.white;
}
mesh.colors = colorArray;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
Snap(hit.point); // Moves the green cube
int[] triangles = mesh.triangles;
var vertIndex1 = triangles[hit.triangleIndex * 3 + 0];
var vertIndex2 = triangles[hit.triangleIndex * 3 + 1];
var vertIndex3 = triangles[hit.triangleIndex * 3 + 2];
colorArray[vertIndex1] = Color.red;
colorArray[vertIndex2] = Color.red;
colorArray[vertIndex3] = Color.red;
mesh.colors = colorArray;
}
else
{
Debug.Log("no hit");
}
}
}
}
【问题讨论】:
-
正如所说的着色是由顶点完成的,而不是三角形或面。唯一的解决方案是确保三角形不共享顶点......它可以工作,例如使用立方体图元,因为它使用网格,每个三角形都有单独的顶点..其他然后例如我们示例中的球体;)
-
您需要检查其他面(在这种情况下为 tris)是否引用相同的顶点。如果是这样,复制顶点以创建一个独立的面。否则相邻面将插入顶点颜色。
标签: unity3d