I've been following the excellent Experilous procedural planet generation post, trying to recreate it in Java using libGDX. My planet is simpler, as it lacks any distortion of the mesh. It's just hexagons and 12 pentagons right now. However, I've been running into trouble at the part:

The example given by Experilous.

The next step was to take the motion of plates and calculate the type and degree of stress at each point along the boundaries between the plates. For each point, I calculated the movement of each plate at that particular position. Subtracting the two gave me the relative movement. I then determined the component of that movement that exactly perpendicular to the plate boundary at that location. This corresponded to the amount of relative movement that was directly pushing the plates into each other or pulling them directly away. This I classified as pressure, and it could be either positive (collision) or negative (separation). I also determined the relative movement that was parallel to the boundary and stored this as shear. (Only the magnitude of this movement was relevant, so shear was strictly non-negative.)

The picture is the example of each tile's motion following this calculation of drift and spin for the tectonic plates. However, the math to actually calculate this completely escapes me. Given that I have the tiles grouped into tectonic plates, a random center (of a tile) for each plate, the center of every tile, and the normal vector of every tile, how could I achieve the same effect depicted here?

Thank you.

  • \$\begingroup\$ It looks like the answers so far are addressing how you can integrate interactions between plates over time (so for example, a plate pushing down & right against another imparts a down/right/counter-clockwise motion onto the second). But if I understand your question correctly, the motions of the plates are taken to be constant once they've been randomly generated, just inputs to the next step. What you're really looking for is a way to quantify the pressure & shear at each point resulting from those motions. Is that accurate? \$\endgroup\$
    – DMGregory
    Feb 26, 2016 at 23:21
  • \$\begingroup\$ Any movement of your plates, in general, will deform the plates such that you will require defined "mid-oceanic ridges" where plate material is produced, and subduction zones where plate material is consumed. Both processes perform work, of course, which must obey the Law of Conservation of Energy based on (very, very) slow thermal cooling of the core. \$\endgroup\$ Mar 30, 2016 at 19:12
  • \$\begingroup\$ Sorry for taking so long to get back to this project! I'll be looking through some of these answers now. @DMGregory yes, that's right. The positions of these plates are static and I need to be able to quantify forces along the borders. \$\endgroup\$
    – Tim
    May 11, 2016 at 17:35
  • \$\begingroup\$ I noticed Loren Schmidt has been doing some experiments in a similar vein lately, so if anyone comes across this question looking for resources, they may be another good source of inspiration & suggestions. \$\endgroup\$
    – DMGregory
    Jun 6, 2017 at 3:59

2 Answers 2


Try to reduce the problem down to simple structures.

Representing each plate, mathematically, with a sphere:

  1. Centerpoint of each sphere is same distance from center of planet
  2. Radius of each sphere is determined by ratio of surface area vs. total (or similar)
  3. No intersecting spheres
  4. Each sphere can rotate around its' center point
  5. Each rotated sphere can also rotate around the planet's center point
  6. A sphere's radius determines the plate's "mass", allowing larger spheres to impart more force
  7. At run time, pick a sphere and give it a push
  8. Continually apply basic elastic collisions between the spheres

Whenever two spheres collide, both spheres impart a portion of their rotational velocity around the planet's center to each other, weighted by their proportional masses. At the same time, each one also imparts a portion of it's own sidereal rotation to the other. This means that larger masses can easily push smaller masses around. Similarly, a massive object spinning clockwise will impart a large counterclockwise force on less-massive objects it collides with.

Each frame, apply each sphere's changes to its' child tiles. The result of tile collisions should be proportionally scaled and then applied back to the parent sphere. Essentially, the spheres will try to rotate all of the tiles and the tiles that collide as a result provide feedback to the sphere.

Red arrows show the rotational velocity around the planet's center while green arrows show the local rotational velocity of each sphere. (Not to scale) Notice that adjacent spheres with complementary rotations generally have complementary "flow directions" while the areas near opposite rotations have generally opposite flows.

plates as spheres

Example collision:

Red is movement and green is rotation. The magenta arrows are approximations of the forces calculated at two example collision points. Both masses are of relatively similar size so neither has a clear advantage at the perpendicular intersection site; the two plates are likely to grind along the edge for a long time. The parallel collision site happens so far from the top-left sphere's "center of mass" that the lower-right sphere can easily overpower it. Over time, the two should dance such that the upper sphere "rolls" down the left edge of the lower sphere.

collision vectors

Assuming the other plates allowed it:

time progression


What you're referring to as spin is formally called angular momentum. Depending on the level of detail you want, it can get complicated fast; this Q/A on Simulating Torque and Angular Momentum might be a good starting point.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .