我试图在OpenTK中创建一个obj加载器,但它可以工作,但加载obj文件需要很长时间。这就是我所拥有的:
public async void LoadObj()
{
vertices = new List<Vector3>();
normals = new List<Vector3>();
texCoords = new List<Vector2>();
objVerticesIndexDictionary = new Dictionary<ObjVertex, int>();
objVertices = new List<ObjVertex>();
triangles = new List<ObjTriangle>();
quads = new List<ObjQuad>();
string result = "";
using (StreamReader fileRead = new StreamReader(path))
{
result = fileRead.ReadToEnd();
fileRead.Close();
}
string[] resultLines = result.Split('\n');
foreach (string line in resultLines)
{
Console.Write("...");
string[] parameters = line.Split(' ');
switch (parameters[0])
{
case "p": // Point
break;
case "v": // Vertex
float x = float.Parse(parameters[1]);
float y = float.Parse(parameters[2]);
float z = float.Parse(parameters[3]);
vertices.Add(new Vector3(x, y, z));
break;
case "vt": // TexCoord
float u = float.Parse(parameters[1]);
float v = float.Parse(parameters[2]);
texCoords.Add(new Vector2(u, v));
break;
case "vn": // Normal
float nx = float.Parse(parameters[1]);
float ny = float.Parse(parameters[2]);
float nz = float.Parse(parameters[3]);
normals.Add(new Vector3(nx, ny, nz));
break;
case "f":
switch (parameters.Length)
{
case 4:
ObjTriangle objTriangle = new ObjTriangle();
objTriangle.Index0 = ParseFaceParameter(parameters[1]);
objTriangle.Index1 = ParseFaceParameter(parameters[2]);
objTriangle.Index2 = ParseFaceParameter(parameters[3]);
triangles.Add(objTriangle);
break;
case 5:
ObjQuad objQuad = new ObjQuad();
objQuad.Index0 = ParseFaceParameter(parameters[1]);
objQuad.Index1 = ParseFaceParameter(parameters[2]);
objQuad.Index2 = ParseFaceParameter(parameters[3]);
objQuad.Index3 = ParseFaceParameter(parameters[4]);
quads.Add(objQuad);
break;
}
break;
}
}
}
如您所见,LoadObj()
将读取指定的obj文件并为每一行运行一个开关。不知道这个系统有多高效,我还在学习C#。加载obj文件有更快更有效的方法吗?谢谢。