Пример #1
0
        // Add a sphere without texture coordinates.
        public static void AddSphere(this MeshGeometry3D mesh,
                                     Point3D center, double radius, int numTheta, int numPhi,
                                     bool smooth = false)
        {
            // Make a point dictionary if needed.
            Dictionary <Point3D, int> pointDict = null;

            if (smooth)
            {
                pointDict = new Dictionary <Point3D, int>();
            }

            // Generate the points.
            double dtheta = 2 * Math.PI / numTheta;
            double dphi   = Math.PI / numPhi;
            double theta  = 0;

            for (int t = 0; t < numTheta; t++)
            {
                double phi = 0;
                for (int p = 0; p < numPhi; p++)
                {
                    // Find this piece's points.
                    Point3D[] points =
                    {
                        G3.SpherePoint(center, radius, theta,          phi),
                        G3.SpherePoint(center, radius, theta,          phi + dphi),
                        G3.SpherePoint(center, radius, theta + dtheta, phi + dphi),
                        G3.SpherePoint(center, radius, theta + dtheta, phi),
                    };

                    // Make the polygon.
                    mesh.AddPolygon(pointDict, points);

                    phi += dphi;
                }
                theta += dtheta;
            }
        }
Пример #2
0
        // Add a sphere with texture coordinates.
        public static void AddTexturedSphere(this MeshGeometry3D mesh,
                                             Point3D center, double radius, int numTheta, int numPhi,
                                             bool smooth = false)
        {
            double dtheta = 2 * Math.PI / numTheta;
            double dphi   = Math.PI / numPhi;
            double theta  = 0;

            for (int t = 0; t < numTheta; t++)
            {
                double phi = 0;
                for (int p = 0; p < numPhi; p++)
                {
                    // Find this piece's points.
                    Point3D point1 = G3.SpherePoint(center, radius, theta, phi).Round();
                    Point3D point2 = G3.SpherePoint(center, radius, theta, phi + dphi).Round();
                    Point3D point3 = G3.SpherePoint(center, radius, theta + dtheta, phi + dphi).Round();
                    Point3D point4 = G3.SpherePoint(center, radius, theta + dtheta, phi).Round();

                    // Find this piece's texture coordinates.
                    Point coords1 = new Point((double)t / numTheta, (double)p / numPhi);
                    Point coords2 = new Point((double)t / numTheta, (double)(p + 1) / numPhi);
                    Point coords3 = new Point((double)(t + 1) / numTheta, (double)(p + 1) / numPhi);
                    Point coords4 = new Point((double)(t + 1) / numTheta, (double)p / numPhi);

                    // Find this piece's normals.
                    Vector3D normal1 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta, phi).Round();
                    Vector3D normal2 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta, phi + dphi).Round();
                    Vector3D normal3 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta + dtheta, phi + dphi).Round();
                    Vector3D normal4 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta + dtheta, phi).Round();

                    // Make the first triangle.
                    int index = mesh.Positions.Count;
                    mesh.Positions.Add(point1);
                    if (smooth)
                    {
                        mesh.Normals.Add(normal1);
                    }
                    mesh.TextureCoordinates.Add(coords1);

                    mesh.Positions.Add(point2);
                    if (smooth)
                    {
                        mesh.Normals.Add(normal2);
                    }
                    mesh.TextureCoordinates.Add(coords2);

                    mesh.Positions.Add(point3);
                    if (smooth)
                    {
                        mesh.Normals.Add(normal3);
                    }
                    mesh.TextureCoordinates.Add(coords3);

                    mesh.TriangleIndices.Add(index++);
                    mesh.TriangleIndices.Add(index++);
                    mesh.TriangleIndices.Add(index++);

                    // Make the second triangle.
                    mesh.Positions.Add(point1);
                    if (smooth)
                    {
                        mesh.Normals.Add(normal1);
                    }
                    mesh.TextureCoordinates.Add(coords1);

                    mesh.Positions.Add(point3);
                    if (smooth)
                    {
                        mesh.Normals.Add(normal3);
                    }
                    mesh.TextureCoordinates.Add(coords3);

                    mesh.Positions.Add(point4);
                    if (smooth)
                    {
                        mesh.Normals.Add(normal4);
                    }
                    mesh.TextureCoordinates.Add(coords4);

                    mesh.TriangleIndices.Add(index++);
                    mesh.TriangleIndices.Add(index++);
                    mesh.TriangleIndices.Add(index++);

                    phi += dphi;
                }
                theta += dtheta;
            }
        }