コード例 #1
0
ファイル: Parser.cs プロジェクト: neopite/computer-graphics
        public List <Triangle> ParseObject(string inputPath)
        {
            var             objLoaderFactory = new ObjLoaderFactory();
            var             objLoader        = objLoaderFactory.Create();
            var             fileStream       = new FileStream(inputPath, FileMode.Open);
            var             result           = objLoader.Load(fileStream);
            List <Triangle> faces            = new List <Triangle>();

            for (int i = 0; i < result.Groups.Count; i++)
            {
                for (int j = 0; j < result.Groups[i].Faces.Count; j++)
                {
                    Vector3 a = new Vector3(result.Vertices[result.Groups[i].Faces[j][0].VertexIndex - 1].X,
                                            result.Vertices[result.Groups[i].Faces[j][0].VertexIndex - 1].Y,
                                            result.Vertices[result.Groups[i].Faces[j][0].VertexIndex - 1].Z);

                    Vector3 b = new Vector3(result.Vertices[result.Groups[i].Faces[j][1].VertexIndex - 1].X,
                                            result.Vertices[result.Groups[i].Faces[j][1].VertexIndex - 1].Y,
                                            result.Vertices[result.Groups[i].Faces[j][1].VertexIndex - 1].Z);

                    Vector3 c = new Vector3(result.Vertices[result.Groups[i].Faces[j][2].VertexIndex - 1].X,
                                            result.Vertices[result.Groups[i].Faces[j][2].VertexIndex - 1].Y,
                                            result.Vertices[result.Groups[i].Faces[j][2].VertexIndex - 1].Z);

                    faces.Add(new Triangle(a, b, c));
                }
            }

            return(faces);
        }
コード例 #2
0
        public static string Convert(Stream stream)
        {
            var factory = new ObjLoaderFactory();
            var loader  = factory.Create();

            var result = loader.Load(stream);

            var jsonVertices = new JArray();
            var json         = new JObject(new JProperty("vertices", jsonVertices));

            foreach (var group in result.Groups)
            {
                foreach (var face in group.Faces)
                {
                    for (int i = 0; i < face.Count; i++)
                    {
                        var vert = result.Vertices[face[i].VertexIndex - 1];
                        jsonVertices.Add(vert.X);
                        jsonVertices.Add(vert.Y);
                        jsonVertices.Add(vert.Z);
                    }
                }
            }

            return(json.ToString());
        }
コード例 #3
0
ファイル: MeshLoader.cs プロジェクト: FluentZap/VT49
        public static Mesh LoadTriangleMesh(BufferPool pool, string name, Vector3 scale)
        {
            var triangles = new List <Triangle>();
            var result    = new ObjLoaderFactory().Create(new MaterialStubLoader()).Load(GetFileStream(name));

            for (int i = 0; i < result.Groups.Count; ++i)
            {
                var group = result.Groups[i];
                for (int j = 0; j < group.Faces.Count; ++j)
                {
                    var face = group.Faces[j];
                    var a    = result.Vertices[face[0].VertexIndex - 1];
                    for (int k = 1; k < face.Count - 1; ++k)
                    {
                        var b = result.Vertices[face[k].VertexIndex - 1];
                        var c = result.Vertices[face[k + 1].VertexIndex - 1];
                        triangles.Add(new Triangle
                        {
                            A = new Vector3(a.X, a.Y, a.Z),
                            B = new Vector3(b.X, b.Y, b.Z),
                            C = new Vector3(c.X, c.Y, c.Z)
                        });
                    }
                }
            }

            pool.Take <Triangle>(triangles.Count, out var meshTriangles);
            for (int i = 0; i < triangles.Count; ++i)
            {
                meshTriangles[i] = triangles[i];
            }
            Mesh mesh = new Mesh(meshTriangles, scale, pool);

            return(mesh);
        }
コード例 #4
0
        public static (Mesh mesh, Vector3[] positions, Vector3[] normals) LoadObj(string path)
        {
            ObjLoaderFactory factory = new ObjLoaderFactory();
            var objLoader            = factory.Create();

            using (var fStream = new FileStream(path, FileMode.Open))
            {
                var result = objLoader.Load(fStream);

                Dictionary <FaceVertex, VertexObjData> vertexData = new Dictionary <FaceVertex, VertexObjData>();

                var    verts   = result.Vertices;
                var    norms   = result.Normals;
                var    tex     = result.Textures;
                var    faces   = result.Groups[0].Faces;
                uint[] indices = new uint[faces.Count * 3];
                for (int i = 0; i < faces.Count; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        var vert = faces[i][j];

                        if (vertexData.ContainsKey(vert) == false)
                        {
                            var v = ConvertVert(verts[vert.VertexIndex - 1]);
                            var n = ConvertNorm(norms[vert.NormalIndex - 1]);
                            var t = ConvertTexCoord(tex[vert.TextureIndex - 1]);
                            vertexData.Add(vert, new VertexObjData(v, n, t, vertexData.Count));
                        }
                    }
                }

                List <VertexObjData> sortedVertexData = vertexData.Values.ToList();

                //sortedVertexData.Sort((a, b) => a.index.CompareTo(b.index));

                for (int i = 0; i < faces.Count; i++)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        indices[i * 3 + j] = (uint)vertexData[faces[i][j]].index;
                    }
                }

                var     positions = new Vector3[sortedVertexData.Count];
                var     normals   = new Vector3[sortedVertexData.Count];
                float[] vertices  = new float[sortedVertexData.Count * VertexLayout.Stride(VertexLayout.Type.PositionNormal)];
                for (int i = 0; i < sortedVertexData.Count; i++)
                {
                    var vert = sortedVertexData[i];
                    positions[vert.index] = vert.position;
                    normals[vert.index]   = vert.normal;
                    VBOUtility.SetVertex(vertices, vert.position, vert.normal, vert.index);
                }

                var mesh = new Mesh(VertexLayout.Type.PositionNormal);
                mesh.SetBufferData(vertices, indices, OpenTK.Graphics.OpenGL.BufferUsageHint.StaticDraw);
                return(mesh, positions, normals);
            }
        }
コード例 #5
0
ファイル: Form1.cs プロジェクト: Jokcik/KB_LAB_4
        private void LoadObj()
        {
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();
            var fileStream       = new FileStream("G:\\универ\\4 курс\\компьютерная графика\\Kompyuteraya_grafika\\Компьютерая графика\\obj файлы\\Hammer.obj",
                                                  FileMode.Open);
            var loadedObj = objLoader.Load(fileStream);

            foreach (var g in loadedObj.Groups)
            {
                foreach (var f in g.Faces)
                {
                    values.Add(f.Count);
                    for (var i = 0; i < f.Count; i++)
                    {
                        vectors.Add(new Vector3D(
                                        loadedObj.Vertices[f[i].VertexIndex - 1].X,
                                        loadedObj.Vertices[f[i].VertexIndex - 1].Y,
                                        loadedObj.Vertices[f[i].VertexIndex - 1].Z
                                        ));
                    }
                }
            }

            fileStream.Close();
        }
コード例 #6
0
        public unsafe static MeshContent Build(Stream dataStream)
        {
            var result    = new ObjLoaderFactory().Create(new MaterialStubLoader()).Load(dataStream);
            var triangles = new List <TriangleContent>();

            for (int i = 0; i < result.Groups.Count; ++i)
            {
                var group = result.Groups[i];
                for (int j = 0; j < group.Faces.Count; ++j)
                {
                    var face = group.Faces[j];
                    var a    = result.Vertices[face[0].VertexIndex - 1];
                    for (int k = 1; k < face.Count - 1; ++k)
                    {
                        var b = result.Vertices[face[k].VertexIndex - 1];
                        var c = result.Vertices[face[k + 1].VertexIndex - 1];
                        triangles.Add(new TriangleContent
                        {
                            A = new Vector3(a.X, a.Y, a.Z),
                            B = new Vector3(b.X, b.Y, b.Z),
                            C = new Vector3(c.X, c.Y, c.Z)
                        });
                    }
                }
            }
            return(new MeshContent(triangles.ToArray()));
        }
コード例 #7
0
ファイル: Form1.cs プロジェクト: furkanozcn/Rotating-Glass
        public Form1()
        {
            InitializeComponent();
            OpenGlControl.InitializeContexts();
            int height = OpenGlControl.Height;
            int width  = OpenGlControl.Width;

            Gl.glEnable(Gl.GL_LIGHTING);
            Gl.glEnable(Gl.GL_LIGHT0);
            float[] light_pos = new float[4] {
                1, 0.5F, 1, 0
            };
            Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light_pos);
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            Gl.glDepthFunc(Gl.GL_LEQUAL);
            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);
            Gl.glClearColor(0, 0, 0, 1);

            Gl.glViewport(0, 0, width, height);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Glu.gluPerspective(45.0f, (double)width / (double)height, 0.01f, 5000.0f);
            Gl.glMatrixMode(Gl.GL_MODELVIEW);

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            var fileStream = new FileStream("bardak.obj", FileMode.Open, FileAccess.Read);

            result = objLoader.Load(fileStream);
        }
コード例 #8
0
        protected void Load3dCube()
        {
            // This is coming from our resources
            //StreamResourceInfo stri =Application.GetResourceStream (new Uri (
            //	@"Autodesk.ADN.Toolkit.Wpf.Viewer;3dCube\3dCube.zip",
            //	UriKind.Relative
            //)) ;
            //LoadModel (stri.Stream) ;
            Assembly        assembly     = Assembly.GetCallingAssembly();
            string          resourceName = assembly.GetName().Name + ".g";
            ResourceManager rm           = new ResourceManager(resourceName, assembly);

            using (ResourceSet set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true)) {
                UnmanagedMemoryStream s    = (UnmanagedMemoryStream)set.GetObject(@"3dCube/3dCube.zip", true);
                StreamResourceInfo    stri = new StreamResourceInfo(s, "");
                using (ZipArchive zip = new ZipArchive(stri.Stream)) {
                    ZipArchiveEntry mesh    = zip.GetEntry("mesh.obj");
                    ZipArchiveEntry mtl     = zip.GetEntry("mesh.mtl");
                    ZipArchiveEntry texture = zip.GetEntry("tex_0.jpg");

                    using (new CursorSwitcher(null)) {
                        var objLoaderFactory = new ObjLoaderFactory();
                        var objLoader        = objLoaderFactory.Create(new ObjMaterialStreamProvider(mtl));
                        var result           = objLoader.Load(mesh.Open());
                        _3dCubeMesh         = ObjTriangleMeshAdapater.BuildVisualModel(result, texture);
                        _3dCubeMeshMatGroup = (_3dCubeMesh.Content as GeometryModel3D).Material;
                        // Reset the model & transform(s)
                        this.cubeModel.Children.Clear();
                        this.cubeModel.Children.Add(_3dCubeMesh);
                    }
                }
            }
        }
コード例 #9
0
ファイル: Program.cs プロジェクト: zhongyixiashi/DSMapStudio
        static void Main(string[] args)
        {
            var fact   = new ObjLoaderFactory();
            var loader = fact.Create();

            using (var fs = File.OpenRead(args[0]))
            {
                var res = loader.Load(fs);

                List <Vector3> verts   = new List <Vector3>();
                List <ushort>  indices = new List <ushort>();

                foreach (var vert in res.Vertices)
                {
                    verts.Add(new Vector3(vert.X, vert.Y, vert.Z));
                }
                foreach (var idx in res.Groups[0].Faces)
                {
                    indices.Add((ushort)(idx[0].VertexIndex - 1));
                    indices.Add((ushort)(idx[1].VertexIndex - 1));
                    indices.Add((ushort)(idx[2].VertexIndex - 1));
                }

                HKX2.Builders.hknpCollisionMeshBuilder colBuilder = new HKX2.Builders.hknpCollisionMeshBuilder();
                colBuilder.AddMesh(verts, indices);
                var root = colBuilder.CookCollision();

                using (FileStream s2 = File.Create(args[0] + ".hkx"))
                {
                    BinaryWriterEx bw = new BinaryWriterEx(false, s2);
                    var            s  = new HKX2.PackFileSerializer();
                    s.Serialize(root, bw);
                }
            }
        }
コード例 #10
0
ファイル: Loader.cs プロジェクト: vichor/Sharpen
        /// <summary>Creates a new <see><c>Entity</c></see> from 3D model in file.</summary>
        /// <para>
        ///     Uses the package CjClutter.ObjLoader to handle the parsing. Then it performs
        ///     additional checks to ensure Sharpen constraints:
        ///         - only 1 group is allowed in the model definition.
        /// </para>
        /// <param name="modelPath">Name of Wavefront-OBJ format file containing the 3D model.</param>
        /// <param name="texturePath">Path and file name of the graphical file to use for the texture</param>
        /// <returns>An <see><c>Entity</c></see> instance.</returns>
        /// <seealso>Entity</seealso>
        public Entity LoadEntity(string modelPath, string texturePath)
        {
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();
            var modelStream      = new FileStream(modelPath, FileMode.Open);
            var modelObj         = objLoader.Load(modelStream);

            if (!ValidateModel(modelObj))
            {
                string msg = $"[{modelPath}]: Model was loaded successfully but failed LoadEntity validation.";
                l.Error(msg);
                throw new Exception(msg);
            }

            var numberOfPositionCoordinates = modelObj.Vertices.Count * 3;
            var numberOfTextureCoordinates  = modelObj.Vertices.Count * 2;
            var numberOfIndices             = modelObj.Groups[0].Faces.Count * 3;

            float[] vertices      = new float[numberOfPositionCoordinates];
            float[] uvCoordinates = new float[numberOfTextureCoordinates];
            int[]   indices       = new int[numberOfIndices];

            GetModelRawData(modelObj, vertices, uvCoordinates, indices);

            return(LoadEntity(vertices, indices, uvCoordinates, texturePath));
        }
コード例 #11
0
ファイル: MeshTools.cs プロジェクト: Michizev/ACG
        public static Mesh Load(Stream stream)
        {
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            var loadResult = objLoader.Load(stream);

            return(loadResult.ToMesh());
        }
コード例 #12
0
        private LoadResult Load(string fileString)
        {
            var objectStream     = CreateMemoryStreamFromString(fileString);
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create(new MaterialNullStreamProvider());
            var _loadResult      = objLoader.Load(objectStream);

            return(_loadResult);
        }
コード例 #13
0
        public static LoadResult LoadObjSolid(string fileName)
        {
            var        objLoaderFactory = new ObjLoaderFactory();
            var        objLoader        = objLoaderFactory.Create();
            var        fileStream       = new FileStream(fileName, FileMode.OpenOrCreate);
            LoadResult solid            = objLoader.Load(fileStream);

            fileStream.Close();
            return(solid);
        }
コード例 #14
0
        public LoadResult LoadObj(string path)
        {
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            FileStream fileStream = new FileStream(path, FileMode.Open);
            var        result     = objLoader.Load(fileStream);

            return(result);
        }
コード例 #15
0
        private LoadResult GetResult(string file)
        {
            IObjLoaderFactory factory   = new ObjLoaderFactory();
            IObjLoader        objLoader = factory.Create();

            using (var stream = new FileStream(file, FileMode.Open))
            {
                return(objLoader.Load(stream));
            }
        }
コード例 #16
0
        public ObjectModel ParseObject(string pathToFile)
        {
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            var fileStream = File.OpenRead(pathToFile);
            var object3D   = objLoader.Load(fileStream);

            return(LoadResultToObjectModel.ToObjectModel(object3D));
        }
コード例 #17
0
        private LoadResult LoadObj(string objFile)
        {
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            var text   = (TextAsset)Resources.Load(objFile);
            var ms     = new MemoryStream(Encoding.UTF8.GetBytes(text.text));
            var result = objLoader.Load(ms);

            return(result);
        }
コード例 #18
0
        public Mesh Parse(string source)
        {
            var objLoader = ObjLoaderFactory.Create();
            var bytes     = IoWorker.Read(source);

            using (var stream = new MemoryStream(bytes))
            {
                var result = objLoader.Load(stream);
                return(ModelToObjectConverter.Convert(result));
            }
        }
コード例 #19
0
        public static LoadResult LoadOBJ(string filename)
        {
            if (objLoader != null)
            {
                var objloaderFactory = new ObjLoaderFactory();
                objLoader = objloaderFactory.Create();
            }

            FileStream fileStream = new FileStream(filename, FileMode.Open);

            return(objLoader.Load(fileStream));
        }
コード例 #20
0
        public ObjectModel ParseObject(string pathToFile)
        {
            var sceneData = _sceneIO.Read(pathToFile);
            var obj       = sceneData.SceneObjects[0];

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            var fileStream = File.OpenRead(obj.MeshedObject.Reference);
            var object3D   = objLoader.Load(fileStream);

            return(LoadResultToObjectModel.ToObjectModel(object3D));
        }
コード例 #21
0
ファイル: Program.cs プロジェクト: HiceS/SharpMesh
        private static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");


            // parsing section

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            var fileStream = new FileStream("Resources/Dodec.obj", FileMode.Open, FileAccess.Read);
            var result     = objLoader.Load(fileStream);

            Console.WriteLine(result.Vertices.Count);


            // parser call

            var ourMesh = new Mesh();

            // Convert the vertices into the superior format
            foreach (var vert in result.Vertices)
            {
                ourMesh.Vertices.Add(new Vector(vert.X, vert.Y, vert.Z));
            }

            var ind = result.Groups[0]?.Faces;

            if (ind != null)
            {
                foreach (var face in ind)
                {
                    for (var j = 0; j < face.Count; j++)
                    {
                        ourMesh.Triangles.Add(face[j].VertexIndex);
                    }
                }
            }
            else
            {
                return;
            }

            Console.WriteLine(ourMesh.Triangles.Count);
            Console.WriteLine(ourMesh.Vertices.Count);

            var decomped = Decompose(ourMesh);

            Console.WriteLine(decomped);
        }
コード例 #22
0
        private LoadResult LoadObjSolid(
            string fileName,
            float scale)
        {
            var        objLoaderFactory = new ObjLoaderFactory();
            var        objLoader        = objLoaderFactory.Create();
            var        fileStream       = new FileStream(fileName, FileMode.OpenOrCreate);
            LoadResult solid            = objLoader.Load(fileStream);

            fileStream.Close();

            OpenGLUtilities.UnitizeObject(ref solid);
            OpenGLUtilities.ScaleObject(ref solid, scale);

            return(solid);
        }
コード例 #23
0
        public static List <Polygon> Load(string path)
        {
            var polygons = new List <Polygon>();

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();
            var fileStream       = new FileStream(path, FileMode.Open);
            var loadedObj        = objLoader.Load(fileStream);

            var colors = new[]
            {
                Color.FromArgb(255, 0, 128, 255),
                Color.FromArgb(255, 255, 215, 0),
                Color.FromArgb(255, 5, 128, 0),
                Color.FromArgb(255, 255, 0, 64),
                Color.FromArgb(255, 200, 0, 160),
                Color.FromArgb(255, 60, 0, 64),
                Color.FromArgb(255, 100, 100, 100),
                Color.Crimson
            };
            var k = -1;

            foreach (var g in loadedObj.Groups)
            {
                k = (k + 1) % colors.Length;
                var color = colors[k++];
                foreach (var f in g.Faces)
                {
                    var p = new Polygon(color);
                    for (var i = 0; i < f.Count; i++)
                    {
                        p.AddPoint(
                            loadedObj.Vertices[f[i].VertexIndex - 1].X,
                            loadedObj.Vertices[f[i].VertexIndex - 1].Y,
                            loadedObj.Vertices[f[i].VertexIndex - 1].Z
                            );
                    }

                    polygons.Add(p);
                }
            }

            fileStream.Close();
            return(polygons);
        }
コード例 #24
0
ファイル: Program.cs プロジェクト: Xiaod123/EMSimulation
        static void Main(string[] args)
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create(new MaterialStreamProvider());

            var fileStream = new FileStream(args[0], FileMode.Open, FileAccess.Read);

            var result = objLoader.Load(fileStream);

            stopwatch.Stop();
            Console.WriteLine(stopwatch.Elapsed);

            PrintResult(result);
        }
コード例 #25
0
        /// <summary>
        /// Loads geometry from an OBJ file into native Dynamo geometry.
        /// </summary>
        /// <param name="filePath">The filepath of the .OBJ file.</param>
        /// <returns>List of OBJ Groups as Dynamo PolySurfaces.</returns>
        public static List <PolySurface> LoadObj(string filePath)
        {
            var loaderFactory = new ObjLoaderFactory();
            var loader        = loaderFactory.Create();

            var fs     = new FileStream(filePath, FileMode.Open);
            var result = loader.Load(fs);

            fs.Close();

            List <PolySurface> polySurfaces = new List <PolySurface>();

            foreach (var group in result.Groups)
            {
                polySurfaces.Add(GetObjGroupMesh(group, result));
            }

            return(polySurfaces);
        }
コード例 #26
0
        public Bitmap Run()
        {
            var screen  = new Bitmap(640, 480, PixelFormat.Format32bppArgb);
            var texture = new Bitmap("Data/box.png");

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create(new IgnoreMaterial());
            var box = objLoader.Load(File.OpenRead("Data/box.obj"));

            (var idata, var vdata) = CreateVertexArray(box);

            var lookAt      = Matrix4x4.CreateLookAt(new Vector3(3.0f, 2.0f, 5.0f), new Vector3(0.0f), new Vector3(0.0f, 1.0f, 0.0f));
            var fieldOfView = (float)(60.0 * Math.PI / 180.0);
            var aspect      = 4.0f / 3.0f;
            var perspective = Matrix4x4.CreatePerspectiveFieldOfView(fieldOfView, aspect, 0.1f, 10.0f);

            var r = new Rasterizer();
            var v = new VertexProcessor(r);

            r.SetRasterMode(RasterMode.Span);
            r.SetScissorRect(0, 0, 640, 480);

            v.SetViewport(0, 0, 640, 480);
            v.SetCullMode(CullMode.CW);

            var pixelShader = new PixelShader();

            pixelShader.Screen  = screen;
            pixelShader.Texture = texture;
            r.SetPixelShader(pixelShader);

            var vertexShader = new VertexShader();

            vertexShader.Data = vdata;
            vertexShader.ModelViewProjectionMatrix = lookAt * perspective;
            v.SetVertexShader(vertexShader);

            v.DrawElements(DrawMode.Triangle, idata.Count, idata);

            return(screen);
        }
コード例 #27
0
        protected void LoadModel(Stream str)
        {
            using (ZipArchive zip = new ZipArchive(str)) {
                ZipArchiveEntry mesh    = zip.GetEntry("mesh.obj");
                ZipArchiveEntry mtl     = zip.GetEntry("mesh.mtl");
                ZipArchiveEntry texture = zip.GetEntry("tex_0.jpg");

                using (new CursorSwitcher(null)) {
                    var objLoaderFactory = new ObjLoaderFactory();
                    var objLoader        = objLoaderFactory.Create(new ObjMaterialStreamProvider(mtl));
                    var result           = objLoader.Load(mesh.Open());
                    _currentWireframe    = null;
                    _currentMesh         = ObjTriangleMeshAdapater.BuildVisualModel(result, texture);
                    _currentMeshMatGroup = (_currentMesh.Content as GeometryModel3D).Material;
                    // Reset the model & transform(s)
                    this.model.Children.Clear();
                    _currentDisplayMode = DisplayMode.Textured;
                    this.model.Children.Add(_currentMesh);
                }
            }
            Home_Click(null, null);
        }
コード例 #28
0
 public override void Init()
 {
     objLoaderFactory       = new ObjLoaderFactory();
     materialStreamProvider = new CustomMaterialStreamProvider();
 }
コード例 #29
0
        public static (List <IHitable>, Camera) CornellScene(string objPath, ImSoRandom rnd, int nx, int ny)
        {
            var world = new List <IHitable>();

            var grad  = new Lambertian(new ColourTexture());
            var blue  = new Lambertian(new ConstantTexture(0.05f, 0.05f, 0.65f));
            var red   = new Lambertian(new ConstantTexture(0.65f, 0.05f, 0.05f));
            var white = new Lambertian(new ConstantTexture(0.73f, 0.73f, 0.73f));
            var green = new Lambertian(new ConstantTexture(0.12f, 0.45f, 0.15f));
            var light = new DiffuseLight(new ConstantTexture(15f, 15f, 15f));
            var glass = new Dialectric(1.5f);

            world.Add(new RectXZ(213, 343, 227, 332, 554, light));

            world.Add(new FlipNormals(new RectYZ(0, 555, 0, 555, 555, green)));
            world.Add(new RectYZ(0, 555, 0, 555, 0, red));
            world.Add(new FlipNormals(new RectXZ(0, 555, 0, 555, 555, white)));
            world.Add(new RectXZ(0, 555, 0, 555, 0, white));
            world.Add(new FlipNormals(new RectXY(0, 555, 0, 555, 555, white)));

            //world.Add( new Translate( new Box(Vector3.Zero, new Vector3(165, 165, 165), white), new Vector3(130, 0, 65)));
            //world.Add( new Translate( new Box(Vector3.Zero, new Vector3(165, 330, 165), white), new Vector3(265, 0, 295)));

            //world.Add(new Sphere(new Vector3(0, 0, 0), 3000.0f, new DiffuseLight(new ConstantTexture(new Vector3(1, 1, 1)))));

            /*
             * for (int i = 0; i < 50; i++)
             * {
             *  var a = rnd.RandomVector();
             *  var b = rnd.RandomVector();
             *  var c = rnd.RandomVector();
             *
             *  //world.Add(new Translate(new Triangle(new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), red),new Vector3(10 + rnd.NextFloat() * 100f, 10 + rnd.NextFloat() * 100f, 10 + rnd.NextFloat() * 100f)));
             *  world.Add(new Triangle(a, b, c, blue));
             * }
             *
             */
            //world.Add(new Triangle( new Vector3(340, 90, 62),new Vector3(100, 320, 190), new Vector3(262, 331, 400), grad));

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();
            var fileStream       = new FileStream(objPath, FileMode.Open);
            var obj          = objLoader.Load(fileStream);
            var objBox       = obj.GetBoundingBox();
            var centerOffset = objBox.Center();
            var height       = objBox.Max.Y - objBox.Min.Y;

            var scaleFactor      = new Vector3(50, 50, 50);       // scale obj to wold space
            var displacement     = new Vector3(555f / 2, height / 2f * scaleFactor.Y, 555f / 3 * 2);
            var glossScaleFactor = new Vector3(0.5f, 0.5f, 0.5f); // scale the unit vector normal

            foreach (var g in obj.Groups)
            {
                foreach (var f in g.Faces)
                {
                    // Verticies have their origin set to the center of the bounding box
                    var v0 = obj.Vertices[f[0].VertexIndex - 1].ToVector3() - centerOffset;
                    var v1 = obj.Vertices[f[1].VertexIndex - 1].ToVector3() - centerOffset;
                    var v2 = obj.Vertices[f[2].VertexIndex - 1].ToVector3() - centerOffset;

                    var t = new Triangle(v0 * scaleFactor, v1 * scaleFactor, v2 * scaleFactor, glass);

                    // add Dialectric
                    world.Add(new Translate(t, displacement));

                    // add Lambertian. translated toward obj center by glossScaleFactor of a unit vector
                    world.Add(new Translate(new Triangle(v0 * scaleFactor, v1 * scaleFactor, v2 * scaleFactor, white), displacement - Vector3.Normalize(t.Normal)));
                }
            }

            var lookFrom    = new Vector3(278, 278, -800);
            var lookAt      = new Vector3(278, 278, 0);
            var distToFocus = (lookFrom - lookAt).Length() - scaleFactor.Length() / 2;
            var aperture    = 0.1f;
            var vFov        = 40;

            var cam = new Camera(lookFrom, lookAt, new Vector3(0, 1, 0), vFov, (float)nx / (float)ny, aperture, distToFocus, 0.0f, 1.0f);

            return(world, cam);
        }
コード例 #30
0
 public static LoadResult loadObject(string fileName)
 {
     return(ObjLoaderFactory.Create().Load(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)));
 }