Например, из стандартных примитивов правильно красится только Cube, у остальных изменение цвета вершины отражается на соседних трианглах.
Из своих 3-х мешей правильно красится только 1, причем из-за ошибки импорта:
ImportFBX Errors:
Unsupported wedge mapping mode type. Please report this bug.
На других 2-х мешах та же ошибка. Но разница в том что у "неправильных" мешей кол-во вершин и трианглов совпадает с изначальным в модели. А вот у первого меша после импорта вместо 17 вершин целых 40.
Нашел ObjExporter, сохранил Cube и первый меш в файл. Выяснилось что у куба каждая вершина дублируется 3 раза, а у меша b01 некоторые даже 4 раза. То есть получается что эти меши не представляют из себя целое тело, а "склеены" из отдельных треугольников так, что каждая вершина используется только одним полигоном.
Сейчас пытаюсь сделать функцию для дублирования вершин:
Синтаксис:
Используется csharp
// дублируем вершины чтобы краска нормально легда
void DuplicateV()
{
Debug.Log("Duplicate vertices");
// старый меш
Mesh oldMesh = mf.sharedMesh;
int[] t = new int[oldMesh.triangles.Length];
int numT = oldMesh.triangles.Length/3;
int numV = oldMesh.triangles.Length; //2*oldMesh.vertices.Length;
// новый меш
Mesh newMesh = new Mesh();
newMesh.Clear();
newMesh.vertices = new Vector3[numV];
newMesh.triangles = new int[numV];
newMesh.uv = new Vector2[numV];
// формируем новый меш
int i, index, iv;
i = iv = 0;
while (i != numT) {
Debug.Log("i = "+i);
index = i*3;
newMesh.vertices[iv] = oldMesh.vertices[ oldMesh.triangles[index] ];
newMesh.triangles[index] = iv++;
newMesh.vertices[iv] = oldMesh.vertices[ oldMesh.triangles[index+1] ];
newMesh.triangles[index+1] = iv++;
newMesh.vertices[iv] = oldMesh.vertices[ oldMesh.triangles[index+2] ];
newMesh.triangles[index+2] = iv++;
++i;
}
newMesh.tangents = oldMesh.tangents;
//newMesh.normals = oldMesh.normals;
newMesh.RecalculateNormals();
newMesh.RecalculateBounds();
//newMesh.Optimize();
// записываем
mf.sharedMesh = newMesh;
}
void DuplicateV()
{
Debug.Log("Duplicate vertices");
// старый меш
Mesh oldMesh = mf.sharedMesh;
int[] t = new int[oldMesh.triangles.Length];
int numT = oldMesh.triangles.Length/3;
int numV = oldMesh.triangles.Length; //2*oldMesh.vertices.Length;
// новый меш
Mesh newMesh = new Mesh();
newMesh.Clear();
newMesh.vertices = new Vector3[numV];
newMesh.triangles = new int[numV];
newMesh.uv = new Vector2[numV];
// формируем новый меш
int i, index, iv;
i = iv = 0;
while (i != numT) {
Debug.Log("i = "+i);
index = i*3;
newMesh.vertices[iv] = oldMesh.vertices[ oldMesh.triangles[index] ];
newMesh.triangles[index] = iv++;
newMesh.vertices[iv] = oldMesh.vertices[ oldMesh.triangles[index+1] ];
newMesh.triangles[index+1] = iv++;
newMesh.vertices[iv] = oldMesh.vertices[ oldMesh.triangles[index+2] ];
newMesh.triangles[index+2] = iv++;
++i;
}
newMesh.tangents = oldMesh.tangents;
//newMesh.normals = oldMesh.normals;
newMesh.RecalculateNormals();
newMesh.RecalculateBounds();
//newMesh.Optimize();
// записываем
mf.sharedMesh = newMesh;
}
но не выходит. Меш все равно красится неправильно, а после сохранения меша в obj дублирующихся вершин нет. Надо как-то преобразовать меш, чтобы раскраска выполнялась правильно, а также написать функцию оптимизации, чтобы убирать дублирующиеся вершины с одинаковыми цветами.
В архиве 3 меша зданий (b01 раскрашивается правильно).
Немного позже выложу скрипт раскраски меша и напишу как им пользоваться, чтобы попробовать.
Unity 3.3.0f4