188 Views

Download Presentation
##### Shadows via Projection

**An Image/Link below is provided (as is) to download presentation**

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**Shadows via Projection**Glenn G. ChappellCHAPPELLG@member.ams.org U. of Alaska Fairbanks CS 381 Lecture Notes Wednesday, November 5, 2003**Review:Two Kinds of Interfaces**• Now, about that translation: • In our “zoom & pan”, “driving”, the translation was done in the display function, not the saved matrix. • But in “flying” the translation was in the saved matrix. • Advanced interfaces can be divided into two categories: • “View the world” interfaces. • We look at the scene. • Rotation and scaling are centered on the point we are looking at. • So the translation does not go in the saved matrix. • Examples • Driving from above. • Object manipulation. • “Move in the world” interfaces. • In these, we are explicitly inside the scene. • Rotation is centered on the camera. • So the translation goes in the saved matrix. • Examples • Flying. • Driving, where we appear to be inside the car. CS 381**Review:Mouse-Based Viewing [1/2]**• Last time we will look at two mouse-based viewing interfaces. • Click-and-drag rotation. • View an object and rotate it in an intuitive way with the mouse (click-and-drag). • Flying with the mouse. • Fly forward on mouse-button press. • Turn in the direction of the mouse position. • The first is a “view the world” type of interface. The second is a “move in the world type of interface. • These facts have ramifications for how the interfaces are implemented. (See the previous slide.) • Both of these involve rotation about a line perpendicular to a vector computed from mouse positions. • First: The vector is the difference between the current and previous mouse positions. (So we needed to save the mouse position.) • Second: The vector is the difference between the current mouse position and the center of the screen. CS 381**Review:Mouse-Based Viewing [2/2]**• The following code was useful in both interfaces, for doing the perpendicular rotation. // perprot // Rotates about an axis in the x,y-plane, perpendicular to the given // vector (vx, vy). Rotation amount is proportional to the length of // the vector and to rotmultiplier. void perprot(double rotmultiplier, double vx, double vy) { double len = sqrt(vx*vx + vy*vy); glPushMatrix(); glRotated(rotmultiplier*len, -vy,vx,0.); glMultMatrixd(your_matrix_variable); glGetDoublev(GL_MODELVIEW_MATRIX, your_matrix_variable); glPopMatrix(); glutPostRedisplay(); } CS 381**Shadows via Projection:Introduction [1/2]**• Now that we know something about transformation matrices, we can use them to draw shadows. • Covering shadows before covering lighting is a bit odd, of course. • This topic is covered in section 5.10 of the (blue) text. My presentation differs somewhat from that in the text. • What is a “shadow”? • Answer 1: A region where light is blocked. • That’s a great answer, but to use it, we need to know something about lighting. Maybe next week … • Answer 2: The projection of the shape of an object on another object. • We say “shape” here, since we do not want to draw the shadow using the same colors as the original object. • We know (more or less) how to project onto a plane. We can use this knowledge to draw the shadow of an object on a plane. CS 381**Shadows via Projection:Introduction [2/2]**• We wish to find the matrix that projects onto a given plane from a given light position. • This is essentially the synthetic-camera model. The light is at the center of projection, and the plane is the image plane. • Does this mean that, with this method, objects will still cast shadows when they do not lie between the light and the plane? Yes, it does. CS 381**Shadows via Projection:The Math [1/2]**• To compute the proper projection matrix, we need the light position and an equation for the plane. • We represent the light position as a 4-D vector L in homogeneous form, as shown below. • The equation of a plane in 3-D space can be written as Ax + By + Cz + D = 0. We represent this with another 4-D vector P, as shown below. • A point V (expressed in homogeneous form) lies on the plane precisely when V·P = 0. Plane Equation:Ax + By + Cz + D = 0P = (A, B, C, D) Light PositionL = (Lx, Ly, Lz , 1) CS 381**Shadows via Projection:The Math [2/2]**• Now, let k = P·L be the dot product of P and L. • The matrix that does the projecting is given below. On the left, we use matrix notation (which you may not be familiar with). • What do we do with this matrix? • It does projection, so we might be tempted to put it in OpenGL’s projection transformation. • However, it does not set camera properties; it places objects in the world. (A shadow is an object!) • So the matrix goes in model/view, after the viewing transformations, and before moving the object that casts the shadow. CS 381**Shadows via Projection:Some Code**• Look at shadowproj.cpp, on the web page, for code that uses this method to draw a shadow. • The light position is stored in the global lightpos. • The plane is specified by putting the coordinates of points in the global planepts. • Function findplane computes and returns the plane “equation” (A, B, C, D). This is called from init, where these values are stored in the global plane_eq. • Function makeshadowmatrix computes and returns the shadow projection matrix. This is also called from init, where the matrix is stored in the global shadowmat. • The object is drawn by drawobject. • The parameter is true if the object is to be drawn in normal color, false if it is to be drawn in gray. • This function is called twice: once to draw the object, and once to draw the shadow. • The shadow matrix is used in function display. CS 381**Shadows via Projection:Issues**• If we draw the shadow on a polygon, then the depth test might give us trouble. • One solution is to disable the depth test before drawing the shadow. This only works if no part of the shadow is hidden by any previously drawn object. • The shadow, being an object, is not confined to the polygon it (supposedly) is cast on. • We can solve this using “stenciling”, a method for restricting drawing to certain portions of the frame buffer. • Shadows are not gray; they are unlit. • To do shadows properly, we draw the unshadowed portion with full lighting, and the shadowed portion using only “ambient” light. More on this when we cover lighting. • Suppose we use this method to draw a shadow falling on a more complex object. • For each polygon the shadow falls on, we would need to compute a separate matrix and draw the object casting the shadow. • So this method is not recommended for casting shadows on complex objects. There are other shadowing methods; more on these later. CS 381