public static string ConvertToOBJFile(List<Triangle> triangles, string name = "TriangleMesh", bool removeDuplicateVertices = true)
{
List<Vector3> vertices = new List<Vector3>();
List<Vector2> uvs = new List<Vector2>();
List<int> indices = new List<int>();
foreach (var tri in triangles){
for (int i=0;i<3;i++){
vertices.Add(tri.points[i].ToVector3());
uvs.Add(tri.uvs[i].ToVector2());
indices.Add(indices.Count);
}
}
/*if (removeDuplicateVertices) {
List<KDTreeData> list = new List<KDTreeData>();
for (int i=0;i<vertices.Count;i++){
list.Add(new KDTreeData(i, vertices[i]));
}
List<Vector3> verticesNew = new List<Vector3>();
List<Vector2> uvsNew = new List<Vector2>();
List<int> indicesNew = new List<int>();
KDTreePoint kdTree = new KDTreePoint(list);
for (int i=0;i<vertices.Count;i++){
var possibleIntersections = kdTree.Intersect(vertices[i]);
bool isLowestIntersection = true;
if (possibleIntersections.Count==0){
Debug.LogError("Warning no intersection found");
}
KDTreeData lowest = possibleIntersections[0];
foreach (KDTreeData inters in possibleIntersections){
if (inters.index < lowest.index){
lowest = inters;
}
}
if (lowest.index == i){
// add new vertex
indicesNew.Add(verticesNew.Count);
// update reference
lowest.index = verticesNew.Count;
verticesNew.Add(vertices[i]);
uvsNew.Add(uvs[i]);
} else {
// add new vertex
indicesNew.Add(lowest.index);
}
}
vertices = verticesNew;
uvs = uvsNew;
indices = indicesNew;
}
*/
// export
System.Text.StringBuilder sb = new StringBuilder("# Custom geometry export (UNITY) OBJ File: '"+name+"'\n");
sb.Append("o ").Append(name).Append("\n");
foreach (var v in vertices){
sb.AppendFormat("v {0} {1} {2}\n", v.x,v.y,v.z);
}
foreach (var u in uvs){
sb.AppendFormat("vt {0} {1}\n", -u.x,u.y);
}
for (int i=0;i<indices.Count;i=i+3){
sb.AppendFormat("f {0}/{1} {2}/{3} {4}/{5}\n",
indices[0+i]+1, indices[0+i]+1,
indices[1+i]+1, indices[1+i]+1,
indices[2+i]+1, indices[2+i]+1);
}
return sb.ToString (); // "# Blender v2.76 (sub 0) OBJ File: ''\n# www.blender.org\nmtllib monkey.mtl\no Plane\nv -1.000000 0.000000 1.000000\nv 1.000000 0.000000 1.000000\nv -1.000000 0.000000 -1.000000\nv 1.000000 0.000000 -1.000000\nvn 0.000000 1.000000 0.000000\nusemtl None\ns off\nf 1//1 2//1 4//1 3//1\n"
}