abrash-black-book/61-01.md
2013-12-30 20:26:41 +11:00

104 lines
5.1 KiB
Markdown

Chapter 61\
Frames of Reference {#Heading1}
--------------------
### The Fundamentals of the Math behind 3-D Graphics {#Heading2}
Several years ago, I opened a column in *Dr. Dobb's Journal* with a
story about singing my daughter to sleep with Beatles' songs. Beatles'
songs, at least the earlier ones, tend to be bouncy and pleasant, which
makes them suitable goodnight fodder—and there are a *lot* of them, a
useful hedge against terminal boredom. So for many good reasons, "Can't
Buy Me Love" and "A Hard Day's Night" and "Help!" and the rest were
evening staples for years.
No longer, though. You see, I got my wife some Beatles tapes for
Christmas, and we've all been listening to them in the car, and now that
my daughter has heard the real thing, she can barely stand to be in the
same room, much less fall asleep, when I sing those songs.
What's noteworthy is that the only variable involved in this change was
my daughter's frame of reference. My singing hasn't gotten any worse
over the last four years. (I'm not sure it's *possible* for my singing
to get worse.) All that changed was my daughter's frame of reference for
those songs. The rest of the universe stayed the same; the change was in
her mind, lock, stock, and barrel.
Often, the key to solving a problem, or to working on a problem
efficiently, is having a proper frame of reference. The model you have
of a problem you're tackling often determines how deeply you can
understand the problem, and how flexible and innovative you'll be able
to be in solving it.
An excellent example of this, and one that I'll discuss toward the end
of this chapter, is that of *3-D transformation*—the process of
converting coordinates from one coordinate space to another, for example
from worldspace to viewspace. The way this is traditionally explained is
functional, but not particularly intuitive, and fairly hard to
visualize. Recently, I've come across another way of looking at
transforms that seems to me to be far easier to grasp. The two
approaches are technically equivalent, so the difference is purely a
matter of how we choose to view things—but sometimes that's the most
important sort of difference.
Before we can talk about transforming between coordinate spaces,
however, we need two building blocks: dot products and cross products.
#### 3-D Math {#Heading3}
At this point in the book, I was originally going to present a BSP-based
renderer, to complement the BSP compiler I presented in the previous
chapter. What changed my plans was the considerable amount of mail about
3-D math that I've gotten in recent months. In every case, the writer
has bemoaned his/her lack of expertise with 3-D math, and has asked what
books about 3-D math I'd recommend, and how else he/she could learn
more.
That's a commendable attitude, but the truth is, there's not all that
much to 3-D math, at least not when it comes to the sort of
polygon-based, realtime 3-D that's done on PCs. You really need only two
basic math tools beyond simple arithmetic: dot products and cross
products, and really mostly just the former. My friend Chris Hecker
points out that this is an oversimplification; he notes that lots more
math-related stuff, like BSP trees, graphs, discrete math for edge
stepping, and affine and perspective texture mappings, goes into a
production-quality game. While that's surely true, dot and cross
products, together with matrix math and perspective projection,
constitute the bulk of what most people are asking about when they
inquire about "3-D math," and, as we'll see, are key tools for a lot of
useful 3-D operations.
The other thing the mail made clear was that there are a lot of people
out there who don't understand either type of product, at least insofar
as they apply to 3-D. Since much or even most advanced 3-D graphics
machinery relies to a greater or lesser extent on dot products and cross
products (even the line intersection formula I discussed in the last
chapter is actually a quotient of dot products), I'm going to spend this
chapter examining these basic tools and some of their 3-D applications.
If this is old hat to you, my apologies, and I'll return to BSP-based
rendering in the next chapter.
#### Foundation Definitions {#Heading4}
The dot and cross products themselves are straightforward and require
almost no context to understand, but I need to define some terms I'll
use when describing applications of the products, so I'll do that now,
and then get started with dot products.
I'm going to have to assume you have *some* math background, or we'll
never get to the good stuff. So, I'm just going to quickly define a
*vector* as a direction and a magnitude, represented as a coordinate
pair (in 2-D) or triplet (in 3-D), relative to the origin. That's a
pretty sloppy definition, but it'll do for our purposes; if you want the
Real McCoy, I suggest you check out *Calculus and Analytic Geometry*, by
Thomas and Finney (Addison-Wesley: ISBN 0-201-52929-7).
So, for example, in 3-D, the vector **V** = [5 0 5] has a length, or
magnitude, by the Pythagorean theorem, of
![](images/61-01d.jpg)
(eq. 1)
(where vertical double bars denote vector length), and a direction in
the plane of the x and z axes, exactly halfway between those two axes.