Chapter 7 Polar Coordinate Systems Fletcher Dunn Ian Parberry Valve Software University of North Texas 3D Math Primer for Graphics & Game Development What You’ll See in This Chapter This chapter describes the polar coordinate system. It is divided into four sections. • Section 7.1 describes 2D polar coordinates. • Section 7.2 gives some examples where polar coordinates are preferable to Cartesian coordinates. • Section 7.3 shows how polar space works in 3D and introduces cylindrical and spherical coordinates. • Section 7.4 makes it clear that polar space can be used to describe vectors as well as positions. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 2 Word Cloud Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 3 Section 7.1: 2D Polar Coordinates Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 4 Polar Coordinate Space • Recall that 2D Cartesian coordinate space has an origin and two axes that pass through the origin. • A 2D polar coordinate space also has an origin (known as the pole), which has the same basic purpose: it defines the center of the coordinate space. • A polar coordinate space only has one axis, sometimes called the polar axis, which is usually depicted as a ray from the origin. • It is customary in math literature for the polar axis to point to the right in diagrams, and thus it corresponds to the +x axis in a Cartesian system. • It's often convenient to use different conventions than this, as we'll discuss later in this lecture. Until then, we’ll use the traditional conventions of the math literature. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 5 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 6 Polar Coordinates • In Cartesian coordinates we described a 2D point using the using two signed distances, x and y. • Polar coordinates use a distance and an angle. • By convention, the distance is usually called r (which is short for radius) and the angle is usually called θ. The polar coordinate pair (r, θ) species a point in 2D space as follows: 1. Start at the origin, facing in the direction of the polar axis, and rotate by angle θ. Positive values of θ are usually interpreted to mean counterclockwise rotation, with negative values indicating clockwise rotation. 2. Now move forward from the origin a distance of r units. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 7 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 8 Examples Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 9 Polar Diagrams • The grid circles show lines of constant r. • The straight grid lines that pass through the origin show lines of constant θ, consisting of points that are the same direction from the origin. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 10 Angular Measurement • It really doesn't matter whether you use degrees or radians (or grads, mils, minutes, signs, sextants, or Furmans) to measure angles, so long as you keep it straight. • In the text of our book we almost always give specific angular measurements in degrees and use the ° symbol after the number. • We do this because we are human beings, and most humans who are not math professors find it easier to deal with whole numbers rather than fractions of π. • Indeed, the choice of the number 360 was specifically designed to make fractions avoidable in many common cases. • However, computers prefer to work with angles expressed using radians, and so the code snippets in our book use radians rather than degrees. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 11 Some Ponderable Questions 1. Can the radial distance r ever be negative? 2. Can θ ever go outside of –180°≤ θ ≤ 180°? 3. The value of the angle directly west of the origin (i.e. for points where x < 0 and y = 0 using Cartesian coordinates) is ambiguous. Is θ equal to +180° or –180° for these points? 4. The polar coordinates for the origin itself are also ambiguous. Clearly r = 0, but what value of θ should we use? Wouldn't any value work? Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 12 Aliasing • The answer to all of these questions is “yes”. • In fact, for any given point, there are infinitely many polar coordinate pairs that can be used to describe that point. • This phenomenon is known as aliasing. • Two coordinate pairs are said to be aliases of each other if they have different numeric values but refer to the same point in space. • Notice that aliasing doesn't happen in Cartesian space. Each point in space is assigned exactly one (x, y) coordinate pair. • A given point in polar space corresponds to many coordinate pairs, but a coordinate pair unambiguously designates exactly one point. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 13 Creating Aliases • One way to create an alias for a point (r, θ) is to add a multiple of 360° to θ. Thus (r, θ) and (r, θ + k360°) describe the same point, where k is an integer. • We can also generate an alias by adding 180° to θ and negating r; which means we face the other direction, but we displace by the opposite amount. • In general, for any point (r, θ) other than the origin, all of the polar coordinates that are aliases for (r, θ) be expressed as: Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 14 Canonical Polar Coordinates A polar coordinate pair (r, θ) is in canonical form if all of the following are true: Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 15 Algorithm to Make (r, θ) Canonical 1. 2. 3. 4. If r = 0, then assign θ = 0. If r < 0, then negate r, and add 180° to θ. If θ ≤ 180°, then add 360° until θ > –180° If θ > 180°, then subtract 360° until θ ≤ 180°. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 16 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 17 A Nit-Picky Observation • Picky readers may notice that while this code ensures that θ is in range –π ≤ θ ≤ π radians, it does not explicitly avoid the case where θ = –π. • The value π cannot be represented exactly in floating point. In fact, because π is irrational, it can never be represented exactly with any finite number of digits in any base! • The value of the constant PI in our code is not exactly equal to π, it's the closest number to π that can be represented by a float. • While double precision arithmetic is closer, it’s not exact. • So, you can think of this function as returning a value from –π to π, exclusive. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 18 Converting from Polar to Cartesian Coordinates in 2D Converting polar coordinates (r, θ) to the corresponding Cartesian coordinates (x, y) follows from the definition of sin and cos. x = r cos θ y = r sin θ Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 19 Converting from Cartesian to Polar Coordinates in 2D • Computing polar coordinates (r, θ) from Cartesian coordinates (x, y) is slightly tricky. • Due to aliasing, there isn't only one right answer; there are infinitely many (r, θ) pairs that describe the point (x, y). • Usually, we want canonical coordinates. • We can easily compute r using Pythagoras's theorem Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 20 Solve for θ Computing r was pretty easy. Now solve for θ: Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 21 Pause for Thought • • • • There are two problems with this approach. The first is that if x = 0, then the division is undefined. The second is that arctan has a range from –90° to +90°. The basic problem is that the division y/x effectively discards some useful information when x = y. Both x and y can either be positive or negative, resulting in four different possibilities, corresponding to the four different quadrants that may contain the point. But the division y/x results in a single value. • If we negate both x and y, we move to a different quadrant in the plane, but the ratio x/y doesn't change. • Because of these problems, the complete equation for conversion from Cartesian to polar coordinates requires some if statements to handle each quadrant, and is a bit of a mess for math people. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 22 atan2 • Luckily, programmers have the atan2 function, which properly computes the angle for all x and y except for the pesky case at the origin. • Borrowing this notation, let's define an atan2 function we can use in these notes in our math notation. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 23 atan2 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 24 Two Key Observations Two key observations about this definition. 1. First, following the convention of the atan2 function as found in the standard libraries of most computer languages, the arguments are in reverse order: y, x. You can either just remember that it's reversed, or you might find it handy to remember that atan2(y, x) is similar to arctan(y/x). Or remember that tan θ = sin θ / cos θ, and θ = atan2(sin θ, cos θ). 2. Second, in many software libraries, the atan2 function is undefined at the origin, when x = y = 0. The atan2 function we are defining for use in our equations in these notes is defined such that atan2(0, 0) = 0. In our code snippets we'll use atan2 and explicitly handle the origin as a special case, but in our equations, we'll use atan2 which is defined at the origin. (Note the difference in typeface.) Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 25 Computing θ • Back to the task at hand: computing the polar angle θ from a set of 2D Cartesian coordinates. • Armed with the atan2 function, we can easily convert 2D Cartesian coordinates to polar form. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 26 Code Snippet Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 27 Section 7.2: Why Use Polar Coordinates? Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 28 Why Use Polar Coordinates? • They’re better for humans (eg. “I live 22 miles NNE of Dallas, TX”) • They’re useful in video games (for cameras and turrets and assassin’s arms, oh my). • Sometimes we even use 3D spherical coordinates for locating things on the globe – latitude and longitude. More coming up… Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 29 Section 7.3: 3D Polar Space Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 30 3D Polar Space There are two kinds in common use: 1. Cylindrical coordinates – 1 angle and 2 distances 2. Spherical coordinates – 2 angles and 1 distance Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 31 3D Cylindrical Space To locate the point described by cylindrical coordinates (r, θ, z), start by processing r and θ just like we would for 2D polar coordinates, and then move up or down the z axis by z. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 32 3D Spherical Coordinates • As with 2D polar coordinates, 3D spherical coordinates also work by defining a direction and distance. • The only difference is that in 3D it takes two angles to define a direction. • There are two polar axes in 3D spherical space. 1. The first axis is horizontal and corresponds to the polar axis in 2D polar coordinates or +x in our 3D Cartesian conventions. 2. The other axis is vertical, corresponding to +y in our 3D Cartesian conventions. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 33 Notational Confusion • Different people use different conventions and notation for spherical coordinates, but most “math people” have agreed that the two angles are named θ and φ. • Math people also are in general agreement about how these two angles are to be interpreted to define a direction. • You can imagine it like this: Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 34 Finding the Point (r, θ, φ) 1. Begin by standing at the origin, facing the direction of the horizontal polar axis. The vertical axis points from your feet to your head. 2. Rotate counterclockwise by the angle θ (the same way that we did for 2D polar coordinates). 3. Point your arm straight up, in the direction of the vertical polar axis. 4. Rotate your arm downward by the angle φ. Your arm now points in the direction specified by the polar angles θ, φ. 5. Displace from the origin along this direction by the distance r, and we've arrived at the point described by the spherical coordinates (r, θ, φ). Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 35 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 36 Azimuth, Zenith, Lat, and Long • The horizontal angle θ is known as the azimuth, and φ is the zenith. • Other terms that you've probably heard are longitude and latitude. • Longitude is basically θ, and latitude is the angle of inclination, 90° – φ. • So you see, the latitude/longitude system for describing locations on planet Earth is actually a type of spherical coordinate system. • We're often only interested in describing points on the planet's surface, and so the radial distance r, which would measure the distance to the center of the Earth, isn't necessary. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 37 Visualizing Polar Coordinates • The spherical coordinate system described in the previous section is the traditional right handed system used by “math people.” • We'll soon see that the formulas for converting between Cartesian and spherical coordinates are rather elegant under these assumptions. • However, if you are like most people in the video game industry, you probably spend more time visualizing geometry than manipulating equations, and for our purposes these conventions carry a few irritating disadvantages: Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 38 Irritating Disadvantage 1 The default horizontal direction at θ = 0 points in the direction of +x. • This is unfortunate, since for us, +x points “to the right” or “east,” neither of which are the default directions in most people's mind. • Similar to the way that numbers on a clock start at the top, it would be nicer for us if the horizontal polar axis pointed towards +z, which is “forward” or “north.” Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 39 Irritating Disadvantage 2 The conventions for the angle φ are unfortunate in several respects. • It would be nicer if the 2D polar coordinates (r, θ) were extended into 3D simply by adding a third coordinate of zero, like we extend the Cartesian system from 2D to 3D. • But the spherical coordinates (r, θ, 0) don't correspond to the 2D polar coordinates (r, θ) as we'd like. • In fact, assigning φ = 0 puts us in the awkward situation of Gimbal lock, a singularity we'll describe later. • Instead, the points in the 2D plane are represented as (r, θ, 90°). • It might have been more intuitive to measure latitude, rather than zenith. Most people think of the default as “horizontal” and “up” as the extreme case. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 40 Irritating Disadvantage 3 • No offense to the Greeks, but θ and φ take a little while to get used to. • The symbol r isn't so bad because at least it stands for something meaningful: “radial distance” or “radius.” • Wouldn't it be great if the symbols we used to denote the angles were similarly short for English words, rather than completely arbitrary Greek symbols? Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 41 Irritating Disadvantages 4 and 5 4. It would be nice if the two angles for spherical coordinates were the same as the first two angles we use for Euler angles, which are used to describe orientation in 3D. (We're not going to discuss Euler angles until Chapter 8.) 5. It's a right-handed system, and we use a lefthanded system. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 42 Spherical Coordinates for Gamers • The horizontal angle θ we will rename to h, which is short for heading and is similar to a compass heading. A heading of zero indicates a direction of “forward” or “to the north”, depending on the context. This matches the standard aviation conventions. • If we assume our 3D cartesian conventions described in Chapter 1, then a heading of zero (and thus our primary polar axis) corresponds to +z. • Also, since we prefer a left-handed coordinate system, positive rotation will rotate clockwise when viewed from above. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 43 Spherical Coordinates for Gamers • The vertical angle φ is renamed to p, which is short for pitch and measures how much we are looking up or down. The default pitch value of zero indicates a horizontal direction, which is what most of us intuitively expect. • Perhaps not-so-intuitively, positive pitch rotates downward, which means that pitch actually measures the angle of declination. • This might seem to be a bad choice, but it is consistent with the left-hand rule. • Later we'll see how consistency with the left-hand rule bears fruit worth suffering this small measure of counterintuitiveness. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 44 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 45 Aliasing in 3D Spherical Coordinates • The first sure-fire way to generate an alias is to add a multiple of 360° to either angle. This is really the most trivial form of aliasing and is caused by the cyclic nature of angular measurements. • The other two forms of aliasing are a bit more interesting, because they are caused by the interdependence of the coordinates. In other words, the meaning of one coordinate r depends on the values of the other coordinate(s) – the angles) This dependency created a form of aliasing and a singularity: Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 46 The Aliasing and the Singularity • The aliasing in 2D polar space could be triggered by negating the radial distance r and adjusting the angle so that the opposite direction is indicated. We can do the same with spherical coordinates. Using our heading and pitch conventions, all we need to do is flip the heading by adding an odd multiple of 180°, and then negate the pitch. • The singularity in 2D polar space occurred at the origin, since the angular coordinate is irrelevant when r = 0. With spherical coordinates, both angles are irrelevant at the origin. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 47 That’s Not All, Folks • So spherical coordinates exhibit similar aliasing behavior because the meaning of r changes depending on the values of the angles. • However, spherical coordinates also suffer additional forms of aliasing because the pitch angle rotates about an axis that varies depending on the heading angle. • This creates an additional form of aliasing and an additional singularity, analogous to those caused by the dependence of r on the direction. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 48 More Aliasing and Singularities • Different heading and pitch values can result in the same direction, even excluding trivial aliasing of each individual angle. – An alias of (h, p) can be generated by (h±180°, 180° – p). – For example, instead of turning right 90°(facing east) and pitching down 45°, we could turn left 90°(facing west) and then pitch down 135°. – Although we would be upside down, we would still be looking in the same direction. • A singularity occurs when the pitch angle is set to 90° (or any alias of these values). – In this situation, known as Gimbal lock, the direction indicated is purely vertical (straight up or straight down), and the heading angle is irrelevant. – We'll have a great deal more to say about Gimbal lock when we discuss Euler angles in Chapter 8. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 49 Canonical Spherical Coordinates • Just as we did in 2D, we can define a set of canonical spherical coordinates such that any given point in 3D space maps unambiguously to exactly one coordinate triple within the canonical set. • We place similar restrictions on r and h as we did for polar coordinates. • Two additional constraints are added related to the pitch angle. 1. Pitch is restricted to be in the range –90° to 90°. 2. Since the heading value is irrelevant when pitch reaches the extreme values of Gimbal lock, we force h = 0 in that case. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 50 Conditions for Canonical Spherical Coordinates Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 51 Algorithm to Make (r, p, h) Canonical 1. 2. 3. 4. 5. 6. 7. If r = 0, then assign h = p = 0 If r < 0, then negate r, add 180° to h, and negate p If p < –90°, then add 360° to p until p ≥ –90° If p > 270°, then subtract 360° from p until p ≤ 270° If p > 90°, add 180° to h and set p = 180° –p If h ≤ –180°, then add 360° to h until h > –180° If h > 180°, then subtract 360° from h until h ≤ 180° Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 52 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 53 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 54 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 55 Converting Spherical Coordinates to 3D Cartesian Coordinates. • Let's see if we can convert spherical coordinates to 3D Cartesian coordinates. • For now, our discussion will use the traditional right-handed conventions for both Cartesian and spherical spaces. • Later we'll show conversions applicable to our left-handed conventions. • Examine the figure on the next slide, which shows both spherical and Cartesian coordinates. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 56 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 57 What is d? Notice that we've introduced a new variable d, the horizontal distance between the point and the vertical axis. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 58 Computing z From the right triangle with hypotenuse r and legs d and z, we see that z/r = cos φ, that is, z = r cos φ. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 59 Computing x and y • Consider that if φ = 90°, we basically have 2D polar coordinates. • Let x' and y' stand for the x and y coordinates that would result if φ = 90°. • As in 2D, x' = r cos θ, y' = r sin θ. • Notice that when φ = 90°, d = r. As φ decreases, d decreases, and by similar triangles x/x' = y/y' = d/r. Looking at triangle dzr again, we observe that d/r = sin φ. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 60 Putting it All Together Putting all this together, we have: x = r sin φ cos θ y = r sin φ sin θ z = r cos θ Using our gamer conventions: x = r cos p sin h y = –r sin p z = r cos p cos h Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 61 Continuing • r is easy: • As before, the singularity at the origin when r = 0 is handled as a special case. • The heading angle is surprisingly simple to compute using our atan2 function, h = atan2(x, z). • This trick works because atan2 only uses the ratio of its arguments and their signs. Examine the equations x = r cos p sin h, y = –r sin p, and z = r cos p cos h and notice that the scale factor of r cos p is common to both x and z. • Furthermore, by using canonical coordinates we are assuming r > 0 and –90° ≤ p ≤ 90°, thus cos p ≥ 0 and the common scale factor is always nonnegative. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 62 Finally • Finally, once we know r, we can solve for p from y. y = –r sin p –y/r = sin p p = arcsin(–y/r) • The arcsin function has a range of –90° to 90°, which fortunately coincides with the range for p within the canonical set. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 63 Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 64 Section 7.4: Using Polar Coordinates to Specify Vectors Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 65 Using Polar Coords to Specify Vectors • We've seen how to describe a point using polar coordinates, and how to describe a vector using cartesian coordinates. It's also possible to use polar form to describe vectors. • Polar coordinates directly describe the two key properties of a vector, its direction and length. • As for the details of how polar vectors work, we've actually already covered them. Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 66 That concludes Chapter 7. Next, Chapter 8: Rotation in Three Dimensions Chapter 7 Notes 3D Math Primer for Graphics & Game Dev 67