Ejemplo n.º 1
0
        /**
         * Create cube.
         * */
        public static void CreateCube(ITriangleMesh mesh, float sideLength)
        {
            mesh.Clear();
            mesh.AddVertex(new Vector3(-sideLength / 2.0f, -sideLength / 2.0f, -sideLength / 2.0f));
            mesh.AddVertex(new Vector3(sideLength / 2.0f, -sideLength / 2.0f, -sideLength / 2.0f));
            mesh.AddVertex(new Vector3(sideLength / 2.0f, sideLength / 2.0f, -sideLength / 2.0f));
            mesh.AddVertex(new Vector3(-sideLength / 2.0f, sideLength / 2.0f, -sideLength / 2.0f));
            mesh.AddVertex(new Vector3(-sideLength / 2.0f, -sideLength / 2.0f, sideLength / 2.0f));
            mesh.AddVertex(new Vector3(sideLength / 2.0f, -sideLength / 2.0f, sideLength / 2.0f));
            mesh.AddVertex(new Vector3(sideLength / 2.0f, sideLength / 2.0f, sideLength / 2.0f));
            mesh.AddVertex(new Vector3(-sideLength / 2.0f, sideLength / 2.0f, sideLength / 2.0f));

            mesh.AddTriangle(new Triangle(0, 2, 1));
            mesh.AddTriangle(new Triangle(0, 3, 2));
            mesh.AddTriangle(new Triangle(1, 2, 5));
            mesh.AddTriangle(new Triangle(2, 6, 5));
            mesh.AddTriangle(new Triangle(4, 5, 6));
            mesh.AddTriangle(new Triangle(4, 6, 7));
            mesh.AddTriangle(new Triangle(4, 7, 0));
            mesh.AddTriangle(new Triangle(0, 7, 3));
            mesh.AddTriangle(new Triangle(3, 7, 2));
            mesh.AddTriangle(new Triangle(2, 7, 6));
            mesh.AddTriangle(new Triangle(4, 0, 1));
            mesh.AddTriangle(new Triangle(1, 5, 4));
            mesh.ComputeTriangleNormals();
        }
Ejemplo n.º 2
0
        /**
         * Read an OBJ file an create a mesh from the content.
         * */
        public void Read(string filename, ITriangleMesh mesh)
        {
            this.mesh = mesh;
            mesh.Clear();

            // Read input
            string objSource = System.IO.File.ReadAllText(AssetPath.GetPathToAsset(filename));

            string[] lines = objSource.Split('\n');
            foreach (String line in lines)
            {
                string[] tokens = line.Trim().Split(' ', '\t');
                if (tokens.Length > 0)
                {
                    if (tokens [0].CompareTo("v") == 0)
                    {
                        ParseVertex(tokens);
                    }
                    else if (tokens [0].CompareTo("f") == 0)
                    {
                        ParseFacet(tokens);
                    }
                    else if (tokens [0].CompareTo("vt") == 0)
                    {
                        ParseTextureCoordinate(tokens);
                    }
                }
            }

            mesh.ComputeTriangleNormals();
            Console.WriteLine("Read mesh from file " + filename + " with " + mesh.GetNumberOfTriangles() + " triangles and " + mesh.GetNumberOfVertices() + " vertices.");
        }
Ejemplo n.º 3
0
 public static void CreateSquare(ITriangleMesh mesh, float extend)
 {
     mesh.Clear();
     mesh.AddVertex(new Vector3(-extend, 0, -extend));
     mesh.AddVertex(new Vector3(extend, 0, -extend));
     mesh.AddVertex(new Vector3(extend, 0, extend));
     mesh.AddVertex(new Vector3(-extend, 0, extend));
     mesh.AddTriangle(0, 2, 1);
     mesh.AddTriangle(0, 3, 2);
     mesh.ComputeTriangleNormals();
 }
Ejemplo n.º 4
0
        /**
         * Generated the unification of two meshes. Attention: no new mesh is generated, in fact the
         * geometry of mesh2 is added to mesh1.
         */
        public static void Unite(ITriangleMesh mesh1, ITriangleMesh mesh2)
        {
            int numberOfVertsMesh1     = mesh1.GetNumberOfVertices();
            int numberOfTexCoordsMesh1 = mesh1.GetNumberOfTexCoords();

            for (int i = 0; i < mesh2.GetNumberOfVertices(); i++)
            {
                mesh1.AddVertex(mesh2.GetVertex(i));
            }
            for (int i = 0; i < mesh2.GetNumberOfTexCoords(); i++)
            {
                mesh1.AddTextureCoordinate(mesh2.GetTextureCoordinate(i));
            }
            for (int i = 0; i < mesh2.GetNumberOfTriangles(); i++)
            {
                Triangle t = mesh2.GetTriangle(i).Clone();
                t.VertexIndexOffset(numberOfVertsMesh1);
                t.TexCoordsIndexOffset(numberOfTexCoordsMesh1);
                mesh1.AddTriangle(t);
            }
            mesh1.ComputeTriangleNormals();
        }
Ejemplo n.º 5
0
        /**
         * Create sphere.
         * */
        public static void CreateSphere(ITriangleMesh mesh, float radius, int resolution)
        {
            mesh.Clear();
            float dTheta = (float)(Math.PI / (resolution + 1));
            float dPhi   = (float)(Math.PI * 2.0 / resolution);

            // Create vertices

            // 0-180 degrees: i, theta
            for (int i = 0; i < resolution; i++)
            {
                // 0-360 degres: j, phi
                for (int j = 0; j < resolution; j++)
                {
                    Vector3 p0 = EvaluateSpherePoint((i + 1) * dTheta, j * dPhi, radius);
                    mesh.AddVertex(p0);
                }
            }
            int leftIndex  = mesh.AddVertex(new Vector3(0, 0, radius));
            int rightIndex = mesh.AddVertex(new Vector3(0, 0, -radius));

            // Add triangles
            for (int i = 0; i < resolution - 1; i++)
            {
                for (int j = 0; j < resolution; j++)
                {
                    mesh.AddTriangle(GetSphereIndex(i, j, resolution), GetSphereIndex(i + 1, j, resolution), GetSphereIndex(i + 1, j + 1, resolution));
                    mesh.AddTriangle(GetSphereIndex(i, j, resolution), GetSphereIndex(i + 1, j + 1, resolution), GetSphereIndex(i, j + 1, resolution));
                }
            }
            for (int j = 0; j < resolution; j++)
            {
                mesh.AddTriangle(GetSphereIndex(0, j, resolution), GetSphereIndex(0, (j + 1) % resolution, resolution), leftIndex);
                mesh.AddTriangle(GetSphereIndex(resolution - 1, j, resolution), rightIndex, GetSphereIndex(resolution - 1, (j + 1) % resolution, resolution));
            }

            mesh.ComputeTriangleNormals();
        }
Ejemplo n.º 6
0
        public void CreateShadowPolygons(Vector3 lightPosition, float extend, ITriangleMesh shadowPolygonMesh)
        {
            shadowPolygonMesh.Clear();
            ArrayList silhouetteEdges = GetSilhouette(lightPosition);

            for (int i = 0; i < silhouetteEdges.Count; i++)
            {
                Edge    edge   = (Edge)silhouetteEdges[i];
                Vector3 v0     = GetVertex(edge.a);
                Vector3 v1     = GetVertex(edge.b);
                Vector3 dv0    = Vector3.Multiply(Vector3.Subtract(v0, lightPosition).Normalized(), extend);
                Vector3 dv1    = Vector3.Multiply(Vector3.Subtract(v1, lightPosition).Normalized(), extend);
                Vector3 v0Dash = Vector3.Add(v0, dv0);
                Vector3 v1Dash = Vector3.Add(v1, dv1);

                int v0Index     = shadowPolygonMesh.AddVertex(v0);
                int v1Index     = shadowPolygonMesh.AddVertex(v1);
                int v0DashIndex = shadowPolygonMesh.AddVertex(v0Dash);
                int v1DashIndex = shadowPolygonMesh.AddVertex(v1Dash);
                shadowPolygonMesh.AddTriangle(v0Index, v0DashIndex, v1DashIndex);
                shadowPolygonMesh.AddTriangle(v0Index, v1DashIndex, v1Index);
            }
            shadowPolygonMesh.ComputeTriangleNormals();
        }