public static ModelMeshAndPositionNeighbors CreateModelFromMold(int ptDensity, Stream moldDataStream, Logger logger) { var createModelInfo = new CreateModelInfo { MoldData = moldDataStream, Minx = 1, Maxx = ptDensity, Miny = 1, Maxy = ptDensity, Minz = 1, Maxz = ptDensity }; logger.Log("Start model creation from mold points"); var ptsToPolygons = new PointsToPolygons(createModelInfo); var model = ptsToPolygons.Process(); logger.Log("End model creation from mold points."); if (moldDataStream != null) { moldDataStream.Close(); } var neighboringIndices = model == null? null : PaulBourkeSmoother.GetPositionNeighbors(model.Positions.Count, model.TriangleIndices); return(new ModelMeshAndPositionNeighbors { MeshGeometry = model, PositionNeighbors = neighboringIndices }); }
public void TestNormals() { var mdlReader = new MdlFilePolygonDataReader(_inputPath + @"\flowerpetals.mdl"); var triangles = Triangle.GetTrianglesFromPts(mdlReader.Points); var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); Assert.AreEqual(0, meshGeometryModel.Normals.Count); XamlWriter.SaveMeshGeometryModel(_outputPath + @"\ModelWithoutSetNormals.xaml", meshGeometryModel, Color.FromRgb(255, 255, 0)); NormalCalculator.SetNormalsForModel(meshGeometryModel); Assert.AreEqual(meshGeometryModel.Positions.Count, meshGeometryModel.Normals.Count); XamlWriter.SaveMeshGeometryModel(_outputPath + @"\ModelWithSetNormals.xaml", meshGeometryModel, Color.FromRgb(255, 255, 0)); var normalModelPts = new List <Point3D>(); for (var index = 0; index < meshGeometryModel.Normals.Count; index++) { var normal = meshGeometryModel.Normals[index]; var position = meshGeometryModel.Positions[index]; var p2 = new Point3D(position.X + normal.X, position.Y + normal.Y, position.Z + normal.Z); var lineModel = LineDisplayModel.GetLineModel(position, p2, .03); normalModelPts.AddRange(lineModel); } XamlWriter.WritePolygonsToXamlFile("", _outputPath + @"\NormalsAsLines.xaml", normalModelPts, false); }
public void SanityCheckForCreateMeshGeometry3DFromTriangles() { var mdlFileReader = new MdlFilePolygonDataReader(_inputPath + @"\flowerpetals.mdl"); var triangles = Triangle.GetTrianglesFromPts(mdlFileReader.Points); var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); Assert.AreEqual(triangles.Count * 3, meshGeometryModel.TriangleIndices.Count); //check each triangle for proper orientation for (var ctr = 0; ctr < meshGeometryModel.TriangleIndices.Count; ctr += 3) { var p0 = meshGeometryModel.Positions[meshGeometryModel.TriangleIndices[ctr]]; var p1 = meshGeometryModel.Positions[meshGeometryModel.TriangleIndices[ctr + 1]]; var p2 = meshGeometryModel.Positions[meshGeometryModel.TriangleIndices[ctr + 2]]; var v1P = p1 - p0; var v2P = p2 - p0; var v1 = new Vector3D(v1P.X, v1P.Y, v1P.Z); var v2 = new Vector3D(v2P.X, v2P.Y, v2P.Z); var crossVector = Vector3D.CrossProduct(v1, v2); Assert.IsFalse(Math.Round(crossVector.Length, 6) == 0.0, string.Format("Proper triangle cannot be formed at startind index {0} with the positions {1} {2} {3}", ctr, p0, p1, p2)); } }
public void TestNativeAmerican() { var camPos1 = new Point3D(0.000000, 0.000000, 1239.995361); var lookingAtPt1 = new Point3D(-0.810811, 0.000000, 0.000000); var image1 = (Bitmap)Image.FromFile(_inputPath + @"\native_american_front.jpg"); var frontTexImageInfo = new AddTexImageInfo { CameraLocation = camPos1, ImageBitmap = image1, LookingAt = lookingAtPt1 }; var camPos2 = new Point3D(-54.005825, 0.000000, -1238.818726); var lookingAtPt2 = new Point3D(0.810041, 0.000000, -0.035313); var image2 = (Bitmap)Image.FromFile(_inputPath + @"\native_american_back.jpg"); var backTexImageInfo = new AddTexImageInfo { CameraLocation = camPos2, ImageBitmap = image2, LookingAt = lookingAtPt2 }; var cameraRatio = Te(); var addTextureInfo = new AddTextureInfo { CameraRatio = cameraRatio, ImageInfos = new[] { frontTexImageInfo, backTexImageInfo } }; var mdlFilePath = _inputPath + @"\native_american.mdl"; var mdlReader = new MdlFilePolygonDataReader(mdlFilePath); var triangles = Triangle.GetTrianglesFromPts(mdlReader.Points);; var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); Assert.AreEqual(0, meshGeometryModel.Normals.Count); //make the model smoother var currentPositions = meshGeometryModel.Positions; var positionNeighbors = PaulBourkeSmoother.GetPositionNeighbors(currentPositions.Count, meshGeometryModel.TriangleIndices); for (var ctr = 1; ctr <= 4; ctr++) { var newPositions = PaulBourkeSmoother.GetSmoothenedPositions(currentPositions, meshGeometryModel.TriangleIndices, positionNeighbors); currentPositions = newPositions; } meshGeometryModel.Positions = currentPositions; var result = TextureProcessor.GenerateTexture(addTextureInfo, meshGeometryModel, _outputPath + @"\log.txt"); var textureImageName = _outputPath + @"\" + "native_american.bmp"; result.Bitmap.Save(textureImageName); meshGeometryModel.TextureCoordinates = result.TextureCoordinates; var geometryModel3D = new GeometryModel3D { Geometry = meshGeometryModel, Material = new DiffuseMaterial { Brush = new ImageBrush { ImageSource = new BitmapImage(new Uri(textureImageName, UriKind.Relative)), ViewportUnits = BrushMappingMode.Absolute } } }; XamlWriter.SaveGeometryModel3D(_outputPath + @"\native_american_ModelWithTexture.xaml", geometryModel3D); MdlToXamlConverter.SaveAsGeometryModel3D(mdlFilePath, _outputPath + @"\Orig_native_american_Model_WithTexture.xaml"); }
public void TestDinosaurModel() { var camPos1 = new Point3D(0.000000, 0.000000, 40.000000); var lookingAtPt1 = new Point3D(0.449719, 0.000000, 0.000000); var image1 = (Bitmap)Image.FromFile(_inputPath + @"\dinosaur_front.bmp"); var frontTexImageInfo = new AddTexImageInfo { CameraLocation = camPos1, ImageBitmap = image1, LookingAt = lookingAtPt1 }; var camPos2 = new Point3D(9.568636, 0.000000, -38.838657); var lookingAtPt2 = new Point3D(-0.436662, 0.000000, -0.107580); var image2 = (Bitmap)Image.FromFile(_inputPath + @"\dinosaur_back.bmp"); var backTexImageInfo = new AddTexImageInfo { CameraLocation = camPos2, ImageBitmap = image2, LookingAt = lookingAtPt2 }; var cameraRatio = new CameraRatio { XRangeAtInfinity = 30.000000, YRangeAtInfinity = 22.504684 }; var addTextureInfo = new AddTextureInfo { CameraRatio = cameraRatio, ImageInfos = new[] { frontTexImageInfo, backTexImageInfo } }; var models = XamlFormatModelReader.GetModelsFromFile(_inputPath + @"\dinosaur_with_normals.xaml"); var meshGeometryModel = (MeshGeometry3D)models[0].Geometry; //make the model smoother var currentPositions = meshGeometryModel.Positions; var positionNeighbors = PaulBourkeSmoother.GetPositionNeighbors(currentPositions.Count, meshGeometryModel.TriangleIndices); for (var ctr = 1; ctr <= 21; ctr++) { var newPositions = PaulBourkeSmoother.GetSmoothenedPositions(currentPositions, meshGeometryModel.TriangleIndices, positionNeighbors); currentPositions = newPositions; } meshGeometryModel.Positions = currentPositions; var result = TextureProcessor.GenerateTexture(addTextureInfo, meshGeometryModel, _outputPath + @"\log.txt"); var textureImageName = _outputPath + @"\" + "dinosaur_texture.bmp"; result.Bitmap.Save(textureImageName); meshGeometryModel.TextureCoordinates = result.TextureCoordinates; var geometryModel3D = new GeometryModel3D { Geometry = meshGeometryModel, Material = new DiffuseMaterial { Brush = new ImageBrush { ImageSource = new BitmapImage(new Uri(textureImageName, UriKind.Relative)), ViewportUnits = BrushMappingMode.Absolute } } }; XamlWriter.SaveGeometryModel3D(_outputPath + @"\ModelWithTexture.xaml", geometryModel3D); MdlToXamlConverter.SaveAsGeometryModel3D(_inputPath + @"\dinosaur.mdl", _outputPath + @"\Orig_dinosaur_Model_WithTexture.xaml"); }
public void TestCreateNormalWithTheDinosaurModel() { var mdlReader = new MdlFilePolygonDataReader(_inputPath + @"\dinosaur.mdl"); var triangles = Triangle.GetTrianglesFromPts(mdlReader.Points); var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); Assert.AreEqual(0, meshGeometryModel.Normals.Count); NormalCalculator.SetNormalsForModel(meshGeometryModel); Assert.AreEqual(meshGeometryModel.Positions.Count, meshGeometryModel.Normals.Count); XamlWriter.SaveMeshGeometryModel(_outputPath + @"\ModelWithSetNormals.xaml", meshGeometryModel, Color.FromRgb(255, 255, 0)); }
private static Point3DCollection GetSmoothenedPositions(Point3DCollection originalPositions, Int32Collection triangleIndexCollection, HashSet <int>[] positionNeighbors, int smootheningIterationCount) { var newPositions = originalPositions; for (var ctr = 1; ctr <= smootheningIterationCount; ctr++) { newPositions = PaulBourkeSmoother.GetSmoothenedPositions(newPositions, triangleIndexCollection, positionNeighbors); } return(newPositions); }
public static ModelMeshAndTexture CreateDefaultModel(CreateModelContract inputParams) { var logger = new Logger(inputParams.LogFilePath); Stream moldDataStream; ApplyImages(inputParams, out moldDataStream); var createModelInfo = new CreateModelInfo { MoldData = moldDataStream, Minx = 1, Maxx = inputParams.PtDensity, Miny = 1, Maxy = inputParams.PtDensity, Minz = 1, Maxz = inputParams.PtDensity }; logger.Log("Start model creation from mold points"); var ptsToPolygons = new PointsToPolygons(createModelInfo); var model = ptsToPolygons.Process(); logger.Log("End model creation from mold points."); if (moldDataStream != null) { moldDataStream.Close(); } if (inputParams.SmoothingIterationCount > 0) { logger.Log(string.Format("Start smoothening {0} times", inputParams.SmoothingIterationCount)); model.Positions = PaulBourkeSmoother.GetSmoothenedPositions(model.Positions, model.TriangleIndices, inputParams.SmoothingIterationCount); logger.Log("End smoothening."); } var addTextureInfo = GetAddTextureInfoForFrontAndBackImage(inputParams); var texture = TextureProcessor.GenerateTexture(addTextureInfo, model, inputParams.LogFilePath); logger.Log("Returning model mesh and texture"); if (texture != null) { model.TextureCoordinates = texture.TextureCoordinates; } return(new ModelMeshAndTexture { MeshGeometry = model, TextureBitmap = (texture == null? null : texture.Bitmap) }); }
public void TestMediumSizedModel() { var mdlFileReader = new MdlFilePolygonDataReader(_inputPath + @"\v.mdl"); var triangles = Triangle.GetTrianglesFromPts(mdlFileReader.Points); XamlWriter.WritePolygonsToXamlFile("", string.Format(@"{0}\InputModel.xaml", _outputPath), mdlFileReader.Points, false); var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); XamlWriter.SaveMeshGeometryModel(string.Format(@"{0}\InputModelMeshGeometry.xaml", _outputPath), meshGeometryModel, Color.FromRgb(100, 100, 100)); var smoothPositions = PaulBourkeSmoother.GetSmoothenedPositions(meshGeometryModel.Positions, meshGeometryModel.TriangleIndices, 6); XamlWriter.SavePositionsAndTriangleIndicesAsModel(string.Format(@"{0}\Smoothened_{1}_times.xaml", _outputPath, 6), smoothPositions, meshGeometryModel.TriangleIndices, Color.FromRgb(100, 100, 100)); }
public void TestGetSmoothenedPositions() { var mdlFileReader = new MdlFilePolygonDataReader(_inputPath + @"\flowerpetals.mdl"); var triangles = Triangle.GetTrianglesFromPts(mdlFileReader.Points); XamlWriter.WritePolygonsToXamlFile("", string.Format(@"{0}\InputModel.xaml", _outputPath), mdlFileReader.Points, false); var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); XamlWriter.SaveMeshGeometryModel(string.Format(@"{0}\InputModelMeshGeometry.xaml", _outputPath), meshGeometryModel, Color.FromRgb(100, 100, 100)); var currentPositions = meshGeometryModel.Positions; var positionNeighbors = PaulBourkeSmoother.GetPositionNeighbors(currentPositions.Count, meshGeometryModel.TriangleIndices); for (var ctr = 1; ctr <= 10; ctr++) { var newPositions = PaulBourkeSmoother.GetSmoothenedPositions(currentPositions, meshGeometryModel.TriangleIndices, positionNeighbors); XamlWriter.SavePositionsAndTriangleIndicesAsModel(string.Format(@"{0}\Smoothing_Iteration_{1}.xaml", _outputPath, ctr), newPositions, meshGeometryModel.TriangleIndices, Color.FromRgb(100, 100, 100)); currentPositions = newPositions; } }
public void TestWithABlankCube() { var camPos1 = new Point3D(0.000000, 0.000000, 1239.995361); var lookingAtPt1 = new Point3D(0.0, 0.000000, 0.000000); var image1 = (Bitmap)Image.FromFile(_inputPath + @"\native_american_front.jpg"); var frontTexImageInfo = new AddTexImageInfo { CameraLocation = camPos1, ImageBitmap = image1, LookingAt = lookingAtPt1 }; var camPos2 = new Point3D(0, 0.000000, -1238.818726); var lookingAtPt2 = new Point3D(0.0, 0.000000, 0); var image2 = (Bitmap)Image.FromFile(_inputPath + @"\native_american_back.jpg"); var backTexImageInfo = new AddTexImageInfo { CameraLocation = camPos2, ImageBitmap = image2, LookingAt = lookingAtPt2 }; var cameraRatio = new CameraRatio { XRangeAtInfinity = 2.0, YRangeAtInfinity = 2.0 }; var addTextureInfo = new AddTextureInfo { CameraRatio = cameraRatio, ImageInfos = new[] { frontTexImageInfo, backTexImageInfo } }; var points = PolygonsGetter.GetBoxPolygonsAroundAPoint(new Point3D(0, 0, 0), 20); var triangles = Triangle.GetTrianglesFromPts(points); var meshGeometryModel = PaulBourkeSmoother.CreateMeshGeometry3DFromTriangles(triangles); Assert.AreEqual(0, meshGeometryModel.Normals.Count); var result = TextureProcessor.GenerateTexture(addTextureInfo, meshGeometryModel, _outputPath + @"\log.txt"); var textureImageName = _outputPath + @"\" + "native_american.bmp"; result.Bitmap.Save(textureImageName); meshGeometryModel.TextureCoordinates = result.TextureCoordinates; XamlWriter.SaveMeshGeometryModel(_outputPath + @"\blank_cube_model_with_native_american_texture.xaml", meshGeometryModel, result.Bitmap); }
public void TestBatmanModelCreationWithSmootheningAndFrontBackTexture() { const string moldFilename = "batman.mld"; var moldFilePath = _inputFolderPath + @"\" + moldFilename; var createModelInfo = new CreateModelInfo { FilePath = moldFilePath, Minx = 1, Maxx = 296, Miny = 109, Maxy = 296, Minz = 1, Maxz = 296 }; var testobj = new PointsToPolygons(createModelInfo); var meshGeometry3D = testobj.Process(); Assert.AreEqual(42422 * 3, meshGeometry3D.TriangleIndices.Count); //smoothen the model five times meshGeometry3D.Positions = PaulBourkeSmoother.GetSmoothenedPositions(meshGeometry3D.Positions, meshGeometry3D.TriangleIndices, 5); //Add textures //SETCAMERAPARAMS_INFINITY 20.000000, 26.661116 //ADDFRONTBACKTEXTURE "C:\Documents and Settings\Vishal Kumar\Desktop\batman\capture_00003.jpg", 0.000000, 0.000000, 40.000000, -0.549542, 0.000000, 0.000000, //"C:\Documents and Settings\Vishal Kumar\Desktop\batman\capture_00031.jpg", 0.476956, 0.000000, -39.997158, 0.549503, 0.000000, 0.006553, "C:\Documents and Settings\Vishal Kumar\Desktop\batman\IBModelerFiles\modelfull.mdl" var camPos1 = new Point3D(0.000000, 0.000000, 40.000); var lookingAtPt1 = new Point3D(-0.549542, 0.000000, 0.000000); var image1 = (Bitmap)Image.FromFile(_inputFolderPath + @"\batmanfront.jpg"); var frontTexImageInfo = new AddTexImageInfo { CameraLocation = camPos1, ImageBitmap = image1, LookingAt = lookingAtPt1 }; var camPos2 = new Point3D(0.476956, 0.000000, -39.997158); var lookingAtPt2 = new Point3D(0.549503, 0.000000, 0.006553); var image2 = (Bitmap)Image.FromFile(_inputFolderPath + @"\batmanback.jpg"); var backTexImageInfo = new AddTexImageInfo { CameraLocation = camPos2, ImageBitmap = image2, LookingAt = lookingAtPt2 }; var cameraRatio = new CameraRatio { XRangeAtInfinity = 26.661116, YRangeAtInfinity = 20.000000 }; var addTextureInfo = new AddTextureInfo { BackImageInfo = backTexImageInfo, CameraRatio = cameraRatio, FrontImageInfo = frontTexImageInfo }; var result = TextureProcessor.GetModelWithFrontAndBackTexture(addTextureInfo, meshGeometry3D); var textureImageName = _outputFolderPath + @"\" + "batman.bmp"; result.BitmapTextureImg.Save(textureImageName); var geometryModel3D = new GeometryModel3D { Geometry = result.MeshGeometry, Material = new DiffuseMaterial { Brush = new ImageBrush { ImageSource = new BitmapImage(new Uri(textureImageName, UriKind.Relative)), ViewportUnits = BrushMappingMode.Absolute } } }; XamlWriter.SaveGeometryModel3D(_outputFolderPath + @"\batman.xaml", geometryModel3D); }