3-Dimensional space

Explore Thurston's geometries

Welcome!

This project is joint work by Remi Coulon, Sabetta Matsumoto, Henry Segerman, and Steve Trettel to render accurate images of the eight Thurston geometries and their quotients. We are working hard to make a version of this software accessible to anyone who wants to explore, and encourage you to check out the GitHub repository and our papers on the topic (both technical and expository) for much more information. This website hosts various demonstrations we have created along the way, as well as tutorials and documentation for the code. Enjoy!

We are still in the process of creating new scenarios to explore the features of Thurston’s geometries. We will post them on this page regularly. So, do not hesitate to come back!

News

  • December 13, 2022. We just launched the new version of this webpage!

A first view of Thurston geometries…

Exploring the Simulations

In the Geometries section you will find a short introduction about each of the eight Thurston geometries. Each of them comes with images, videos, and numerous simulations that you can explore in real time on your own computer.

$\mathbb E^3$
$\mathbb E^3$
$S^3$
$S^3$
$\mathbb H^3$
$\mathbb H^3$
$S^2 \times \mathbb E$
$S^2 \times \mathbb E$
$\mathbb H^2 \times \mathbb E$
$\mathbb H^2 \times \mathbb E$
Nil
Nil
$\widetilde{\rm SL}(2,\mathbb R)$
$\widetilde{\rm SL}(2,\mathbb R)$
Sol
Sol

Awards

The image Hyperbolic Blue has been awarded with the Grand Prix du jury from the competition La preuve par l’image organized by the CNRS in partnership with the Acfas.

Virtual reality and Path tracing

Our software comes with several rendering mode. In addition to the standard view, there is

  • a virtual reality mode, that is normally compatible with any virtual reality headset supporting WebXR
  • a path tracer mode, to produce high quality pictures that capture various optic effects (diffusion, reflection, refraction, soft shadows, etc). This mode is not real time.

Check out the examples available in each geometry.

Learn More

Raymarching Thurston geometries

In this article, we provide a quick introduction to the Thurston geometries and describe all the mathematical tools involved in the project. In particular, for each geometry, we provide

  • an integral form for the geodesic flow,
  • explicit examples of co-compact lattices,
  • the light attenuation
  • etc

More resources can be found in the Learn more section

Diving into the Code

We are working to make this project user-friendly by providing a means of building a scene in JavaScript similar to ThreeJS. We have implemented a number of basic primitive objects (spheres, planes, cylinders, etc.) and compact manifolds for each geometry. Building your own scene amounts to writing a scene description such as below, which renders the following example.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// import the required tools from our library and Three.js
import {
    ThurstonLite,
    freeAbelianSet as torus,
    Point,
    PointLight,
    CheckerboardMaterial,
    phongWrap,
    LocalBallShape,
    complement,
    Solid
} from "thurstonEuc";
import {Color, Vector2} from "three";

// setup the renderer
const thurston = new ThurstonLite(torus, {keyboard: 'us'});

// lights
const light0 = new PointLight(
    new Point(1, 0, 0),
    new Color(1, 1, 1),
);
const light1 = new PointLight(
    new Point(0, 0, -1),
    new Color(1, 1, 1)
);
const light2 = new PointLight(
    new Point(0, 0, 1),
    new Color(1, 1, 1)
);

// checkerboard material
const checkerboardBase = new CheckerboardMaterial(
    new Vector2(Math.PI, 0),
    new Vector2(0, Math.PI),
    new Color(0.9, 0.9, 1),
    new Color(0, 0, 0.1)
)
const checkerboardPhong = phongWrap(checkerboardBase);

// complement of a local ball
const centerBall = new LocalBallShape(
    new Point(0, 0, 0),
    1.3,
);
const latticeShape = complement(centerBall);
const lattice = new Solid(latticeShape, checkerboardPhong);

// add lights and objects in the scene
thurston.add(lattice, light0, light1, light2);
// run the renderer
thurston.run();
Running the code
Running the code

This executes the code above to provide an inside view of the 3-torus with a tiling built from the complement of a sphere.

If you want to learn more and build your own scenes, take a look that the tutorials in the documentation