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 |
---|---|---|
45-46 | 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'=RyRxP |
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.73-0.70)/(0.75-0.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 piecewise-smooth 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->degree-1; 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 k-1) 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 '1-u'. So the numerator should be:
sin((1-u)*θ) |
111 | Eq. 3.29 |
As an aside, slerp expressed in terms of quaternion algebra [1] is:
Slerp(q0,q1,u) = q0(q0-1q1)u where qu = [cos(uθ), v*sin(uθ)] and v is a 3D unit vector |
113 | Eq. 3.30 | Note that the construction of the new bn&prime would remove C1 continuity at pn - unless a new an&prime was similarly displaced. However, the construction of bn&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 quaternion-equivalent 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 | pseudo-code for computing u = 1/4 |
The right-hand sides of all the lines should include the normalization by dividing the quaternion sum by its length. For example, temp = slerp(qn,an,1/2) = qn + anshould be temp = slerp(qn,an,1/2) = (qn + an) / ||qn + an|| |
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 left-hand coordinate system. |
123 | first full sentence |
Change ".. can be used to solve for the position P1 = 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: Interpolation-Based 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:
(1-t)m-jtjshould be: (1-t)m-jtjThat is, (1-t) is raised to the power m-j. 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: "... user-defined coordinate grids superimposed on each image." to: "... user-defined coordinate grids superimposed on each image [37]." |
171 | Fig. 4.44 | The description of grid-based morphing constructs the auxilliary grid the wrong way. It should use the y-coordinate of the source grid and the x-coordinates 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] = αC1[i][j] + (1+&alpha)C2[i][j] |
175 | Last paragraph, first sentence |
"... by the user-defining coordinate grids ..." should be: "... by the user-defined 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() pseudo-code |
| |||||||||||||||||||||||||||||||||||||||
202 | Fig. 5.15 |
|
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, re, should be squared: re2 | ||||||||||||||||||||||||
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 spring-damper 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 C-like, 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 | &taut should be &taui | ||||||||||||||||||||||||
256 | Eq. 7.40 | The quantities q(t) and q-dot) should be indexed by i | ||||||||||||||||||||||||
260 | Eq. 7.52 |
Change:E(p) = ax + by + cz + dto: E(p) = apx + bpy + cpz + dAlso, the text above should say that E(p)=0 is the planar equation where p = (px, py, pz) | ||||||||||||||||||||||||
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(tt+1) = v(tt) - (v(tt)⋅N)N + k*(v(tt)⋅N)N = v(tt) + (k-1)*(v(tt)⋅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 pB with a dot over it:
vrel = (pA(t) - pB(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 |
|
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:
&thetai(x,y,t0)should be: &thetai(x,z,t0) |
295 | Eq. 8.7 |
The left hand side of the equation should be:
&thetai(x,z,t0) = xi/Li |
300 | Figs. 8.9 |
The references to equations in the pseudo-code 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 cross-reference 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 | pseduo-code |
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=[Fx, Fy, Fz],
δF/δx + δF/δy + δF/δzshould be: ∂Fx/∂x + ∂Fy/∂y + ∂Fz/∂z |
318 | Equation 8.34 |
For F=[Fx, Fy, Fz],
∇•F = δF/δx + δF/δy + δF/δzshould be: ∇•F = ∂Fx/∂x + ∂Fy/∂y + ∂Fz/∂z |
318-320 | 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 |
---|---|---|
334-5 | 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. |
354-7 | 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, ks, should be applied to the entire expression on the right-hand 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 'vi-semes.' |
389-390 | 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: s2 + k2 |
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 F1 and F2 should be changed to Fi and Fj, respectively. |
428 | 12.1.5, 1st paragraph, 2nd last sentence |
Change: d&phi2/d2t to: d2φ/dt2 |
435 | Figure 12.14 | In the figure for the middle terminal string, the side branch should have 3 equally spaced dots. |
437 | Context-Free 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 |
---|---|---|
450-451 | Bottom of p. 450, top of p. 451 |
On page 450 at the bottom: "The combined scene is anti-aliased ..." and on page 451 on the first line, "Each scene is anti-aliased ..." In both cases, it the image that is anti-aliased, 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:
L31⋅y1should be : L31y1 |
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 two-dimensional, ... " 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:
2xy-2syIt should be : 2xz-2sy |
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:
-Iyz - 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 - r0 = svvishould be: ri - r0 = svvi |
572 | Eq. B.161 |
In the second of the two equations:
|
572 | Eq. B.162 |
The second of the two equations begins with:
(ri = r0)It should begin with: (ri - r0) |
573 | Eq. B.169 |
|
511 | Eq. B.57 |