private void BuildFromFaces() { for (int i = 0; i < obj.FaceList.Count; i++) { ObjParser.Types.Face face = obj.FaceList[i]; if (face.VertexIndexList.Length == 3) // triangle face { triangles.Add(VertexIndexFromFaceElement(face, 0)); triangles.Add(VertexIndexFromFaceElement(face, 1)); triangles.Add(VertexIndexFromFaceElement(face, 2)); materialNames.Add(face.UseMtl); } if (face.VertexIndexList.Length == 4) // quad face { triangles.Add(VertexIndexFromFaceElement(face, 0)); triangles.Add(VertexIndexFromFaceElement(face, 1)); triangles.Add(VertexIndexFromFaceElement(face, 2)); materialNames.Add(face.UseMtl); triangles.Add(VertexIndexFromFaceElement(face, 0)); triangles.Add(VertexIndexFromFaceElement(face, 2)); triangles.Add(VertexIndexFromFaceElement(face, 3)); materialNames.Add(face.UseMtl); } } }
private List <ObjParser.Types.Face> ObjFacesOfListInt(int[] triangles) { List <ObjParser.Types.Face> faceList = new List <ObjParser.Types.Face>(); for (int i = 0; i < triangles.Length; i += 3) { ObjParser.Types.Face newFace = new ObjParser.Types.Face(); newFace.UseMtl = EscapeMaterialName(materialNames[i / 3]); newFace.VertexIndexList = new int[] { triangles[i] + 1, triangles[i + 1] + 1, triangles[i + 2] + 1 }; if (uvs != null) { newFace.TextureVertexIndexList = newFace.VertexIndexList; } else { newFace.TextureVertexIndexList = new int[0]; } faceList.Add(newFace); } return(faceList); }
private int VertexIndexFromFaceElement(ObjParser.Types.Face face, int elementIndex) { int faceVertexIndex = face.VertexIndexList[elementIndex]; int faceTextureVertexIndex = face.TextureVertexIndexList[elementIndex]; int vertexIndex; ObjParser.Types.Vertex vertex = obj.VertexList[faceVertexIndex - 1]; if (faceIndex.ContainsKey(faceVertexIndex, faceTextureVertexIndex)) { vertexIndex = faceIndex.VertexIndex(faceVertexIndex, faceTextureVertexIndex); } else { vertices.Add(new Vector3((float)vertex.X, (float)vertex.Y, (float)vertex.Z) + loadObjectOffset); if (faceTextureVertexIndex != 0) { ObjParser.Types.TextureVertex textureVertex = obj.TextureList[faceTextureVertexIndex - 1]; uvs.Add(new Vector2((float)textureVertex.X, (float)textureVertex.Y)); } vertexIndex = vertices.Count - 1; faceIndex.Add(faceVertexIndex, faceTextureVertexIndex, vertexIndex); } return(vertexIndex); }
public SyncMesh BuildMesh(Obj curObj) { SyncMesh syncmesh = new SyncMesh(new SyncId("MeshId_" + curObj.Name), "Mesh_" + curObj.Name); // Faceの定義に従う。無駄は多くなる syncmesh.SubMeshes = new List <SyncSubMesh>(); SyncSubMesh submesh = new SyncSubMesh(); for (int j = 0; j < curObj.FaceList.Count; j++) { ObjParser.Types.Face face = curObj.FaceList[j]; for (int i = 0; i < face.VertexIndexList.Length; i++) { //idx int vertexIdx = face.VertexIndexList[i] - 1; int uvIdx = face.TextureVertexIndexList[i] - 1; int normalIdx = face.NormalIndexList[i] - 1; //Console.WriteLine(string.Format("index[{0}] vert[{1}] uv[{2}] normal[{3}]",i, vertexIdx+1, uvIdx+1, normalIdx+1)); //ObjParser.Types.Vertex vertex = curObj.VertexList[vertexIdx]; //ObjParser.Types.TextureVertex uv = curObj.TextureList[uvIdx]; //ObjParser.Types.VertexNormal normal = curObj.VertexNormalList[normalIdx]; ObjParser.Types.Vertex vertex = obj.VertexList[vertexIdx]; ObjParser.Types.TextureVertex uv = obj.TextureList[uvIdx]; ObjParser.Types.VertexNormal normal = obj.VertexNormalList[normalIdx]; //頂点 // OpenGL->DirectX変換のため、Xは反転する syncmesh.Vertices.Add(new Vector3(vertex.X * -1.0f, vertex.Y, vertex.Z)); // 2021.5.26 X軸を反転 syncmesh.Uvs.Add(new Vector2(uv.X, uv.Y)); syncmesh.Normals.Add(new Vector3(normal.X * -1.0f, normal.Y, normal.Z)); // 2021.5.26 X軸を反転 //syncmesh.Normals.Add(new Vector3(0,0,1)); //Console.WriteLine(string.Format("vert={0}\t{1}\t{2}", (float)vertex.X, (float)vertex.Y, (float)vertex.Z)); //index //submesh.Triangles.Add(i + j * face.VertexIndexList.Length); // OpenGL->DirectX変換のため、逆順でセットする submesh.Triangles.Add((face.VertexIndexList.Length - 1 - i) + j * face.VertexIndexList.Length); } } syncmesh.SubMeshes.Add(submesh); return(syncmesh); }