根据顶点和索引计算uv和normals
话不多说直接上代码
/// <summary>
/// 得到法向量和UV数组
/// </summary>
/// <param name="vertices"></param>
/// <returns></returns>
private Vector3[] GetNormalsAndUvs(List<Vector3> vertices, List<int> triangles, out Vector2[] uvs)
{
int count = vertices.Count;
Vector3[] normals = new Vector3[count];
uvs = new Vector2[count];
for (int i = 0, max = triangles.Count; i < max; i += 3)
{
int index1 = triangles[i];
int index2 = triangles[i + 1];
int index3 = triangles[i + 2];
Vector3 noraml = GetNormal(vertices[index1], vertices[index2], vertices[index3]);
normals[index1] = noraml;
normals[index2] = noraml;
normals[index3] = noraml;
if (Mathf.Abs(noraml.x) > Mathf.Abs(noraml.y) && Mathf.Abs(noraml.x) > Mathf.Abs(noraml.z))
{
uvs[index1] = new Vector2(vertices[index1].z, vertices[index1].y);
uvs[index2] = new Vector2(vertices[index2].z, vertices[index2].y);
uvs[index3] = new Vector2(vertices[index3].z, vertices[index3].y);
}
else if (Mathf.Abs(noraml.y) > Mathf.Abs(noraml.x) && Mathf.Abs(noraml.y) > Mathf.Abs(noraml.z))
{
uvs[index1] = new Vector2(vertices[index1].x, vertices[index1].z);
uvs[index2] = new Vector2(vertices[index2].x, vertices[index2].z);
uvs[index3] = new Vector2(vertices[index3].x, vertices[index3].z);
}
else
{
uvs[index1] = new Vector2(vertices[index1].x, vertices[index1].y);
uvs[index2] = new Vector2(vertices[index2].x, vertices[index2].y);
uvs[index3] = new Vector2(vertices[index3].x, vertices[index3].y);
}
}
return normals;
}
/// <summary>
/// 得到平面法向量(顺序点)
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="c"></param>
/// <returns></returns>
private Vector3 GetNormal(Vector3 a, Vector3 b, Vector3 c)
{
return Vector3.Cross(b - a, c - b).normalized;
}
效果如图