Сообщение от .Squid
Ой, и Юнити уже не такой простой, да?
|
А почему все должно быть просто
Вот пример удаления вершины из меша с одним материалом. Для нескольких материалов придется перебирать все индексные буферы. Плюс я забыл проверять на сущесвование массивов, и не учел бинормали, второй UV канал, цвета и может чего еще. Так же надо было проверить - входит ли индекс удаляемой вершины в промежуток между 0 и количеством вершин. Но как пример пойдет
Я скорее всего ошибся в расчетах при копировании частей массивов, но мне лень тестить
public static void DeleteMeshVertex(Mesh mesh, int vertex)
{
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
Vector2[] uv = mesh.uv;
Vector3[] normals = mesh.normals;
List<int> newTriangles = new List<int>();
// удаляем треугольники, содержащие вершину
for (int i = 0; i < triangles.Length; i+=3)
{
if ((triangles[i]!= vertex)&&
(triangles[i+1]!= vertex)&&
(triangles[i+2]!= vertex))
{
newTriangles.Add(triangles[i]);
newTriangles.Add(triangles[i+1]);
newTriangles.Add(triangles[i+1]);
}
}
// создаем новые буферы вершин, текстурных координат и нормалей
// исключив ненужную вершину из массивов
Vector3[] newVertices = new Vector3[vertices.Length-1];
Array.Copy(vertices, newVertices, vertex);
Array.Copy(vertices, vertex + 1, newVertices, vertex, vertices.Length - vertex - 1);
Vector2[] newUV = new Vector2[uv.Length - 1];
Array.Copy(uv, newUV, vertex);
Array.Copy(uv, vertex + 1, newUV, vertex, uv.Length - vertex - 1);
Vector3[] newNormals = new Vector3[normals.Length - 1];
Array.Copy(normals, newNormals, vertex);
Array.Copy(normals, vertex + 1, newNormals, vertex, normals.Length - vertex - 1);
// пересчитываем индексы
for (int i = 0; i < newTriangles.Count; i++)
{
if (newTriangles[i]>vertex)
{
newTriangles[i]--;
}
}
mesh.Clear();
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.normals = newNormals;
mesh.triangles = newTriangles.ToArray();
}