private static void WritePointsToFile(string filePath, ColorMesh mesh) { var indeces = mesh.GetTriangleIndexes(); var vertices = mesh.GetVertices(); var colors = mesh.GetColors(); int faces = indeces.Count / 3; string header = GetHeader(vertices.Count, faces); using (StreamWriter file = new StreamWriter(filePath)) { file.WriteLine(header); //header for (int i = 0; i < vertices.Count; i++) //vertices + colors { file.WriteLine(GetPointString(vertices[i], colors[i])); } for (int i = 0; i < faces; i++) { string baseIndex0 = (i * 3).ToString(CultureInfo.InvariantCulture); string baseIndex1 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture); string baseIndex2 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture); string faceString = "3 " + baseIndex0 + " " + baseIndex1 + " " + baseIndex2; file.WriteLine(faceString); } } }
[ExcludeFromCodeCoverage] //Cannot test this as it requires a Kinect ColorMesh which is dependent on the Kinect API: //you can't construct this yourself public static CVMesh ConvertToMesh(ColorMesh mesh) { CVMesh m = new CVMesh(); m.Colors.AddRange(mesh.GetColors()); m.Normals.AddRange(mesh.GetNormals()); m.TriangleIndeces.AddRange(mesh.GetTriangleIndexes()); m.Vertices.AddRange(mesh.GetVertices()); return(m); }
/// <summary> /// Save mesh in ASCII .PLY file with per-vertex color /// </summary> /// <param name="mesh">Calculated mesh object</param> /// <param name="writer">The text writer</param> /// <param name="flipAxes">Flag to determine whether the Y and Z values are flipped on save, /// default should be true.</param> /// <param name="outputColor">Set this true to write out the surface color to the file when it has been captured.</param> public static void SaveAsciiPlyMesh(ColorMesh mesh, TextWriter writer, bool flipAxes, bool outputColor) { if (null == mesh || null == writer) { return; } var vertices = mesh.GetVertices(); var indices = mesh.GetTriangleIndexes(); var colors = mesh.GetColors(); // Check mesh arguments if (0 == vertices.Count || 0 != vertices.Count % 3 || vertices.Count != indices.Count || (outputColor && vertices.Count != colors.Count)) { throw new ArgumentException(Properties.Resources.InvalidMeshArgument); } int faces = indices.Count / 3; // Write the PLY header lines writer.WriteLine("ply"); writer.WriteLine("format ascii 1.0"); writer.WriteLine("comment file created by Microsoft Kinect Fusion"); writer.WriteLine("element vertex " + vertices.Count.ToString(CultureInfo.InvariantCulture)); writer.WriteLine("property float x"); writer.WriteLine("property float y"); writer.WriteLine("property float z"); if (outputColor) { writer.WriteLine("property uchar red"); writer.WriteLine("property uchar green"); writer.WriteLine("property uchar blue"); } writer.WriteLine("element face " + faces.ToString(CultureInfo.InvariantCulture)); writer.WriteLine("property list uchar int vertex_index"); writer.WriteLine("end_header"); // Sequentially write the 3 vertices of the triangle, for each triangle for (int i = 0; i < vertices.Count; i++) { var vertex = vertices[i]; string vertexString = vertex.X.ToString(CultureInfo.InvariantCulture) + " "; if (flipAxes) { vertexString += (-vertex.Y).ToString(CultureInfo.InvariantCulture) + " " + (-vertex.Z).ToString(CultureInfo.InvariantCulture); } else { vertexString += vertex.Y.ToString(CultureInfo.InvariantCulture) + " " + vertex.Z.ToString(CultureInfo.InvariantCulture); } if (outputColor) { int red = (colors[i] >> 16) & 255; int green = (colors[i] >> 8) & 255; int blue = colors[i] & 255; vertexString += " " + red.ToString(CultureInfo.InvariantCulture) + " " + green.ToString(CultureInfo.InvariantCulture) + " " + blue.ToString(CultureInfo.InvariantCulture); } writer.WriteLine(vertexString); } // Sequentially write the 3 vertex indices of the triangle face, for each triangle, 0-referenced in PLY files for (int i = 0; i < faces; i++) { string baseIndex0 = (i * 3).ToString(CultureInfo.InvariantCulture); string baseIndex1 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture); string baseIndex2 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture); string faceString = "3 " + baseIndex0 + " " + baseIndex1 + " " + baseIndex2; writer.WriteLine(faceString); } }
/// <summary> /// Save mesh in ASCII .PLY file with per-vertex color /// </summary> /// <param name="mesh">Calculated mesh object</param> /// <param name="writer">The text writer</param> /// <param name="flipAxes">Flag to determine whether the Y and Z values are flipped on save, /// default should be true.</param> /// <param name="outputColor">Set this true to write out the surface color to the file when it has been captured.</param> public static void SaveAsciiPlyMesh(ColorMesh mesh, TextWriter writer, bool flipAxes, bool outputColor) { if (null == mesh || null == writer) { return; } var vertices = mesh.GetVertices(); var indices = mesh.GetTriangleIndexes(); var colors = mesh.GetColors(); // Check mesh arguments if (0 == vertices.Count || 0 != vertices.Count % 3 || vertices.Count != indices.Count || (outputColor && vertices.Count != colors.Count)) { throw new ArgumentException(); } int faces = indices.Count / 3; // Write the PLY header lines writer.WriteLine("ply"); writer.WriteLine("format ascii 1.0"); writer.WriteLine("comment file created by Microsoft Kinect Fusion"); writer.WriteLine("element vertex " + vertices.Count.ToString(CultureInfo.InvariantCulture)); writer.WriteLine("property float x"); writer.WriteLine("property float y"); writer.WriteLine("property float z"); if (outputColor) { writer.WriteLine("property uchar red"); writer.WriteLine("property uchar green"); writer.WriteLine("property uchar blue"); } writer.WriteLine("element face " + faces.ToString(CultureInfo.InvariantCulture)); writer.WriteLine("property list uchar int vertex_index"); writer.WriteLine("end_header"); // Sequentially write the 3 vertices of the triangle, for each triangle for (int i = 0; i < vertices.Count; i++) { var vertex = vertices[i]; string vertexString = vertex.X.ToString(CultureInfo.InvariantCulture) + " "; if (flipAxes) { vertexString += (-vertex.Y).ToString(CultureInfo.InvariantCulture) + " " + (-vertex.Z).ToString(CultureInfo.InvariantCulture); } else { vertexString += vertex.Y.ToString(CultureInfo.InvariantCulture) + " " + vertex.Z.ToString(CultureInfo.InvariantCulture); } if (outputColor) { int red = (colors[i] >> 16) & 255; int green = (colors[i] >> 8) & 255; int blue = colors[i] & 255; vertexString += " " + red.ToString(CultureInfo.InvariantCulture) + " " + green.ToString(CultureInfo.InvariantCulture) + " " + blue.ToString(CultureInfo.InvariantCulture); } writer.WriteLine(vertexString); } // Sequentially write the 3 vertex indices of the triangle face, for each triangle, 0-referenced in PLY files for (int i = 0; i < faces; i++) { string baseIndex0 = (i * 3).ToString(CultureInfo.InvariantCulture); string baseIndex1 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture); string baseIndex2 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture); string faceString = "3 " + baseIndex0 + " " + baseIndex1 + " " + baseIndex2; writer.WriteLine(faceString); } }
public void Update(IPluginIO pin, DX11RenderContext context) { if (!this.FTextureOutput[0].Contains(context)) { this.FTextureOutput[0][context] = new DX11DynamicTexture2D(context, this.width, this.height, SlimDX.DXGI.Format.R8G8B8A8_UNorm); this.FPCOut[0][context] = new DX11DynamicStructuredBuffer <float>(context, 640 * 480 * 6); } if (this.FInvalidate) { fixed(int *f = &this.pic[0]) { IntPtr ptr = new IntPtr(f); this.FTextureOutput[0][context].WriteData(ptr, this.width * this.height * 4); } /*fixed (float* f = &this.piccloud[0]) * {* * IntPtr ptr = new IntPtr(f);*/ DX11DynamicStructuredBuffer <float> db = (DX11DynamicStructuredBuffer <float>) this.FPCOut[0][context]; db.WriteData(this.piccloud); //} this.FInvalidate = false; } if (this.FInVoxels[0]) { if (this.FOutVoxels[0].Contains(context)) { this.FOutVoxels[0].Dispose(context); } short[] data = new short[this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ]; this.colorVolume.ExportVolumeBlock(0, 0, 0, this.VoxelResolutionX, this.VoxelResolutionY, this.VoxelResolutionZ, 1, data); DX11DynamicStructuredBuffer <int> b = new DX11DynamicStructuredBuffer <int>(context, this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ); int[] idata = new int[this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ]; for (int i = 0; i < this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ; i++) { idata[i] = data[i]; } b.WriteData(idata); this.FOutVoxels[0][context] = b; } if (this.FInExport[0]) { if (this.FGeomOut[0].Contains(context)) { this.FGeomOut[0].Dispose(context); } if (this.colorVolume != null) { ColorMesh m = this.colorVolume.CalculateMesh(this.FInGeomVoxelStep[0]); DX11IndexedGeometry geom = new DX11IndexedGeometry(context); ReadOnlyCollection <int> inds = m.GetTriangleIndexes(); DataStream ds = new DataStream(inds.Count * 4, true, true); ds.WriteRange <int>(inds.ToArray()); ds.Position = 0; DX11IndexBuffer ibo = new DX11IndexBuffer(context, ds, false, true); ReadOnlyCollection <Microsoft.Kinect.Toolkit.Fusion.Vector3> pos = m.GetVertices(); ReadOnlyCollection <Microsoft.Kinect.Toolkit.Fusion.Vector3> norm = m.GetNormals(); ReadOnlyCollection <int> col = m.GetColors(); DataStream dsv = new DataStream(Pos3Norm3Vertex.VertexSize * pos.Count, true, true); SlimDX.Vector3 bmin = new SlimDX.Vector3(float.MaxValue, float.MaxValue, float.MaxValue); SlimDX.Vector3 bmax = new SlimDX.Vector3(float.MinValue, float.MinValue, float.MinValue); for (int i = 0; i < pos.Count; i++) { Microsoft.Kinect.Toolkit.Fusion.Vector3 p = pos[i]; Microsoft.Kinect.Toolkit.Fusion.Vector3 n = norm[i]; dsv.Write <Microsoft.Kinect.Toolkit.Fusion.Vector3>(p); dsv.Write <Microsoft.Kinect.Toolkit.Fusion.Vector3>(n); dsv.Write <int>(col[i]); if (p.X < bmin.X) { bmin.X = p.X; } if (p.Y < bmin.Y) { bmin.Y = p.Y; } if (p.Z < bmin.Z) { bmin.Z = p.Z; } if (p.X > bmax.X) { bmax.X = p.X; } if (p.Y > bmax.Y) { bmax.Y = p.Y; } if (p.Z > bmax.Z) { bmax.Z = p.Z; } } geom.IndexBuffer = ibo; geom.HasBoundingBox = true; geom.InputLayout = FusionColoredVertex.Layout; geom.Topology = SlimDX.Direct3D11.PrimitiveTopology.TriangleList; geom.VertexSize = FusionColoredVertex.VertexSize; geom.VertexBuffer = BufferHelper.CreateVertexBuffer(context, dsv, false, true); geom.VerticesCount = pos.Count; geom.BoundingBox = new BoundingBox(bmin, bmax); this.FGeomOut[0][context] = geom; m.Dispose(); } } }