Generating Artificial Asteroids

Written by Paul Bourke
February 2001


The following describes a method that was used to create a variety of forms resembling asteroids. The asteroids were going to be rendered and for these examples PovRay did the rendering. The approach was to start with a sphere and create a number of positive or negative bulges, the bulges have a distribution of sizes (radii) and height/depth.

If normal polar coordinate spheres were used a pinching would occur at the poles, in addition, that method doesn't make the most efficient use of polygons. For these reasons an approximately even distribution of triangular facets was used, this is created by iteratively tessellating platonic solids, in particular, tetrahedra. All the examples here were made from unit spheres with either 8*46 or 8*47 triangular facets.

global_settings {
   ambient_light
   rgb <1.0,1.0,1.0>
}

background {
   color rgb <0,0,0>
}

light_source {
   <0,3,-2>
   color rgb <1,1,1>
}

camera {
   location <0,0,-4>
   up y
   right 4*x/3
   angle 60
   sky <0,1,0>
   look_at <0,0,0>
}

To create a bulge an "impact" center is chosen at random on the surface of the current asteroid. All vertices within a chosen radius are perturbed normal to the surface, the degree of perturbation falls off linearly with distance away from the center of impact. The user controls the radius range, depth range, and the number of impacts. This seemed to give sufficient control over the final shape. Planet type objects are created with small shallow bulges (with respect to the initial sphere). More extreme cases are formed as the radius and depth are increased.

#declare asteroidfinish = finish {
   ambient 0.5
   diffuse 1
   specular 0.3
   roughness .1
}

#declare asteroidnormal = normal {
   bumps 0.5
   scale 0.02
}

#declare asteroidmat = texture {
   pigment {
      color rgb <0.5,0.5,0.5>
   }
   finish { asteroidfinish }
   normal { asteroidnormal }
}
mesh {
   triangle {
      <0.5552, 0.0000,0.4155>,
      <0.6057,-0.0145,0.4212>,
      <0.5902, 0.0141,0.4120>
      texture { asteroidmat }
   }
   triangle {
      < 0.0000,0.6127,0.4415>,
      < 0.0141,0.6311,0.4261>,
      <-0.0145,0.6507,0.4377>
      texture { asteroidmat }
   }
   :
   :
   :
   triangle {
      <-0.4130,-0.7390,-0.4550>,
      <-0.4055,-0.7686,-0.4407>,
      <-0.4227,-0.7487,-0.4349>
      texture { asteroidmat }
   }
   rotate <clock*171.11,
              clock*666.71,
              clock*333.33>
}

Note the rotation at the end of the PovRay mesh primitive, it keeps the asteroid rotating in animation sequences without obvious cyclic repetition.

The real thing

Craters

An attempt at craters was made by perturbing the surface with a radial Gaussian function. In order to achieve satisfactory resolution the triangle count was increased to about half a million, the rendering time was still under 1 minute per frame.

A better model of crater profile would undoubtedly help, for example the variation in shape can be seen from some of the moon craters shown below.

Kleopatra "dog-bone" asteroid

The following asteroid is modelled after the 216 Kleopatra asteroid. The basic geometry is based upon the Cassini oval and bulges or craters are added to various extents. The source code that created the PovRay models is: gencassini.c.

The real thing, asteroid 216 Kleopatra

The so called "dog bone asteroid" shown below is imaged from Arecibo radar in Puerto Rico. (Image courtesy JPL). The asteroid is just over 210km long and at most 100km thick, and is located about 171,000,000km from Earth (around the same distance as Jupiter).




Asteroid topology models

Written by Paul Bourke
September 2002

Model sources from JPL NASA, S. Hudson, Mitchell, S. Ostro, and K. Rosema.


2063 Bacchus -- bacchus.tri -- bacchus.pov
Discovered: April 24, 1977 by Charles Kowal
Size: 1.1km x 2.6km
Rotational period: 14.9 hours
Orbital period: 2.73735 years

4769 Castalia -- castalia.tri -- castalia.pov
Discovered: August 9, 1989, by Eleanor Helin
Size: 1.8km x 0.8km
Rotational period: 4.07 hours
Orbital period: 1.1 years

433 Eros -- eros.tri -- eros.pov
Discovered: August 13, 1898, by Gustav Witt
Size: 33km x 13km x 13km
Rotational period: 5.27 hours
Orbital period: 1.76 years

1620 Geographos -- geographos.tri -- geographos.pov
Discovered: September 14, 1951
Size: 5.1km x 1.8km
Rotational period: 5.22 hours
Orbital period: 1.39 years

6489 Golevka -- golevka.tri -- golevka.pov
Discovered: May 10, 1991
Size: 0.35km x 0.25km
Rotational period: 6.0264 hours
Orbital period: 3.98561 years

216 Kleopatra -- kleopatra.tri -- kleopatra.pov
Discovered: 1880
Size: 217km x 94km x 81km
Rotational period: 5.385 hours

1998 Ky26 -- ky26.tri -- ky26.pov
Discovered: June 1, 1998
Size: 30m diameter
Rotational period: 10.7 minutes
Orbital period: 1.36766 years

4179 Toutatis -- toutatis.tri -- toutatis.pov
Discovered: January 4, 1989 by C.Pollas.
Size: 4.6km x 2.4km x 1.9km
Rotational period: 5.4 and 7.3 Earth days
Orbital period: 3.98 years

3D StudioMax script that reads the ".tri" models found here.

Rapid prototype models