private static ObjModel OrganizeModels(ObjModel model) { ObjModel result = new ObjModel(); result.positionList = model.positionList; result.normalList.AddRange(model.normalList); bool hasUV = model.uvList.Count > 0; if (hasUV) { result.uvList.AddRange(model.uvList); } for (int i = 0; i < model.innerFaceList.Count; i++) { var face = model.innerFaceList[i]; var tuple = new Tuple <int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position); result.faceList.Add(tuple); if (face.vertex0.normal > 0) { result.normalList[face.vertex0.position - 1] = model.normalList[face.vertex0.normal - 1]; } if (face.vertex1.normal > 0) { result.normalList[face.vertex1.position - 1] = model.normalList[face.vertex1.normal - 1]; } if (face.vertex2.normal > 0) { result.normalList[face.vertex2.position - 1] = model.normalList[face.vertex2.normal - 1]; } if (hasUV) { if (face.vertex0.uv > 0) { result.uvList[face.vertex0.position - 1] = model.uvList[face.vertex0.uv - 1]; } if (face.vertex1.uv > 0) { result.uvList[face.vertex1.position - 1] = model.uvList[face.vertex1.uv - 1]; } if (face.vertex2.uv > 0) { result.uvList[face.vertex2.position - 1] = model.uvList[face.vertex2.uv - 1]; } } result.faceList.Add(new Tuple <int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position)); //result.faceList[i] = new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position); } //model.innerFaceList.Clear(); return(result); }
private static ObjModel OrganizeModels(ObjModel model) { ObjModel result = new ObjModel(); result.positionList = model.positionList; result.normalList.AddRange(model.normalList); bool hasUV = model.uvList.Count > 0; if (hasUV) { result.uvList.AddRange(model.uvList); } for (int i = 0; i < model.innerFaceList.Count; i++) { var face = model.innerFaceList[i]; var tuple = new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position); result.faceList.Add(tuple); if (face.vertex0.normal > 0) result.normalList[face.vertex0.position - 1] = model.normalList[face.vertex0.normal - 1]; if (face.vertex1.normal > 0) result.normalList[face.vertex1.position - 1] = model.normalList[face.vertex1.normal - 1]; if (face.vertex2.normal > 0) result.normalList[face.vertex2.position - 1] = model.normalList[face.vertex2.normal - 1]; if (hasUV) { if (face.vertex0.uv > 0) result.uvList[face.vertex0.position - 1] = model.uvList[face.vertex0.uv - 1]; if (face.vertex1.uv > 0) result.uvList[face.vertex1.position - 1] = model.uvList[face.vertex1.uv - 1]; if (face.vertex2.uv > 0) result.uvList[face.vertex2.position - 1] = model.uvList[face.vertex2.uv - 1]; } result.faceList.Add(new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position)); //result.faceList[i] = new Tuple<int, int, int>(face.vertex0.position, face.vertex1.position, face.vertex2.position); } //model.innerFaceList.Clear(); return result; }
private static void GenNormals(ObjModel model) { if (model.normalList.Count > 0) { return; } var faceNormals = new vec3[model.innerFaceList.Count]; model.normalList.AddRange(new vec3[model.positionList.Count]); for (int i = 0; i < model.innerFaceList.Count; i++) { var face = model.innerFaceList[i]; vec3 vertex0 = model.positionList[face.vertex0.position - 1]; vec3 vertex1 = model.positionList[face.vertex1.position - 1]; vec3 vertex2 = model.positionList[face.vertex2.position - 1]; vec3 v1 = vertex0 - vertex2; vec3 v2 = vertex2 - vertex1; faceNormals[i] = v1.cross(v2); } for (int i = 0; i < model.positionList.Count; i++) { vec3 sum = new vec3(); int shared = 0; for (int j = 0; j < model.innerFaceList.Count; j++) { var face = model.innerFaceList[j]; if (face.vertex0.position - 1 == i || face.vertex1.position - 1 == i || face.vertex2.position - 1 == i) { sum = sum + faceNormals[i]; shared++; } } if (shared > 0) { sum = (sum / shared).normalize(); } model.normalList[i] = sum; } }
private static void LoadModels(string filename, ObjFile file) { using (var sr = new StreamReader(filename)) { var model = new ObjModel(); while (!sr.EndOfStream) { string line = sr.ReadLine(); string[] parts = line.Split(separator, StringSplitOptions.RemoveEmptyEntries); if (parts[0] == ("v")) { if (model.innerFaceList.Count > 0) { file.models.Add(model); model = new ObjModel(); } vec3 position = new vec3(float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3])); model.positionList.Add(position); } else if (parts[0] == ("vt")) { vec2 uv = new vec2(float.Parse(parts[1]), float.Parse(parts[2])); model.uvList.Add(uv); } else if (parts[0] == ("vn")) { vec3 normal = new vec3(float.Parse(parts[1]), float.Parse(parts[2]), float.Parse(parts[3])); model.normalList.Add(normal); } else if (parts[0] == ("f")) { Triangle triangle = ParseFace(parts); model.innerFaceList.Add(triangle); } } file.models.Add(model); } }
public ObjModelElement(ObjModel objModel) { this.objModelAdapter = new ObjModelAdpater(objModel); }
private static void GenNormals(ObjModel model) { if (model.normalList.Count > 0) { return; } var faceNormals = new vec3[model.innerFaceList.Count]; model.normalList.AddRange(new vec3[model.positionList.Count]); for (int i = 0; i < model.innerFaceList.Count; i++) { var face = model.innerFaceList[i]; vec3 vertex0 = model.positionList[face.vertex0.position - 1]; vec3 vertex1 = model.positionList[face.vertex1.position - 1]; vec3 vertex2 = model.positionList[face.vertex2.position - 1]; vec3 v1 = vertex0 - vertex2; vec3 v2 = vertex2 - vertex1; faceNormals[i] = v1.cross(v2); } for (int i = 0; i < model.positionList.Count; i++) { vec3 sum = new vec3(); int shared = 0; for (int j = 0; j < model.innerFaceList.Count; j++) { var face = model.innerFaceList[j]; if (face.vertex0.position - 1 == i || face.vertex1.position - 1 == i || face.vertex2.position - 1 == i) { sum = sum + faceNormals[i]; shared++; } } if (shared > 0) { sum = sum / shared; sum.Normalize(); } model.normalList[i] = sum; } }