Пример #1
0
        /**
         * Parse a line containing a vertex
         **/
        private void ParseVertex(String[] tokens)
        {
            if (tokens.Length < 4)
            {
                return;
            }
            Vector3 x = new Vector3(float.Parse(tokens [1], System.Globalization.CultureInfo.InvariantCulture),
                                    float.Parse(tokens [2], System.Globalization.CultureInfo.InvariantCulture),
                                    float.Parse(tokens [3], System.Globalization.CultureInfo.InvariantCulture));

            mesh.AddVertex(x);
        }
Пример #2
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();
        }
Пример #3
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();
        }
Пример #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();
        }