public static string RenderTeapot() { var world = new World(); IShape floor = new Plane { Material = new Material(new CheckerPattern(Color.Black, Color.White)) }; world.Add(floor); ObjFileReader teapotObj = new ObjFileReader("teapot.obj"); var teapot = teapotObj.ObjToGroup(); world.Add(teapot); var point = Helper.CreatePoint(7, 5, -10); world.Lights.Add(new PointLight(Helper.CreatePoint(15, 15, -15), Color.White)); var camera = new Camera(600, 400, Math.PI / 3, Helper.ViewTransform(point, Helper.CreatePoint(0, 0, 0), Helper.CreateVector(0, 1, 0))); camera.RowRendered += Program.OnRowRendered; var canvas = camera.Render(world); string file = Path.Combine(Path.GetTempPath(), "teapot.ppm"); canvas.SavePPM(file); return(file); }
public static string RenderPikachu() { var world = new World(); IShape floor = new Plane { Material = new Material(new CheckerPattern(Color.Black, Color.White).Scale(5)) }; world.Add(floor); ObjFileReader smoothPikachuObj = new ObjFileReader("pikachu.obj", true); var smoothPikachu = smoothPikachuObj.ObjToGroup(); smoothPikachu.Rotate(ry: Math.PI).Translate(tx: 0.5); world.Add(smoothPikachu); ObjFileReader pikachuObj = new ObjFileReader("pikachu.obj", false); var pikachu = pikachuObj.ObjToGroup(); pikachu.Rotate(ry: Math.PI).Translate(tx: -4); world.Add(pikachu); var point = Helper.CreatePoint(10, 10, -10) / 2; world.Lights.Add(new PointLight(Helper.CreatePoint(100, 100, -100), Color.White)); var camera = new Camera(600, 400, Math.PI / 3, Helper.ViewTransform(point, Helper.CreatePoint(0, 3, 0), Helper.CreateVector(0, 1, 0))); camera.RowRendered += Program.OnRowRendered; var canvas = camera.Render(world); string file = Path.Combine(Path.GetTempPath(), "pikachu.ppm"); canvas.SavePPM(file); return(file); }
public override void InitWorld() { IShape floor = new Plane { Material = new Material(new CheckerPattern(Color.Black, Color.White).Scale(5)) }; Add(floor); var assembly = typeof(PikachuScene).GetTypeInfo().Assembly; Stream resource = assembly.GetManifestResourceStream("ray_tracer_demos.Basic.Pikachu.obj"); ObjFileReader smoothPikachuObj = new ObjFileReader(resource, true); var smoothPikachu = smoothPikachuObj.ObjToGroup(); smoothPikachu.Rotate(ry: Math.PI).Translate(tx: 0.5); Add(smoothPikachu); resource = assembly.GetManifestResourceStream("ray_tracer_demos.Basic.Pikachu.obj"); ObjFileReader pikachuObj = new ObjFileReader(resource, false); var pikachu = pikachuObj.ObjToGroup(); pikachu.Rotate(ry: Math.PI).Translate(tx: -4); Add(pikachu); var point = Helper.CreatePoint(10, 10, -10) / 2; Light(100, 100, -100); }
public void TriangulatingPolygonsTest() { var reader = new ObjFileReader( "v -1 1 0", "v -1 0 0", "v 1 0 0", "v 1 1 0", "v 0 2 0", "f 1 2 3 4 5"); var t1 = reader.DefaultGroup[0] as Triangle; var t2 = reader.DefaultGroup[1] as Triangle; var t3 = reader.DefaultGroup[2] as Triangle; Check.That(t1.P1).IsEqualTo(reader.Vertices[0]); Check.That(t1.P2).IsEqualTo(reader.Vertices[1]); Check.That(t1.P3).IsEqualTo(reader.Vertices[2]); Check.That(t2.P1).IsEqualTo(reader.Vertices[0]); Check.That(t2.P2).IsEqualTo(reader.Vertices[2]); Check.That(t2.P3).IsEqualTo(reader.Vertices[3]); Check.That(t3.P1).IsEqualTo(reader.Vertices[0]); Check.That(t3.P2).IsEqualTo(reader.Vertices[3]); Check.That(t3.P3).IsEqualTo(reader.Vertices[4]); }
public void TestMapping() { // Referenční soubor IFileReader fileReader = new ObjFileReader(""); List <Vector <float> > referPoints = fileReader.ReadVertices(); // Zdrojový soubor fileReader = new ObjFileReader(""); List <Vector <float> > sourcePoints = fileReader.ReadVertices(); // Doplnit maximální vzdálenost IPointMapping bruteForceMapping = new BruteForceMapping(referPoints, 50f); List <Vector <float> > bruteForceMappedPoints = bruteForceMapping.MapPoints(sourcePoints, out List <Vector <float> > mappedSourcePoints); // Doplnit maximální vzdálenost IPointMapping kdMapping = new KdTreeMapping(referPoints, 50f); List <Vector <float> > kdMappedPoints = kdMapping.MapPoints(sourcePoints, out mappedSourcePoints); Assert.AreEqual(bruteForceMappedPoints.Count, kdMappedPoints.Count); bool allEqual = true; for (int i = 0; i < bruteForceMappedPoints.Count; i++) { if (!bruteForceMappedPoints[i].Equals(kdMappedPoints[i])) { allEqual = false; break; } } Assert.IsTrue(allEqual); }
public void IgnoreUnrecognizedLinesTest() { ObjFileReader reader = new ObjFileReader("There was a young lady named Bright", "who traveled much faster than light.", "She set out one day", "in a relative way,", "and came back the previous night."); Check.That(reader.Ignored).IsEqualTo(5); }
public void VertexNormalRecordTest() { var reader = new ObjFileReader( "vn 0 0 1", "vn 0.707 0 -0.707", "vn 1 2 3"); Check.That(reader.Normals[0]).IsEqualTo(Helper.CreatePoint(0, 0, 1)); Check.That(reader.Normals[1]).IsEqualTo(Helper.CreatePoint(0.707, 0, -0.707)); Check.That(reader.Normals[2]).IsEqualTo(Helper.CreatePoint(1, 2, 3)); }
/// <summary> /// Starts a worker on the background. It compresses given files and creates a new compressed .3gbf file from them. /// </summary> /// <param name="sender">Sender of the event.</param> /// <param name="e">Arguments of the event.</param> private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { Log.Info("Background worker starts."); Log.Debug("Background worker argument: " + (int)e.Argument); Compression compression = new Compression(); for (int i = 0; i < this.listFiles.CheckedItems.Count; i++) { string path = (string)this.listFiles.CheckedItems[i]; Log.Debug("Path of a file: " + path); try { IFileReader fileReader = new ObjFileReader(path); if (compression.FramesCount != 0) { compression.AddFrame(fileReader.ReadVertices()); } else { compression.AddFrame(fileReader.ReadAll()); } } catch (IOException ex) { Log.Error("Unable to read " + path + ". " + ex.Message); CompressionForm.statusBar.Text = "Unable to read " + path + "."; } finally { this.backgroundWorker.ReportProgress(i + 1); } } compression.CompressFrames((int)e.Argument); try { FileWriter writer = new FileWriter(string.Format(@"3DAnimation{0}.3ba", DateTime.Now.Ticks)); writer.WriteTrajectory(compression.AverageTrajectory); writer.WriteEigenVectors(compression.SubEigenVectors); writer.WriteControlTrajectories(compression.ControlTrajectories); writer.WriteFaces(compression.Frame.Faces); writer.WriteTextures(compression.Frame.TextureCoords); writer.Close(); } catch (Exception ex) { Log.Error("Cannot write to a file. " + ex.Message); statusBar.Text = "Error during writing to the file. Compression failed."; } }
public void VertexRecordsTest() { var reader = new ObjFileReader( "v -1 1 0", "v -1.0000 0.5000 0.0000", "v 1 0 0", "v 1 1 0"); Check.That(reader.Ignored).IsZero(); Check.That(reader.Vertices[0]).IsEqualTo(Helper.CreatePoint(-1, 1, 0)); Check.That(reader.Vertices[1]).IsEqualTo(Helper.CreatePoint(-1, 0.5, 0)); Check.That(reader.Vertices[2]).IsEqualTo(Helper.CreatePoint(1, 0, 0)); Check.That(reader.Vertices[3]).IsEqualTo(Helper.CreatePoint(1, 1, 0)); }
private void OpenFileButton_Click(object sender, RoutedEventArgs e) { try { string[] fileLines = ObjFileReader.Execute(); model = ObjParser.Parse(fileLines); model.diffuseTexture = getBgr24BitmapDiffuse(); model.normalsTexture = getBgr24BitmapNormals(); model.specularTexture = getBgr24BitmapSpecular(); } catch { MessageBox.Show("Произошла ошибка!"); } }
private IShape GetDragon(bool basicGroup = true) { ObjFileReader dragonReader = new ObjFileReader("dragon.obj", true); Group rawTriangles = dragonReader.DefaultGroup; IShape dragon = rawTriangles; if (!basicGroup) { //dragon = new TriangleGroupAvx(rawTriangles); dragon = new TriangleGroupGpu(rawTriangles); } dragon.Divide(1024); dragon.Scale(0.268); return(dragon); }
public void ParsingTriangleFacesTest() { var reader = new ObjFileReader( "v -1 1 0", "v -1 0 0", "v 1 0 0", "v 1 1 0", "f 1 2 3", "f 1 3 4"); Check.That(reader.Triangles[0].P1).IsEqualTo(reader.Vertices[0]); Check.That(reader.Triangles[0].P2).IsEqualTo(reader.Vertices[1]); Check.That(reader.Triangles[0].P3).IsEqualTo(reader.Vertices[2]); Check.That(reader.Triangles[1].P1).IsEqualTo(reader.Vertices[0]); Check.That(reader.Triangles[1].P2).IsEqualTo(reader.Vertices[2]); Check.That(reader.Triangles[1].P3).IsEqualTo(reader.Vertices[3]); }
public override void InitWorld() { IShape floor = new Plane { Material = new Material(new CheckerPattern(Color.Black, Color.White)) }; Add(floor); var assembly = typeof(TeapotScene).GetTypeInfo().Assembly; Stream resource = assembly.GetManifestResourceStream("ray_tracer_demos.Basic.teapot.obj"); ObjFileReader teapotObj = new ObjFileReader(resource, false); var teapot = teapotObj.ObjToGroup(); Add(teapot); Light(15, 15, -15); }
private Bgr24Bitmap getBgr24BitmapSpecular() { string path = ObjFileReader.getSpecularPath(); if (File.Exists(path)) { BitmapImage imgSpecular = new BitmapImage(new Uri(path, UriKind.Relative)); imgSpecular.CreateOptions = BitmapCreateOptions.None; var initialWriteableBitmapSpecular = new WriteableBitmap(imgSpecular); return(new Bgr24Bitmap(initialWriteableBitmapSpecular)); } else { return(null); } }
public void TrianglesInGroupTest() { var reader = new ObjFileReader( "v -1 1 0", "v -1 0 0", "v 1 0 0", "v 1 1 0", "g FirstGroup", "f 1 2 3", "g SecondGroup", "f 1 3 4"); var t1 = reader.Groups[1][0] as Triangle; var t2 = reader.Groups[2][0] as Triangle; Check.That(t1.P1).IsEqualTo(reader.Vertices[0]); Check.That(t1.P2).IsEqualTo(reader.Vertices[1]); Check.That(t1.P3).IsEqualTo(reader.Vertices[2]); Check.That(t2.P1).IsEqualTo(reader.Vertices[0]); Check.That(t2.P2).IsEqualTo(reader.Vertices[2]); Check.That(t2.P3).IsEqualTo(reader.Vertices[3]); }
public void TrianglesWithNormalsTest() { var reader = new ObjFileReader( "v 0 1 0", "v -1 0 0", "v 1 0 0", "", "vn -1 0 0", "vn 1 0 0", "vn 0 1 0", "f 1//3 2//1 3//2", "f 1/0/3 2/102/1 3/14/2"); var t1 = reader.DefaultGroup[0] as Triangle; var t2 = reader.DefaultGroup[0] as Triangle; Check.That(t1.P1).IsEqualTo(reader.Vertices[0]); Check.That(t1.P2).IsEqualTo(reader.Vertices[1]); Check.That(t1.P3).IsEqualTo(reader.Vertices[2]); Check.That(t2.P1).IsEqualTo(reader.Vertices[0]); Check.That(t2.P2).IsEqualTo(reader.Vertices[1]); Check.That(t2.P3).IsEqualTo(reader.Vertices[2]); }
public override void InitWorld() { Light(50, 100, 20, White / 2); Light(2, 50, 100, White / 2); /* Floor */ Material planesMaterial = new Material(new CheckerPattern(White * 0.35, White * 0.4)) { Ambient = 1, Diffuse = 0, Specular = 0, Reflective = 0.1 }; Add(new Plane { Material = planesMaterial }); Add(new Plane { Material = new Material(new CheckerPattern(White * 0.35, White * 0.4)) { Ambient = 1, Diffuse = 0, Specular = 0, } }).Rotate(rx: Pi / 2).Translate(0, 0, -10); Material lowPoly = new Material(new Color(1, 0.3, 0.2)) { Shininess = 5, Specular = 0.4 }; ObjFileReader teapotReader = new ObjFileReader("teapot-low.obj", true); var teapot = teapotReader.Groups[1]; teapot.Scale(0.3).Rotate(rx: -Pi / 2).Rotate(ry: Pi * 23 / 22).Translate(7, 0, 3); teapot.Material = lowPoly; Add(teapot); ObjFileReader teapotReader2 = new ObjFileReader("teapot-low.obj", true); var teapot2 = teapotReader2.Groups[1]; teapot2.Scale(0.3).Rotate(rx: -Pi / 2).Rotate(ry: -Pi * 46 / 22).Translate(-7, 0, 3); teapot2.Material = lowPoly; Add(teapot2); Material highPoly = new Material(new Color(0.3, 1, 0.2)) { Shininess = 5, Specular = 0.4, Reflective = 0.5 }; ObjFileReader teapotReader3 = new ObjFileReader("_teapot.obj", true); var teapot3 = teapotReader3.Groups[1]; teapot3.Scale(0.4).Rotate(rx: -Pi / 2).Rotate(ry: -Pi).Translate(0, 0, -5); teapot3.Material = highPoly; Add(teapot3); }