Показать сообщение отдельно
Старый 14.08.2010, 13:51   #43
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сравнените Юнити и другие системы

Сообщение от .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();
    } 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием