What’s the difference between an orientation and a rotation?

This question came up at work recently, and I was unable to find a really good answer online. For the purposes of this article, I will be using the terms orientation and rotation as they are used in computer graphics; this might not be the same definitions you are used to.

If you search online for what the difference is between a rotation and an orientation, then you get several seemingly conflicting answers:

  • ‘An orientation is given by Euler angles, whereas a rotation is given by a quaternion.’
  • ‘An orientation is the destination that you reach at the end of a rotation; the rotation is the route to that destination.’
  • ‘Orientations only allow you to rotate from \(0\) to \(360\) degrees, whereas rotations allow you to go beyond \(360\) degrees.

I think the last of these is the one that comes closest. In the two-dimensional case, the answer is easy: an orientation is an element of \(SO(2)\) (i.e., confusingly, a rotation matrix), whereas a rotation also comes equipped with a winding number about the origin. If we want, we can identify orientations of 2D space with elements of the circle \(S^1\) and rotations with real numbers. Then we have a continuous function \(\lambda\) from rotations to orientations given by \(\lambda(x) = e^{2\pi i x}\).

This continuous map \(\lambda\) has an important property: it is a covering map. This means that if \(z\) is some orientation, then there is some open neighbourhood \(U\) of \(z\) such that \(\lambda\inv U\) is the union of disjoint open sets, each mapped homeomorphically on to \(U\) by \(\lambda\). This means that if \(x\) is a rotation, and we modify the corresponding orientation \(\lambda(x)\) very slightly, to get an orientation $w$ then we can get a corresponding modified rotation \(y\) such that \(\lambda(y) = w\).

This means that, for example, if we were filming a rotating object then, assuming our frame rate were fast enough, we could track the overall rotation of the object over time by capturing its orientation at each frame. Why might we want to do this?

Let’s look at an example. There’s a game called Getting Over It with Bennett Foddy, in which you control a character named Diogenes who lives in a barrel. The only way Diogenes can get around is by moving a hammer in circles around his body. The player controls the hammer by moving the mouse around, and the tip of the hammer follows the mouse point.

In the real game, he can move the hammer in a full circle. But let’s suppose instead that he was unable to move the hammer through the bottom of the circle — perhaps the barrel is in the way.
If we only keep track of the orientation of the the mouse cursor around the centre of the rotation, we are at risk of introducing some graphical glitches. Suppose the player moves the mouse in a straight line right through the bottom of the barrel. Then we will move very suddenly from this position

to this one.

Since we would like to give the impression of continuous motion, this is undesirable. If, however, we keep track of the overall rotation of the mouse cursor, then the game will know that it should not jump to the second position, because the rotation is \(390^\circ\), rather than \(30^\circ\).

Now the input to the game is given by the mouse position: loosely speaking, an orientation. Therefore, the property of covering spaces that we have mentioned above is crucial: as long as we can assume that we are sampling the mouse position quickly enough, we can translate the changing mouse orientations into chainging rotations, which the game can then understand.

Another way to understand this is to recall that covering maps satisfy a property called path lifting: if \(p \colon X \to Y\) is a covering map, \(\gamma \colon [0,1] \to Y\) is a path in \(Y\) and \(x\) is a point in \(X\) such that \(p(x) = \gamma(0)\), then there is a path \(\hat{\gamma} \colon [0,1] \to X\) such that \(\hat{\gamma}(0) = x\) and \(p\circ\hat{\gamma} = \gamma\).

The covering map \(\lambda\) of \(S^1\) by the real line is particularly important, because the real line is simply connected, meaning that it is in fact a universal cover for \(S^1\). A universal cover is defined as a covering map whose source is simply connected, but the word universal refers to the fact that we can prove that any other covering map must factor through the universal cover. There are infinitely many coverings maps on to the circle (indeed, take the map from \(S^1\) to itself given by \(e^{i\theta} \mapsto e^{ni\theta}\) for any \(n\)), but the real line is the one that stores the most information.

An important fact about universal covers \(p \colon U \to X\), which we shall come back to later, is that the order of the cover (i.e., the order of the set \(p^{-1}({x})\) for any \(x\)) is the same as the order of the fundamental group of \(X\). \(S^1\) has fundamental group \(\mathbb Z\), so there are infinitely many rotations corresponding to any particular orientation.

A fact in topology is that any space \(X\) that is connected, locally path-connected and semilocally simply-connected admits a universal cover [If you are ever bored in an airport, get out some paper and work out the proof. If you, like most people, don’t know what ‘semilocally simply-connected’ means, don’t look it up – just start writing out the proof and work it out for yourself.]. It therefore makes sense to generalize our discussion above to \(n\) dimensions as follows.

  • An orientation of \(\mathbb R^n\) is an element of \(SO(n)\).
  • A rotation of \(\mathbb R^n\) is an element of the (technically, a) universal cover of \(SO(n)\).

This brings us back to the second answer at the top of the article, because the elements of the univeral cover of a space \(X\) may be identified with homotopy classes of paths in \(X\) from a fixed source point \(x_0\). Therefore (up to homotopy) a rotation of \(\mathbb R^n\) really does encode the history of all the orientations that an object has been through, where the word ‘history’ is taken in the most basic sense imaginable: a path through the space of orientations.

That ‘(up to homotopy)’ becomes a lot more important in \(n>2\) than in \(2\) dimensions, however. In two dimensions, there is not much difference between two homotopic paths around the circle: they might travel at different speeds for different parts of the journey, or one might overshoot the target and double back. But the two paths are still clearly the same rotation in some sense. In three dimensions and above, more complicated homotopies between paths. Watch the rotating candles in this Balinese candle dance, for example.

Balinese demonstration that \(\pi_1(SO(2))\) is the cyclic group of order \(2\).

The candles rotate about the up-down axis by two full rotations, yet the dancers’ arms are completely untwisted at the end. This reflects a fact about \(SO(3)\): a rotation of \(360^\circ\) is not homotopic to the identity, but a rotation of \(720^\circ\) is. In fact, the fundamental group of \(SO(3)\) is \(\mathbb Z/2\), which means that its universal cover is a double cover: there are precisely two rotations corresponding to each orientation of 3D space.

This might not be a problem if we wanted to extend our man-in-a-barrel example to 3D space. In that case, we didn’t really need to track infinitely many rotations around the centre: just being able to tell when we’d gone slightly more than a full rotation round was enough. But for more complicated linkages of multiple joints, this mathematical fact can lead to problems that are very difficult to solve.

Where do quaternions come into this? The simple answer is that the space of unit quaternions is the universal cover for \(SO(3)\). That is, the universal cover of \(SO(3)\) is the \(3\)-sphere \(S^3\), and if we identify \(S^3\) with the unit quaternions then the covering map commutes with quaternion multiplication and multiplication of matrices. Therefore, we can store rotations of 3D space with quaternions (four numbers), while orientations require less nice representations such as matrices (nine numbers) or Euler angles (three numbers, but without the nice properties of covering maps).

The topological closed graph theorem

There are a number of theorems in various settings that link continuity of a function \(f\colon X \to Y\) to closedness of that function’s graph – i.e., the set of all points \((x,y)\in X \times Y\) such that \(y = f(x)\).

For example, we learn in functional analysis that if \(f \colon X \to Y\) is a linear map between Banach spaces, then \(f\) is continuous if and only if its graph is a closed subspace of \(X \times Y\).

Normally, when we learn this fact, we also learn a particular way of looking at it. We know that a function \(f \colon X \to Y\) is continuous if and only if whenever \(x_n \to x\) is a convergent sequence in \(X\), we have \(f(x_n) \to f(x)\) in \(Y\).

Meanwhile, to say that the graph of \(f\) is closed means that it contains all its limit points in \(X \times Y\): i.e., the graph of \(f\) is closed if and only if whenever \(x_n \to x\) is a convergent sequence in \(X\) such that \(f(x_n) \to y\) for some \(y\), we have \(y = f(x)\).

It’s clear then, that continuity of \(f\) is a stronger statement than closedness of its graph: to prove that \(f\) has a closed graph, we can proceed exactly as we would for proving continuity of \(f\), except that we only need to consider those convergent sequences \(x_n \to x\) such that \(f(x_n)\) converges to some limit \(y\).

Let’s turn this into a formal proof: we’re given a continuous function \(f \colon X \to Y\) between (say) normed spaces \(X\) and \(Y\), and we want to prove that the graph of \(f\) is closed. Let \(x_n \to x\) be a convergent sequence in \(X\), and suppose that \(f(x_n) \to y\) in \(Y\). Then, by continuity of \(f\), we know that \(f(x_n) \to f(x)\). Therefore, \(y = f(x)\) by uniqueness of limits.

This last part – uniqueness of limits in \(Y\) – plays an essential role, which we see when we try to generalize this implication to arbitrary topological spaces. In more general topological spaces, sequences can converge to more than one limit – and, indeed, it is possible for a continuous function to have a graph that is not closed.

However, if \(Y\) is a Hausdorff space, then limits of sequences in \(Y\) are unique, and we get our first topological closed graph theorem.

Exercise 1. Let \(X,Y\) be topological spaces, where \(Y\) is a Hausdorff space. Prove that if \(f \colon X \to Y\) is a continuous function, then the graph of \(f\) is closed.

More exciting is that we can use this as a characterization of Hausdorff spaces: i.e., if \(Y\) is a topological space such that the graph of any continuous function into \(Y\) is closed, then \(Y\) must be a Hausdorff space. In fact, it suffices to consider the identity function \(Y \to Y\).

Exercise 2. Convince yourself that the statement ‘\(Y\) is a Hausdorff space’ is exactly the same thing as saying that the graph of the identity function \(Y \to Y\) is closed in \(Y \times Y\).

That’s nice, but what about the other direction? In functional analysis, we know that the converse holds when \(X\) and \(Y\) are Banach spaces, but the topological version is a bit different.

Exercise 3. Let \(X,Y\) be topological spaces, where \(Y\) is compact. Let \(f\colon X \to Y\) be a function such that the graph of \(f\) is closed in \(X \times Y\). Prove that \(f\) is continuous.

(This is very different from the theorem in analysis: non-zero dimensional Banach spaces are never compact!)

It would be very nice if this theorem gave a characterization of compact topological spaces in the same way that the other direction gave a characterization of Hausdorff spaces: we often see ‘compact’ and ‘Hausdorff’ together as though they were brother concepts, even though the definitions are very different, so the prospect of giving new, more explicitly dual definitions for them is attractive.

Unfortunately, there are spaces \(Y\) that satisfy the conclusion of Exercise 3 (for arbitrary \(X\)) without being compact. As an example, give the set \(\mathbb N\) of natural numbers a topology by declaring the open sets to be the downward closed sets (i.e., those sets \(U\) such that if \(n \in U\) and \(m \le n\) then \(m \in U\)).

Exercise 4. Prove that if \(X\) is a non-empty topological space and \(f \colon X \to \mathbb N\) is a function, then the graph of \(f\) is not closed.

Thus, the conclusion of Exercise 3 is vacuously satisfied for this space \(\mathbb N\): the only function into \(\mathbb N\) that has a closed graph is the empty function, which is obviously continuous. Nevertheless, \(\mathbb N\) with this topology is certainly not compact.

The problem here is that some particularly nasty topological spaces throw up barriers to graphs being closed that are unrelated to whether or not the underlying functions are continuous. If we examine the example above a bit more closely, it becomes clear that the fundamental property of a graph of a function \(X \to Y\) – namely, that it intersects each set \(\{x\} \times Y\) in a single point – is not in general compatible with being a closed set.

To try and get around this, we’ll relax this property by generalizing from functions to relations: i.e., functions that can take multiple values – or no value at all. We can identify a relation between spaces \(X\) and \(Y\) with its graph, which is an arbitrary subset of \(X \times Y\).

Let’s start by trying to extend the definition of continuity to relations. We know that a function \(f \colon X \to Y\) is continuous if and only if \(f^{-1}(U)\) is open in \(X\) whenever \(U\) is an open set in \(Y\).

Definition 5. Let \(R \subset X \times Y\) be a relation. Given a subset \(Z\) of \(Y\), we write \(R^{-1}(Z)\) for the set of all \(x\in X\) such that \((x, z)\in R\) for some \(z\in Z\). We say that \(R\) is continuous if \(R^{-1}(U)\) is open in \(X\) for any open subset \(U\) of \(Y\).

We can readily extend our earlier result to continuous relations.

Exercise 6. Let \(X,Y\) be topological spaces, where \(Y\) is compact. Let \(R\subset X \times Y\) be a closed set. Prove that \(R\) is a continuous relation between \(X\) and \(Y\).

What is more exciting is that we can use this to give a characterization of compactness. We will use an adapted version of a lovely argument due to Martín Escardó (see the brilliantly named Intersections of Compactly Many Open Sets are Open [1]).

Theorem 7. Let \(Y\) be a topological space, and suppose that whenever \(X\) is a topological space and \(R\subset X \times Y\) is a closed space, then \(R\) is a continuous relation between \(X\) and \(Y\). Then \(Y\) is compact.

Proof. Let \((U_\alpha)_{\alpha\in A}\) be an open cover of \(Y\). Define a topological space \(X\) as follows.

  • The points of \(X\) are the open sets \(U\) of \(Y\).
  • A set \(\mathcal U\subset X\) is open if:
    • it is upwards closed – i.e., if \(U \in \mathcal U\) and \(U \subset V\), then \(V \in \mathcal U\); and if
    • there is some \(U \in \mathcal U\) such that \(U\) may be written as the union of finitely many of the \(U_\alpha\).

To show that \((U_\alpha)\) admits a finite subcover, it will suffice to prove that the set \(\{Y\}\) is open in \(X\). Since \((U_\alpha)\) was arbitrary, this will suffice to prove that \(Y\) is compact.

First, however, we need to show that this is indeed a valid topology on \(X\). It is easy to see that it is closed under unions. Moreover, if we have two such sets \(\mathcal U\) and \(\mathcal V\), then the intersection \(\mathcal U \cap \mathcal V\) is certainly upwards closed; moreover, we have some \(U \in \mathcal U\) and \(V \in \mathcal V\) such that \(U\) and \(V\) are the union of finitely many of the \(U_\alpha\): then \(U \cup V\) is also the union of finitely many of the \(U_\alpha\), and is contained in both \(\mathcal U\) and \(\mathcal V\) by upwards closedness.

[As an aside, notice how our new definition of compactness doesn’t mention finiteness at all: the argument above shows that this is because it has, in some sense, been ‘cancelled out’ by the fact that open sets in a topological space must be closed under finite intersections. If you’ve ever used compactness in a proof in order to show that a particular collection of open sets can be taken to be finite and therefore to have an open intersection (for example, in Exercise 3), then there’s a good chance that you’d have been better served by using this new definition.]

We will now consider the relation \(\not\ni\) between \(X\) and \(Y\) (i.e., \(U \not\ni x\) if it is not the case that \(x \in U\)). We claim that the graph of this relation is closed in \(X \times Y\).

Indeed, suppose that \(x\in V\) – so \((V, x)\) is in the complement of \(\not\ni\). We seek an open neighbourhood of \((V, x)\) that does not intersect with \(\not\ni\). Indeed, since \((U_\alpha)\) is an open cover of \(Y\), there is some \(U_\beta\) such that \(x\in U_\beta\). Then let \(\mathcal V\) be the set of all open sets in \(Y\) that contain \(U_\beta \cap V\).

\(\mathcal V\) is certainly upwards closed: moreover, it contains \(U_\beta\), so it is open in \(X\). Then the set $$\mathcal V \times (U_\beta \cap V)$$ is an open neighbourhood of \((V, x)\) in \(X \times Y\), and it does not intersect the graph of \(\not\ni\), since every set in \(\mathcal V\) contains every element of \(U_\beta \cap V\) by definition. This completes the proof that \(\not\ni\) is closed in \(X \times Y\).

By hypothesis, we can deduce that \(\not\ni\) is a continuous relation. In particular, this means that \(\not\ni^{-1}(Y)\) is closed in \(Y\). But this is precisely the set of all open subsets \(U \subset Y\) such that \(x \not \in U\) for some \(x\) – i.e., the set of all proper open subsets of \(Y\). So \(\{Y\}\) is the complement of this closed set and is therefore open as desired. \(\Box\)

Unfortunately, it’s not necessarily true that the graph of a continuous relation into a Hausdorff space is always closed, so we don’t quite get that explicitly dual pair of definitions for ‘compact space’ and ‘Hausdorff space’. I think we’ve come pretty close though!

[1] M. Escardó, Intersections of compactly many open sets are open, 2009.
[Bibtex]
@MISC{MartinCompact,
author = {Martín Escardó},
title = {Intersections of compactly many open sets are open},
year = {2009}
}