Я пытаюсь создать UVs @ runtime, я использую UV-типы BOX (аналогичные BOX UVW в 3ds max) и основываю свои вычисления на ориентации лица.УФ-развертка в оптимизации времени работы
Я знаю, что это не очень хороший вариант, чтобы создать его среды выполнения, но у меня нет выбора :(она сохраняется после расчета, так что я сделал это один раз.
НО я беру 40 секунд в течение 30000 Вершины ... слишком долго
есть ли оптимизация в моем коде, которые могут быть сделаны
Вот мой код не стесняйтесь использовать, если у вас есть < 5000 вершин сетки:.
public static void CreateUV(ref Mesh mesh)
{
int i = 0;
Vector3 p = Vector3.up;
Vector3 u = Vector3.Cross(p, Vector3.forward);
if (Vector3.Dot(u, u) < 0.001f)
{
u = Vector3.right;
}
else
{
u = Vector3.Normalize(u);
}
Vector3 v = Vector3.Normalize(Vector3.Cross(p, u));
Vector2[] uvs = new Vector2[mesh.vertices.Length];
for (i = 0; i < mesh.triangles.Length; i += 3)
{
Vector3 a = mesh.vertices[mesh.triangles[i]];
Vector3 b = mesh.vertices[mesh.triangles[i + 1]];
Vector3 c = mesh.vertices[mesh.triangles[i + 2]];
Vector3 side1 = b - a;
Vector3 side2 = c - a;
Vector3 N = Vector3.Cross(side1, side2);
N = new Vector3(Mathf.Abs(N.normalized.x), Mathf.Abs(N.normalized.y), Mathf.Abs(N.normalized.z));
if (N.x > N.y && N.x > N.z)
{
uvs[mesh.triangles[i]] = new Vector2(mesh.vertices[mesh.triangles[i]].z, mesh.vertices[mesh.triangles[i]].y);
uvs[mesh.triangles[i + 1]] = new Vector2(mesh.vertices[mesh.triangles[i + 1]].z, mesh.vertices[mesh.triangles[i + 1]].y);
uvs[mesh.triangles[i + 2]] = new Vector2(mesh.vertices[mesh.triangles[i + 2]].z, mesh.vertices[mesh.triangles[i + 2]].y);
}
else if (N.y > N.x && N.y > N.z)
{
uvs[mesh.triangles[i]] = new Vector2(mesh.vertices[mesh.triangles[i]].x, mesh.vertices[mesh.triangles[i]].z);
uvs[mesh.triangles[i + 1]] = new Vector2(mesh.vertices[mesh.triangles[i + 1]].x, mesh.vertices[mesh.triangles[i + 1]].z);
uvs[mesh.triangles[i + 2]] = new Vector2(mesh.vertices[mesh.triangles[i + 2]].x, mesh.vertices[mesh.triangles[i + 2]].z);
}
else if (N.z > N.x && N.z > N.y)
{
uvs[mesh.triangles[i]] = new Vector2(mesh.vertices[mesh.triangles[i]].x, mesh.vertices[mesh.triangles[i]].y);
uvs[mesh.triangles[i + 1]] = new Vector2(mesh.vertices[mesh.triangles[i + 1]].x, mesh.vertices[mesh.triangles[i + 1]].y);
uvs[mesh.triangles[i + 2]] = new Vector2(mesh.vertices[mesh.triangles[i + 2]].x, mesh.vertices[mesh.triangles[i + 2]].y);
}
}
mesh.uv = uvs;
Debug.Log("Finish");
}
Спасибо так кашицу !!!! –
mesh.vertices AND mesh.triangles - операции копирования !!! –