170 likes | 345 Views
CS 445/645 Fall 2001. Splines. Last Class. Hermite and B é zier Splines Understand how these curves are defined The G matrix Understand how the curve definitions lead to the coefficient matrices The M matrix Blending functions Convex Hulls. Assignment 4, part 2. One-week extension…
E N D
CS 445/645Fall 2001 Splines
Last Class • Hermite and Bézier Splines • Understand how these curves are defined • The G matrix • Understand how the curve definitions lead to the coefficient matrices • The M matrix • Blending functions • Convex Hulls
Assignment 4, part 2 • One-week extension… • Program due December 5th at midnight • Quaternions not required • Will be extra credit • Reason for extension • We think you can have more fun with this assignment if you play with a couple new ideas
Quaternions • Remember why we don’t like Euler angles • Gimbal lock • Arbitrary multiplication order • Interpolation
Gimbal Lock • Occurs when two axes are aligned • Second and third rotations have effect of transforming earlier rotations • ex: Rot x, Rot y, Rot z • If Rot y = 90 degrees, Rot z == -Rot x
Multiplication Order • (qx, qy, qz) = RzRyRx • Rotate qx degrees about x-axis • Rotate qy degrees about y-axis • Rotate qz degrees about z-axis • Axis order is not defined • (y, z, x), (x, z, y), (z, y, x)… are all legal • Pick one
Local Rotations • Multiple applications of small Euler angles cause numerical errors and drift • Consider 720 rotations about y of 1 degree • Should end up back where you started
Local Rotations • Not only is the Euler computation expensive • But it won’t provide the correct result • Matrices may not be orthonormal
Quaternion • Doesn’t suffer from Gimbal Lock • Multiplication order is clear • Interpolation is sensible • Compositions are cheap
Implementing Quaternions • Instead of storing xrot and yrot • Store quaternion • Initially quaternion is set to (0, 0, 0, 1) • If user moves mouse, multiply initial quaternion by a second quaternion corresponding to the rotation the user caused • When drawing scene convert current quaternion to rotation matrix and multiply on stack
User Interaction • In handleMouseMovement() • You can keep track of the change in x and y between when the user clicked the mouse and released • Imagine the user had a sticky finger and touched the surface of a sphere encircling your model and then spun the sphere with their finger • How would the sphere have rotated?
User Interaction • Compute points of surface of sphere where user first clicked and released • Use these points to compute • Amount of rotation (in degrees) • Cross product of vectors between sphere center and these two points • These will be your quaternion parameters
User Interaction • Compute amount of rotation (cos (theta / 2) is scalar of quaternion) • Multiply rotation by scalar so rotations match mouse translation • Axis of rotation (use cross product) • Zero-out the z-component of axis • Normalize axis of rotation • Multiply axis of rotation by sin (theta/2) • You might have to normalize again • Multiply previous quaternion by this new quaternion to compose rotations
Cube Mapping • Consider projection of triangle onto 2 faces of cube
Other things • glTexSubImage2D • glUnproject • glDepthFunc (GL_LEQUAL)
Making Movies • Next Class