Computer Graphics Through OpenGL: From Theory to Experiments, Second Edition Chapter 4 Figure 4.1: Screenshot of box.cpp. Figure 4.2: Translation: glTranslatef(p, q, r). Figure 4.3: Translating into the viewing frustum. Figure 4.4: Screenshot of Experiment 4.3. Figure 4.5: Scaling: glScalef(u, v, w). Figure 4.6: Screenshot of initial configuration of Experiment 4.4. Figure 4.7: Reflection in the yz-plane. Figure 4.8: Screenshots of Experiment 4.5: (a) before scaling (b) after. Figure 4.9: Screenshot for Experiment 4.6. Figure 4.10: Turning along a cylinder. Figure 4.11: Rotation: glRotatef(A, p, q, r). The point P is rotated according to the 4-step process in the text. The rotation of a box is also shown. Figure 4.12: glRotatef(A, 0.0, 0.0, 1.0). Figure 4.13: Screenshots from Experiment 4.9. Figure 4.14: Rotating a square about its own center. Figure 4.15: Screenshots: (a) Experiments 4.10 and (b) 4.11. Figure 4.16: Local system (bold) coincides with the global initially. The global system is fixed. Figure 4.17: Transitions of the box, the box's local coordinates system (bold) and the sphere. The world coordinate system, which never changes, coincides with the box's initial local. Figure 4.18: Screenshot of relativePlacement.cpp after all transformations from the scaling down have been executed. Figure 4.19: Planning a head on a torso: (a) The plan (b) Drawn without isolating the scaling (c) After isolating the scaling. Figure 4.20: Transitions of the modelview matrix stack. Figure 4.21: Screenshot of rotatingHelix1.cpp. Figure 4.22: Animation control in rotatingHelix3.cpp. Figure 4.23: Successive cycles in double buffering. Figure 4.24: Screenshot of ballAndTorus.cpp. Figure 4.25: The ball's axis of latitudinal rotation from its start position is L. Figure 4.26: Screenshot from Experiment 4.21. Figure 4.27: Screenshot of throwBall.cpp. Figure 4.28: Ball bouncing off wall. Figure 4.29: Screenshot of (a) clown1.cpp (b) clown2.cpp (c) clown3.cpp. Figure 4.30: (a) Cone drawn by glutWireCone(base, height, slices, stacks) (b) Torus drawn by glutWireTorus(inRadius, outRadius, sides, rings). Note that the axes are depicted differently in each diagram. Figure 4.31: Screenshot of floweringPlant.cpp in mid-bloom. Figure 4.32: (a) Ball rolling down one plane (b) Ball rolling down two planes (c) Ball bouncing on a box (d) Ball traveling along a helix (e) Four segments opening from a square into a straight line (f) Solar system with a sun, one planet and two moons (g) Pool table with one ball. Figure 4.33: (a) The (conceptual) OpenGL camera's default pose (b) A (conceptual) point camera at the origin with film on the viewing plane of the frustum. Figure 4.34: Camera pose determined by gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz). Figure 4.35: (a) gluLookAt(): the broken frustum is the original viewing frustum, the unbroken one is where it's translated by the gluLookAt() call, the box doesn't move. (b) glTranslatef(): the viewing frustum doesn't move, rather the box is translated by the glTranslatef() call. Figure 4.36: Sectional diagrams of the (simulated) conguration of the eye and frustum for various gluLookAt() calls in boxWithLookAt.cpp. Figure 4.37: Screenshots from Experiment 4.28. Figure 4.38: Taking the dot product: u·v = |u||v|cos θ . Figure 4.39: (a) Splitting v into components v1 and v2, parallel and perpendicular to u, respectively (b) v2 as the “shadow” of v on a plane p perpendicular to u. Figure 4.40: The camera is seen face-forward so that its back-plane p lies on the page. The line of sight los comes perpendicularly up from the page toward the reader. The components of the vector up, parallel and perpendicular to los, respectively, are up1 and up2 (the latter lying on the page). Figure 4.41: Solution to Exercise 4.44(a). Figure 4.42: Checking the solution to Exercise 4.44(a). Figure 4.43: Camera flying over balls. Figure 4.44: Camera rotated on an imaginary sphere enclosing a teapot. Figure 4.45: Relative movement of the camera and scene. Figure 4.46: Restoring the camera to its default pose: broken arrows indicate movements which applied take the camera to the next conguration in the sequence (a)-(d). Figure 4.47: Screenshot from Experiment 4.30. Figure 4.48: Viewing transformation equivalent to a sequence of modeling transformations. Figure 4.49: Applying a translation (1) and rotations (2)-(4) about the three coordinate axes to bring the camera back to its default pose. The original line of sight is bold. The up direction is shown only at the end. Figure 4.50: Solution to Example 4.6: the configuration of the camera given by gluLookAt(0.0, 0.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0) is at left; the line of sight and up vectors are indicated by blue arrows; rotations are both annotated at the top and indicated in the figures themselves by broken arrows, the result of each rotation being the next configuration. Figure 4.51: Screenshot of spaceTravel.cpp. Figure 4.52: Spacecraft diagrams. Figure 4.53: Ball rolling toward a box. Figure 4.54: Screenshot of animateMan1.cpp. Figure 4.55: Screenshot of animateMan1.cpp in develop mode. Figure 4.56: Screenshot of animateMan2.cpp. Figure 4.57: Screenshot of ballAndTorusShadowed.cpp. Figure 4.58: OpenGL's synthetic-camera pipeline (highly simplified!). Figure 4.59: Screenshot from selection.cpp. Figure 4.60: Name stack configurations: (a) Initial (b) When the red rectangle is drawn (c) When the green rectangle is drawn. Figure 4.61: Clicking P “hits” the aircraft because the latter intersects V’. Figure 4.62: Screenshot of ballAndTorusPicking.cpp moments after the ball has been clicked. Figure 4.63: Color coding.