private void CreateFaceModels(IFCItem item, Vector3D center) { while (item != null) { if (item.ifcID != IntPtr.Zero && item.noVerticesForFaces != 0 && item.noPrimitivesForFaces != 0) { var positions = new List<Vector3>(); var normals = new List<Vector3>(); if (item.verticesForFaces != null) { for (int i = 0; i < item.noVerticesForFaces; i++) { var point = new Point3D(item.verticesForFaces[6 * i + 0] - center.X, item.verticesForFaces[6 * i + 1] - center.Y, item.verticesForFaces[6 * i + 2] - center.Z); var normal = new Vector3D(item.verticesForFaces[6 * i + 3], item.verticesForFaces[6 * i + 4], item.verticesForFaces[6 * i + 5]); positions.Add(new Vector3((float)point.X, (float)point.Y, (float)point.Z)); normals.Add(new Vector3((float)normal.X, (float)normal.Y, (float)normal.Z)); } Debug.Assert(item.verticesForFaces.Length == item.noVerticesForFaces * 6); } var indices = new Int32Collection(); if (item.indicesForFaces != null) { for (int i = 0; i < 3 * item.noPrimitivesForFaces; i++) { indices.Add(item.indicesForFaces[i]); } } List<Vector2> textureCoords = positions.Select(o => new Vector2(o.X, o.Y)).ToList(); var meshBuilder = new MeshBuilder(); meshBuilder.Append(positions, indices,normals,textureCoords); MeshGeometryModel3D mesh = new MeshGeometryModel3D() { Geometry = meshBuilder.ToMeshGeometry3D() }; item.Mesh3d = mesh; _meshToIfcItems[mesh] = item; #if DEBUG //OutputObj(item.ifcID.ToString(), mesh); #endif FillMeshByIfcColor(item); model.Add(mesh); } CreateFaceModels(item.child, center); item = item.next; } }