200 likes | 217 Views
CSC461: Lecture 20 Parallel Projections in OpenGL. Objectives Introduce OpenGL viewing functions Derive the projection matrices used for standard OpenGL projections Introduce oblique projections Introduce projection normalization Introduce hidden-surface removal algorithms.
E N D
CSC461: Lecture 20 Parallel Projections in OpenGL Objectives • Introduce OpenGL viewing functions • Derive the projection matrices used for standard OpenGL projections • Introduce oblique projections • Introduce projection normalization • Introduce hidden-surface removal algorithms
OpenGL Orthogonal Viewing glOrtho(xmin,xmax,ymin,ymax,near,far) glOrtho(left,right,bottom,top,near,far) nearandfarmeasured from camera
OpenGL Perspective Viewing • The function:glFrustum(xmin,xmax,ymin,ymax,near,far) • OpenGL figures out the transformation matrix and perspective division • With glFrustum it is often difficult to get the desired view
front plane aspect = w/h Using Field of View (fov) • The function gluPerpective(fovy, aspect, near, far) • The angle fov is the angle between the top and bottom planes of the clipping volume in the y direction • The aspect ratio = width/height • Often provides a better interface
Normalization • Rather than derive a different projection matrix for each type of projection, we can convert all projections to orthogonal projections with the default view volume • This strategy allows us to use standard transformations in the pipeline and makes for efficient clipping
model-view transformation projection transformation perspective division 4D 3D nonsingular clipping projection 3D 2D against default cube Pipeline View
Notes • We stay in four-dimensional homogeneous coordinates through both the model-view and projection transformations • Both these transformations are nonsingular • Default to identity matrices (orthogonal view) • Normalization lets us clip against simple cube regardless of type of projection • Delay final projection until end • Important for hidden-surface removal to retain depth information as long as possible
Orthogonal Normalization • glOrtho(left,right,bottom,top,near,far) • Normalization find transformation to convert specified clipping volume to default canonical view volume • Default volume: centered at the origin with the length of 2
P = ST = Orthogonal Matrix • Two steps • Move center to origin -- translation T(-(left+right)/2, -(bottom+top)/2,(near+far)/2)) • Scale to have sides of length 2 S(2/(left-right),2/(top-bottom),2/(near-far))
Morth = Final Projection • Project on the projection plane • Set z =0 • Equivalent to the homogeneous coordinate transformation • Hence, general orthogonal projection in 4D is P = MorthST
Oblique Projections • OpenGL only supports orthogonal projection function, not general parallel projections such as oblique projections • However if we look at the example of the cube it appears that the cube has been sheared • Oblique Projection = Shear + Orthogonal Projection • Concatenate shear and orthographic viewings
top view side view General Shear
H(q,f) = Shear Matrix xp= x – z cotanθ, yp= y – z cotanø, zp= 0 xy shear (z values unchanged) Projection matrix: General case: Where S and T are the same as orthogonal projection P = MorthH(q,f) P = MorthSTH(q,f)
object top view z = 1 DOP DOP x = -1 x = 1 far plane z = -1 clipping volume near plane distorted object (projects correctly) Effect on Clipping • The projection matrix P = STH transforms the original clipping volume to the default clipping volume
Surface Display • All surfaces should be specified • Two approaches to determine which surfaces should be displayed • Remove those surfaces that should not be visible Hidden-surface-removal • Find those surfaces that are visible Visible-surface • Many algorithms exist • OpenGL uses the z-buffer algorithm (a hidden-surface-removal algorithm)
Hidden-Surface-Removal • Two categories of hidden-surface-removal algorithms • Object-space algorithms: • order the surfaces in the scene such that drawing surfaces in a particular order provides the correct image • Example: back-face first for a cube • Not easy to sort the surfaces • Image-space algorithms • As part of the projection process • Seek to determine the relationship among object points on each projector • The z-buffer algorithm
The z-buffer Algorithm • A projector from the COP passes through two surfaces • The closest object determines the color placed in the color buffer at the corresponding location • For each pixel in the color buffer, keep the depth information in the z-buffer • When a new color is projected to the pixel, check its z-value to determine if the color should be replaced • The depth is the distance from the object to the origin – the viewer
Using The z-buffer • Initialize the z-buffer – to a value that corresponds to the farthest distance from the viewer gluInitDisplayMode(GLUT_RGB|GLUT_DEPTH) • Enable the z-buffer glEnable(GL_DEPTH_TEST) • Clear the z-buffer glClear(GL_DEPTH_BUFFER_BIT)
Culling • Remove all the faces pointing away from the viewer and only render the ones facing the viewer • Enable culling glEnable(GL_CULL) • Only works for convex objects, e.g. cube • Combination of culling and the z-buffer