A special thanks to Dr. Philip Schlup of Colorado State University, Dr. Brian Wyvill of the University of Calgary, and Dr. Przemyslaw Kiciak of the University of Warsaw for their comments and corrections.
Links to specific chapters:
Chapter
1 Chapter
2 Chapter
3 Chapter
4 Chapter
5 Chapter
6
Chapter
7 Chapter
8 Chapter
9 Chapter
10 Chapter
11 Chapter
12
Appendix
A Appendix
B
Page  Location  Comment 

7  Section 1.22, 2nd paragraph  "1985" should be "1895" 
CHAPTER 2: Technical Background
Page  Location  Comment 

4546  Eq. 2.3 & Eq. 2.4  The equal sign ('=') should be a symbol that indicates equivalence; it should be replaced with '&equiv'. 
52  First line after Eq. 2.17  The rotation matrices are transposed. The transformation of the point P should be: P'=R_{y}R_{x}P 
56  The third sentence of the section titled "Perspective Matrix Multiply" 

68  Eq. 2.29  Change to QuatRot(&theta,(x,y,z)) &equiv [cos(&theta/2), sin(&theta/2)(x,y,z)] 
69  Eq. 2.30  Change to q &equiv Quatrot(QuatRot(&theta,(x,y,z)) = [cos(&theta/2), sin(&theta/2)(x,y,z)] = [cos(&theta/2), sin(&theta/2)(x,y,z)] = [cos(&theta/2), sin(&theta/2)(x,y,z)] &equiv Quatrot(&theta,(x,y,z)) &equiv q 
69  Eq. 2.33 

Page  Location  Comment 

82  4th sentence of 2nd paragraph  Change "... to parameterize by arclength." to "... to find a closed algebraic formula to describe a parameterization by arclength." 
85  Eq. 3.10, second line  should be: = 0.944 + ((0.730.70)/(0.750.70))(0.959  0.944) 
87  parenthetical 4th sentence  This comment, the sentence inside the parentheses, can be ignored because the entries will be output in sorted order by the routine. 
88  End of the first paragraph  Add to the end of the paragraph: "In addition, because Gaussian quadrature requires continuous derivatives to be accurate, it should only be applied to the polygonal segments of a piecewisesmooth curve definition." 
88  Eq. 3.13  The integral needs the integrating variable 'du' 
89  Above Eq. 3.14  To the end of the sentence above Eq. 3.14, add: "... for arbitrary limits a and b." 
92  function add_table_entry() at the bottoom of the page  Note that the functionality of actually building the table is left as an exercise for the reader  the code here merely prints out the entry. 
93  near top of code  Entry w[0] should be .2955242247 
93  function evaluate_polynomial() at the bottom of the page  For efficiency, as well as accuracy, the code for the evaluation of
the polynomial should be replaced by Horner's method: double evaluate_polynomial(polynomial_td *poly, double u) { int i; double value; value = poly>coeff[poly>degree]; for (i=poly>degree1; i >= 0; i) { value = poly>coeff[i] + u*value; } return value; } 
94  End of second sentence of the section titled Finding u Given s  Change 'integral' to 'interval.' 
96  middle of 2nd full paragraph  Change ".. at a speed indicated by S(t)" to ".. at a speed determined by S(t)" 
100  functiion ease() at the top of the page  For consistency, the use of 'float' in this function should be changed to 'double' 
103  the first line of Eq. 3.21  Replace this wordy equation by modifying the last sentence of the
paragraph above it. Change "The area under the velocity curve can be computed as in Equation 3.20. to "The normalized area under the velocity curve can be computed, as in Equation 3.20, by setting 1 equal to the area under the leading ramp plus the area under the middle constant velocity interval plus the area under the trailing ramp. 
107  last sentence  Change "... order k with n+1 ..." to "... order k (degree k1) with n+1 ..." 
107  footnote  Change the reference from 'B.5' to 'B.5.12' 
109  Eq. 3.26 & 3.27  It should be noted that actually computing the inverse, as in Eq. 3.26 or the psuedoinverse, as in Eq. 3.27, is not recommended. One of the more numerically stable algorithms for solving such systems of equations should be used instead. For example, refer to Numerical Recipes (reference [16] in Appendix B). 
111  Eq. 3.29  In the first term on the right, the 'sin' should be in the numerator
and &theta should be mulitplied by '1u'. So the numerator should be: sin((1u)*θ) 
111  Eq. 3.29  As an aside, slerp expressed in terms of quaternion algebra [1] is: Slerp(q0,q1,u) = q0(q0^{1}q1)^{u} where q^{u} = [cos(uθ), v*sin(uθ)] and v is a 3D unit vector 
113  Eq. 3.30  Note that the construction of the new b_{n}&prime would remove C_{1} continuity at p_{n}  unless a new a_{n}&prime was similarly displaced. However, the construction of b_{n}&prime, with or without the continuity enforcement, may still provide useful functionality to an animator as a design tool in constructing a path. 
113  2nd full paragraph  Adapting control point construction for Bezier interpolation to
quaternions needs more explanation. In order to do the
quaternionequivalent of the fist step of Figure 3.25, use the following: double(p,q) = 2*(p⋅q)q  pto produce a quaternion that is twice as far away from p as q is and in the same direction from p as q is. 
113  2 places in the 3rd full paragraph  "De Casteljau" should be "de Casteljau" 
114  pseudocode for computing u = 1/4  The righthand sides of all the lines should include the normalization
by dividing the quaternion sum by its length. For example, temp = slerp(q_{n},a_{n},1/2) = q_{n} + a_{n}should be temp = slerp(q_{n},a_{n},1/2) = (q_{n} + a_{n}) / q_{n} + a_{n} 
115  Figure 3.30  The 'u' vector should be pointing the opposite direction (to the right of the plane's pilot) in order to complete the lefthand coordinate system. 
123  first full sentence  Change ".. can be used to solve for the position P_{1} = P(1/3)" to ".. can be used to solve for the position P(1/3)" 
127  Middle of second full paragraph  Note that the cutting plane can be defined as that containing the normal of the triangle (or polygon) to be intersected. 
128  2nd full paragraph, last sentence  "In this manner, finding the path reduced into..." should be: "In this manner, finding the path is reduced into..." 
CHAPTER 4: InterpolationBased Animation
Page  Location  Comment 

148  Fig. 4.18 

151  First line  Stating that there are 'l points in the S direction, m points in the T direction, and n points in the U direction,' does not count the origin of the grid in those directions. Counting the origin there are l+1 points in the S direction, etc. 
151  Eq. 4.8  The term: (1t)^{mjtj}should be: (1t)^{mj}t^{j}That is, (1t) is raised to the power mj. This is multiplied by t is raised to the power t 
151  Last sentence  Change "As with Bezier curves, C1 continuity can be ensured between two FFD contro grids by enforcing colinearity among adjacent control point across the common bounday (Figure 4.22)" to "As with Bezier curves, C1 continuity can be ensured between two FFD control grids by enforcing colinearity among adjacent control points across the common boundary as well as the adjacent control points being equidistant from the common boundary point. (Figure 4.22)" 
152  Footnote  The word 'note' should be 'node' 
164  Middle of first full paragraph  Change "surface of the sphere" to the more technically correct "spherical surface" 
171  top of page  Add a reference to Wolberg's book, [37], to the end of the first
sentence. Change: "... userdefined coordinate grids superimposed on each image." to: "... userdefined coordinate grids superimposed on each image [37]." 
171  Fig. 4.44  The description of gridbased morphing constructs the auxilliary grid the wrong way. It should use the ycoordinate of the source grid and the xcoordinates of the intermediate grid. Figure 4.40 should be changed as well. 
175  Eq. 4.9  There should be no parentheses around the rest of the equation after
the first &alpha: C[i][j] = αC_{1}[i][j] + (1+&alpha)C_{2}[i][j] 
175  Last paragraph, first sentence  "... by the userdefining coordinate grids ..." should be: "... by the userdefined coordinate grids ..." 
179  Eq. 4.10  'W' and 'P' should be lower case to agree with the usage in the text 
Page  Location  Comment 

197  Section 5.1.2  In the middle of the first paragraph, changeBR> "Successively
applying the inverses of matrices farther up the hierarchy can transform a
point from any ..." to "Successively applying the matrices farther up the hierarchy can transform a point from any ..." 
199  traverse() pseudocode 

202  Fig. 5.15 

203  Eq. 5.7  The 'fi' in the first term on the right side of the equation should be 'f_{i}' 
203  Eq. 5.9  The δY on the left side of the equation and the δX at the end of the right side are differentials and therefore should be written with a 'd' to distinguish them from the partial derivative of δF over δX 
203  Last paragraph  The dimensions used in the example are arbitrary, so the text that
says: "The 6 X 6 matrix of partial derivatives, ..., is called the Jacobian ..." should not be taken to mean that Jacobians are always 6 X 6. It would be better to say simply that a matrix of partial derivatives is called the Jacobian and note that it is often not square. 
204  First sentence  Change: "At any point in time, the Jacobian is a linear function of x_{i}." to "At any point in time, the Jacobian is a function of x_{i}." 
204  Eq. 5.11  Y is a column vector and, therefore, equal to the transpose of
the vector shown: Y = [p_{x},p_{y},p_{z},α_{x},α_{y},α_{z}]^{T} 
204  Eq. 5.15  The partial derivatives should be with respect to &theta, not θdot 
207  Second paragraph  "A vector of the desired change in values is set equal to the Jacobian
matrix multiplied by a vector of the unknown values, which are the changes
to the joint angles (Equation 5.16)." should be: "A vector of the desired change in values is set equal to the Jacobian matrix (Equation 5.17) multiplied by a vector of the unknown values, which are the changes to the joint angles." 
207  Eq. 5.17  The spacing between and within terms is confusing. This should be a 3 X 3 matrix. Each term ends with a subscript of 'x', 'y', or 'z'. 
208  Eq. 5.20 and the text that follows  Eq. 5.20 shows a derivation for J^{+} from the inverse
kinematic equation that is easy to understand mathematically. However, in
the rest of the text, the transpose of this definition is what is used for
the pseudoinverse of the Jacobian. It is easy to show that these two
forms are equal if both (J^{T}J)^{1} and
(JJ^{T})^{1} exist. i.e.: J^{+} = (J^{T}J)^{1}J^{T} = J^{T}(JJ^{T})^{1}Typically it is the case in inverse kinematics formulations that the columns are not linearly independent, but the rows are (i.e., there are more joints than necessary). This means that (J^{T}J)^{1} does not exist, but (JJ^{T})^{1} does. As a result, we use the form of the pseudoinverse that has the term (JJ^{T})^{1}. This should be explained in the text or put in a footnote. 
211  Fig. 5.21  The left half of the xaxis is labeled: 230, 220, 210It should be labeled: 30, 20, 10 
213  Fig. 5.23  The figure's text starts with: "Inverse of the Jacobian solution formulated to pull the target toward the goal ..." It should read: "Inverse of the Jacobian solution formulated to pull the goal toward the end effector ..." 
213  First sentence of last full paragraph on page  Change the reference to Figure 5.23 to Figure 5.24 
215  Reference #1  "Dampled" should be "Damped" 
Page  Location  Comment 

227  example hierarchy information  The indentation is missing that shows the hierarchical relationship.
It should read as: root joint Chest offset 0 5.21 0 3 DOFs: Zrotation Yrotation, Xrotation Limits: (180,180) (90,90) (0,270) joint Neck offset 0 5.45 0 3 DOFs: Zrotation Yrotation, Xrotation ... joint Left UpperLeg offset 3.91 0.0 0.0 3 DOFs: Xrotation Yrotation, Zrotation joint LeftLowerLeg offset 3.91 0.0 0.0 1 DOF: Xrotation ... 
229  Middle of 3rd paragraph  Change θ(t) = f(&theta,t)to θ′(t) = f(&theta,t) 
231  Reference 3  The title should be: "Motion Graphs" 
CHAPTER 7: Physically Based Animation
Page  Location  Comment 

234  Last sentence on page  Change: "... the object's acceleration can be calculated based on the object's mass, the time interval, and Equation 7.1 to produce Equation 7.2." to: "... the object's acceleration can be calculated using Equation 7.1 to produce Equation 7.2." 
235  Eqs. 7.4  The notation here uses 'p' for position. Later in the text 'x' is used for position and 'p' is used for momentum. For consistency, the positional notation used here should be 'x'. 
235  Eq. 7.6  The denominator, r_{e}, should be squared: r_{e}^{2} 
236  First full paragraph  This discussion should be independent of whether or not the damper is
used in conjunction with a spring.

236  Eq. 7.11  For consistent notation, the &omega should be an &alpha: &tau = I&alpha 
237  End of the first paragraph  At the end of the paragraph, add the following sentence: "Below, is a single springdamper equation formed by combining Equations 7.7 and 7.8" Also, change the plus sign to a negative sign to be consistent with Equation 7.8. 
240  Figure 7.2  Figure 7.2 should be changed to show the spring and damper working in parallel on the masses. 
244  code at bottom of page  Change: typedef particle_struct struct {to: typedef struct particle_struct { 
245  code at top of page  Change: typedef particleSystem_struct struct {to: typedef struct particleSystem_struct { 
245  second code segment  To make this code more Clike, a ';' should be added at the end of
each line. Also, change: addVector(array2,array2,array2,n)to: addVector(array1,array1,array2,n) 
253  Eqs. 7.25 

255  Eqs. 7.34 & 7.35  &tau_{t} should be &tau_{i} 
256  Eq. 7.40  The quantities q(t) and qdot) should be indexed by i 
260  Eq. 7.52  Change:E(p) = ax + by + cz + dto: E(p) = ap_{x} + bp_{y} + cp_{z} + dAlso, the text above should say that E(p)=0 is the planar equation where p = (p_{x}, p_{y}, p_{z}) 
261  Figure 7.16  Change: "... for the example from Section 4.1" to: "... for the example from Section 7.4.2" 
261  Equation 7.54  Should be: v(t_{t+1}) = v(t_{t})  (v(t_{t})⋅N)N + k*(v(t_{t})⋅N)N = v(t_{t}) + (k1)*(v(t_{t})⋅N)N 
266  first partial sentence on page  Change: ".. then the upper bound is replaced with the middle of the time interval. Otherwise, the lower bound ..." to: ".. then the lower bound is replaced with the middle of the time interval. Otherwise, the upper bound ..." 
267  Second line 

267  Last sentence of the first paragraph  Change: "These equations use the impulse, j, and ..." to: "These equations use the impulse, j (where J=jn), and ..." 
268  Eq. 7.59  The second term in brackets should be p_{B} with a dot over
it: v_{rel} = (p_{A}(t)  p_{B}(t))nwhere each 'p' should have a dot over it. 
268  Eqs. 7.59 & 7.63  The quantity in parentheses should be dotted with n and then multiplied by n 
268  Eq. 7.60 

268  Equations 7.61 & 7.62  In each pair of equations, one of the pair should the term subtracted instead of added. 
269  Eq. 7.64  The last '+'should be a '' 
269  Eq. 7.65  In the denominator,

269  Fig. 7.24 

271  First sentence on page  "Computing the forces involved in resting contact ..." should be: "Computing the forces involved in continuous contact ..." 
272  Eq. 7.75  The summing index should be 'j' 
276  Eq. 7.84  the 'x' in the bottom element of the vector should be crossproduct, ' X ' 
276  Eq. 7.85  The lower left term in the 3x3 matrix should be 'ry' instead of 'ry' 
278  Figure 7.31  This is not a good figure to show the gradient. Perhaps better would be to show a topologic map and draw the gradient vector relative to the contours. 
280  all equations on page  P^{q} should be P^{a} 
282  Eq. 7.92  On the left side of the equation, there should be a doubledot over 'x' indicating second derivative 
283  Eq. 7.97 & 7.98  The summation should be over j, not i 
CHAPTER 8: Fluids: Liquids & Gases
Page  Location  Comment 

292  Eq. 8.1  f(x,t)should be f(s,t) 
293  last sentence of first paragraph  Change: "... where H is defined as half of the amplitude." to: "... where H is defined as twice the amplitude." 
295  Eq. 8.6  the term: &theta_{i}(x,y,t_{0})should be: &theta_{i}(x,z,t_{0}) 
295  Eq. 8.7  The left hand side of the equation should be: &theta_{i}(x,z,t_{0}) = x_{i}/L_{i} 
300  Figs. 8.9  The references to equations in the pseudocode should have 13 added to
them:

302 & 304  Figs. 8.10 & 8.11  The images are swapped. 
306  1st paragraph  With respect to the implicit spheres mentioned, a crossreference to Section 12.1 Implicit Surfaces, p. 421 should be added. 
305  Equation 8.27  It should be noted that F(r) is equal to zero for values of r > R 
308  pseduocode  Towards the bottom in the calculation of theta, there is a missing
decimal point: 01047196should be .01047196 
310  first sentence on page  In listing "... speed, initial velocity...", the text is redundant in that the velocity (a vector) includes the speed (a scalar). 
312  2nd paragraph, fourth line  "... based on the indice of the surrounding pixels ..." should be: "... based on the indices of the surrounding pixels ..." 
314  2nd paragraph of Section 8.2  The reference [1], at the end of the 2nd paragraph of Section 8.2, is incorrect and should be ignored. 
317  Last paragraph  For F=[F_{x}, F_{y}, F_{z}], δF/δx + δF/δy + δF/δzshould be: ∂F_{x}/∂x + ∂F_{y}/∂y + ∂F_{z}/∂z 
318  Equation 8.34  For F=[F_{x}, F_{y}, F_{z}], ∇•F = δF/δx + δF/δy + δF/δzshould be: ∇•F = ∂F_{x}/∂x + ∂F_{y}/∂y + ∂F_{z}/∂z 
318320  Equations involving &delta  The &delta character should be replaced with &part 
318  Use of gradient and divergence  It should be noted that the gradient operator is usually applied to a scalar function and the divergence is a property of a vector field. There should be a distinction in the notation I use when referring to a scalar field (e.g. F) and a vector field (e.g. F) 
CHAPTER 9: Modeling and Animating Human Figures
Page  Location  Comment 

3345  Throughout  The references to Chapter 4 (with respect to linkages and degrees of freedom) should be to Chapter 5. 
355  Figure 9.32  The curve to be removed is the lower of the two as it says in the text. However, in the diagram on the left, the line pointing to the curve to be removed is ambiguous  it should be more obvious that it is pointing to the lower of the two curves. 
3547  Section 9.4.2  This discussion assumes a fixed length between the two constrained vertices. This should be made explicit in the discussion. 
358  Equation 9.4  The factor, k_{s}, should be applied to the entire expression on the righthand side, not just the first term in the numerator. 
Page  Location  Comment 

374  Last full paragraph  In the second last sentence of the last full paragraph on the page, change 'modified' to 'added'. 
378  Second last paragraph  Change: Facial anthropomorphic statistics and proportions ..." to: Facial anthropometric statistics and proportions ..." 
388  Section 10.4.2, 2nd paragraph, 1st line  'Visemes' is an accepted term in the literature, but hasn't made into the dictionary (as far as I can tell) so there is no official reference for hyphenation, but it is probably hyphenated wrong here. It should probably be 'visemes.' 
389390  Section 10.5  This is a repeat of Section 9.5. The summary for this chapter has been lost in the ether. Look for it in the next edtion. 
Page  Location  Comment 

394  Last sentence on page  Change: "Using the characters position ..." to: "Using the character's position ..." 
405  Fig. 11.5  This section is a bit confusing. "... adjusting bucket positions of any members that deviate too much from the bucket center ..." refers to changing the bucket assignment of a flock member whose position changes relative to bucket centers. Perhaps better is: "... adjusting bucket assignments of any members that deviate too much from the bucket center ..." 
405  Fig. 11.5  In the equation for 't', the term under the radical sign should be: s^{2} + k^{2} 
401  End of the last full paragraph  Change: "If less that the amount of total possible control is not allocated, ..." to: "If less that the amount of total possible control is allocated, ..." 
402  Several places in the text  Change: 'model' to: 'module' 
406  Fig. 11.6 

406  First sentence  Change; "... then this point can be steered toward Figure 11.7." to: "... then this point can be steered toward the closest point on a silhouette edge (Figure 11.7)." 
407  Figure 11.8  This should show the pitch rotation in the other direction so that an increase in pitch results in an increase in the angle of attack, as stated on the following page 
408  Middle of the first full paragraph  Change: "A flying object turns by being lifted sideways by the vertical component of the lift; ..." to: "A flying object turns by being lifted sideways by the horizontal component of the lift; ..." 
418  Reference #23  Change: "New Zealand Trave & Enterprise" to: "New Zealand Trade & Enterprise" 
CHAPTER 12: Special Models for Animation
Page  Location  Comment 

421  First sentence of 12.1  In: "... some equation f(p) = 0, called the implicit function." the implicit equation is f(p)=0, whereas the implicit function is f(p). 
422  Eq. 12.1 

422  Last sentence on page  The text says: "... f(0.0) = 0.0 ... f(1.0)=1.0 ..." it should be: "... f(0.0) = 1.0 ... f(1.0)=0.0 ..." 
427  End of partial paragraph at top  The F_{1} and F_{2} should be changed to F_{i} and F_{j}, respectively. 
428  12.1.5, 1st paragraph, 2nd last sentence  Change: d&phi^{2}/d^{2}t to: d^{2}φ/dt^{2} 
435  Figure 12.14  In the figure for the middle terminal string, the side branch should have 3 equally spaced dots. 
437  ContextFree versus Context Sensitive Section  Change: "Productions with shorter contexts are usually given precedence over productions with longer contexts ..." to: "Productions with longer contexts are given precedence over productions with shorter contexts ..." 
Page  Location  Comment 

450451  Bottom of p. 450, top of p. 451  On page 450 at the bottom: "The combined scene is antialiased ..." and on page 451 on the first line, "Each scene is antialiased ..." In both cases, it the image that is antialiased, not the scene. 
451  Last sentence of top partial paragraph  Change: "The over operator, as defined above, ..." to: "The over operator, as defined below, ..." 
456  Last paragraph, in the middle 

APPENDIX B: Background Information and Techniques
Page  Location  Comment 

470  Eq. B.3 

471  Eq. B.5  In the matrix on the right side of the equation, the second element of the first row should be 'd' 
471  B.8  This is the equation for a determinant. The notation for determinant is to bracket the matrix with straight vertical lines instead of the square matrix brackets shown here. 
473  B.12  In the line after the line labeled with 'Third row:', remove the dot: L_{31}⋅y_{1}should be : L_{31}y_{1} 
484  Vector.c code  typedef struct xyz_struct { float x,y,z; xyz_td; }should be: typedef struct xyz_struct { float x,y,z; } xyz_td; 
484  crossProduct code  The variable definition: xyz_tdp;should be: xyz_td p; 
485  dotProduct code (starting on previous page)  the '=' in the return statement should be '+' 
485  formVector code  The variable definition: xyz_tdp;should be: xyz_td p; 
486  Vector4Matrix4x4Mult code ComputeInverse4x4 code  Remove the spaces surrounding the 'x' in the function names 
487  ComputeInverse4x4 code (starting on previous page)  The matrix A and its rows, allocated by malloc, are never freed. Appropriate code should be added at the end of the routine. 
488  First full paragraph, last sentence  Change: "For triangles in twodimensional, ... " to: "for triangles in two dimensions, ..." 
492  Under Bounding Slabs, 2nd paragraph  "In the planar equation ax + by + cy = d, ..." should be: "In the planar equation ax + by + cz = d, ..." 
511  Eq. B.57  Rot_{[0,x,y,z]}should be: Rot_{[θ,x,y,z]} 
512  Eq. B.59  The first term in the third row of the matrix is: 2xy2syIt should be : 2xz2sy 
553  Eq. B.141 

554  Eq. B.146  In the third term of the second row and the second term of the third
row should be: I_{yz}  MYZ(note that there is no need for the paretheses around the terms that only involve multiplication such as MYZ and MXY) 
560  The Verlat Method  In both the title and first sentence, "Verlat" should be "Verlet." 
571  Eq. B.159  In the second line: r  r_{0} = s_{v}v_{i}should be: r_{i}  r_{0} = s_{v}v_{i} 
572  Eq. B.161  In the second of the two equations:

572  Eq. B.162  The second of the two equations begins with: (r_{i} = r_{0})It should begin with: (r_{i}  r_{0}) 
573  Eq. B.169 

511  Eq. B.57 