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 |
|
203 | Eq. 5.7 | The 'fi' in the first term on the right side of the equation should be 'fi' |
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 xi." to "At any point in time, the Jacobian is a function of xi." |
204 | Eq. 5.11 | Y is a column vector and, therefore, equal to the transpose of
the vector shown: Y = [px,py,pz,α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 pseudo-inverse of the Jacobian. It is easy to show that these two
forms are equal if both (JTJ)-1 and
(JJT)-1 exist. i.e.: J+ = (JTJ)-1JT = JT(JJT)-1Typically 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 (JTJ)-1 does not exist, but (JJT)-1 does. As a result, we use the form of the pseudo-inverse that has the term (JJT)-1. This should be explained in the text or put in a footnote. |
211 | Fig. 5.21 | The left half of the x-axis 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, 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 |
|
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 cross-product, ' 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 | Pq should be Pa |
282 | Eq. 7.92 | On the left side of the equation, there should be a double-dot 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: &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 |