コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: PikachuScene.cs プロジェクト: fremag/ray-tracer
        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]);
        }
コード例 #5
0
ファイル: MappingTest.cs プロジェクト: D0miq/3D_Animation
        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);
        }
コード例 #7
0
        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));
        }
コード例 #8
0
        /// <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.";
            }
        }
コード例 #9
0
        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));
        }
コード例 #10
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("Произошла ошибка!");
     }
 }
コード例 #11
0
        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]);
        }
コード例 #13
0
ファイル: TeapotScene.cs プロジェクト: fremag/ray-tracer
        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);
        }
コード例 #14
0
        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]);
        }
コード例 #17
0
ファイル: Teapot_low.cs プロジェクト: fremag/ray-tracer
        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);
        }