Показать сообщение отдельно
Старый 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 meshint vertex)
    {
        
Vector3[] vertices mesh.vertices;
        
int[] triangles mesh.triangles;
        
Vector2[] uv mesh.uv;
        
Vector3[] normals mesh.normals;

        List<
intnewTriangles = new List<int>();

        
// удаляем треугольники, содержащие вершину
        
for (int i 0triangles.Lengthi+=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(verticesnewVerticesvertex);
        Array.
Copy(verticesvertex 1newVerticesvertexvertices.Length vertex 1);

        
Vector2[] newUV = new Vector2[uv.Length 1];

        Array.
Copy(uvnewUVvertex);
        Array.
Copy(uvvertex 1newUVvertexuv.Length vertex 1);

        
Vector3[] newNormals = new Vector3[normals.Length 1];

        Array.
Copy(normalsnewNormalsvertex);
        Array.
Copy(normalsvertex 1newNormalsvertexnormals.Length vertex 1);


        
// пересчитываем индексы
        
for (int i 0newTriangles.Counti++)
        {
            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)
 
Ответить с цитированием