Upgrade to Pro — share decks privately, control downloads, hide ads and more …

3. Coordinate transform

3. Coordinate transform

Tatsuya Yatagawa

April 06, 2021
Tweet

More Decks by Tatsuya Yatagawa

Other Decks in Technology

Transcript

  1. Results from last practice Computer Graphics Course @Waseda University But

    how large is the region inside the window? (-0.25, -0.25) (-0.25, 0.25) (0.25, -0.25) (-0.5, 0.5) (-0.5, -0.5) (0.5, -0.5) (-0.75, 0.75) (-0.75, -0.75) (0.75, -0.75) Indeed, size of triangle changed in response to positions.
  2. Default coordinate system ◼ Range for default window ◼ X-coordinate:

    from -1 to 1. ◼ Y-coordinate: from -1 to 1. Computer Graphics Course @Waseda University -1 -1 1 1
  3. Coordinate system in OpenGL ◼ Window range is always the

    same! ◼ You need to transform drawn objects to make them inside ◼ To show [-2, 2] x [-2, 2] range → Halve object sizes ◼ To show [0, 2] x [0, 2] range → Translate object by (-1, -1) Computer Graphics Course @Waseda University
  4. Basic methods for coordinate transform ◼ glScalef(x,y,z) ◼ Scale sizes

    along x, y, and z axes ◼ glTranslatef(x,y,z) ◼ Translate along x, y, and z axes ◼ glRotatef(theta,x,y,z) ◼ Rotate with angle “theta” along an axis (x, y, z) Computer Graphics Course @Waseda University
  5. Let’s try ◼ Scaling ◼ Note ◼ L20-21: Magic spell

    for starting coordinate transformation (elaborate later) Computer Graphics Course @Waseda University New
  6. Result ◼ Triangle is translated to upper right direction Computer

    Graphics Course @Waseda University Translated Original
  7. OK, but it’s too simple! ◼ For more complicated transform

    ◼ e.g.) Center is at (15, 15). Window size is 10 x 10. → It’s better if visible range can be directory specified. ◼ glOrtho(left,right,bottom,top,near,far) ◼ More direct and easier to use ◼ For above case, visible range can be specified with: glOrtho(10.0f, 20.0f, 10.0f, 20.0f, -1.0f, 1.0f) Computer Graphics Course @Waseda University
  8. Let’s try ◼ Specify visible range directly Computer Graphics Course

    @Waseda University New New ◼ Note ◼ After visible range specified, coordinates are also updated.
  9. Result ◼ Properly shown even after coordinate updates! Computer Graphics

    Course @Waseda University (12.0, 12.0) (12.0, 18.0) (18.0, 12.0)
  10. Step forward to 3D ◼ Triangle is 2D object? No,

    it’s 3D! Computer Graphics Course @Waseda University Z-coordinate is specified!!
  11. What’s happening now? ◼ We see triangle from the direct

    front Computer Graphics Course @Waseda University
  12. What’re needed for drawing 3D objects? ◼ Like what we

    do when taking a photo Computer Graphics Course @Waseda University 3D shape of the object Camera position/direction (camera extrinsic) Properties of the camera (camera intrinsic) • Projection to camera sensor • Sensor position and size
  13. What’re needed for drawing 3D objects ◼ 3D shape of

    the object ◼ Specify 3D coordinates instead of 2D ones (Strictly, 2D position in OpenGL is also 3D) ◼ Camera position and direction ◼ From and to where camera looks at the scene? ◼ Projection to camera sensor (elaborate later) ◼ There’re several projection methods ◼ Sensor position and size ◼ Projected objects are rasterized for discrete pixels on display Computer Graphics Course @Waseda University
  14. What’re needed for drawing 3D objects ◼ 3D shape of

    the object ◼ Specify 3D coordinates instead of 2D ones (Strictly, 2D position in OpenGL is also 3D) ◼ Camera position and direction ◼ From and to where camera looks at the scene? ◼ Projection to camera sensor (elaborate later) ◼ There’re several projection methods ◼ Sensor position and size ◼ Projected objects are rasterized for discrete pixels on display Computer Graphics Course @Waseda University
  15. Specify 3D positions ◼ You can use either of …

    ◼ glVertex3f(float x, float y, float z) ◼ It’s the same as glVertex2f but take XYZ coordinates. ◼ glVertex3fv(float *vp): ◼ Specify with an array of 3 float values ◼ To this end, specify the pointer to the first element Computer Graphics Course @Waseda University
  16. What’re needed for drawing 3D objects ◼ 3D shape of

    the object ◼ Specify 3D coordinates instead of 2D ones (Strictly, 2D position in OpenGL is also 3D) ◼ Camera position and direction ◼ From and to where camera looks at the scene? ◼ Projection to camera sensor (elaborate later) ◼ There’re several projection methods ◼ Sensor position and size ◼ Projected objects are rasterized for discrete pixels on display Computer Graphics Course @Waseda University These two are specified by matrices
  17. Matrices inside OpenGL ◼ Modelview matrix ◼ Product of “model

    matrix” and “view matrix” ◼ Model matrix: General object transform (typically used for animation) ◼ View matrix: Make camera position to the origin (and others) ◼ Projection matrix ◼ Transform 3D coordinates to those on 2D screen ◼ Two typical projections: ◼ Orthographic projection → Typically used for industrial design ◼ Perspective projection → Movie, video games Computer Graphics Course @Waseda University
  18. Matrices inside OpenGL Computer Graphics Course @Waseda University x y

    z x y z Camera space World space Screen space View matrix (camera matrix) projection matrix
  19. View matrix (a.k.a. camera matrix) ◼ Transform object positions to

    camera-centric coords. ◼ Object’s own coordinate system = World-space coordinates ◼ Camera-centric coordinate systems = Camera-space coordinates Computer Graphics Course @Waseda University x y z x y z Camera space World space Be careful that backward direction corresponds to positive z!
  20. Orthographic and perspective projections ◼ Orthographic*1 Computer Graphics Course @Waseda

    University ◼ Perspective*1 Project vertices along view direction Project vertices along lines to camera center *1) 引用: コンピュータグラフィックス [改訂新版] (コンピュータグラフィックス編集委員会 著) P. 40, 41
  21. How to specify matrices? ◼ glMatrixMode ◼ Specify type of

    matrix to be specified ◼ Modelview matrix: GL_MODELVIEW ◼ Projection matrix: GL_PROJECTION ◼ glLoadIdentity ◼ Initialize a matrix with an identity matrix ◼ Typically, it’s called immediately after glMatrixMode. Computer Graphics Course @Waseda University
  22. Specify view matrix ◼ gluLookAt (9 arguments, need GLU) ◼

    1st-3rd: Camera location ◼ 4th-6th: Location at which camera looks ◼ 7th-9th: Upward direction of camera (not always same with camera y-axis) Computer Graphics Course @Waseda University x y z x y z Camera center (1st-3rd args) Camera target (4th-6th args) Upward direction (7th-9th args)
  23. Orthographic projection in OpenGL ◼ glOrtho ◼ Use orthographic projection

    matrix as projection matrix ◼ Arguments: ◼ 1st, 2nd: visible range for x-direction ◼ 3rd, 4th: visible range for y-direction ◼ 5th, 6th: visible range for z-direction Computer Graphics Course @Waseda University left right
  24. Perspective projection in OpenGL ◼ glFrustum ◼ Use perspective projection

    matrix as projection matrix ◼ “frustrum” means truncated four-sided cone. ◼ Arguments: ◼ 1st, 2nd: visible range for x-direction at near clip plane ◼ 3rd, 4th: visible range for y-direction at near clip plane ◼ 5th, 6th: visible range for z-direction Computer Graphics Course @Waseda University 引用: コンピュータグラフィックス [改訂新版] (コンピュータグラフィックス編集委員会 著) P. 40, 41 left right
  25. Perspective projection in OpenGL ◼ gluPerspective (need GLU) ◼ Use

    perspective projection matrix as projection matrix ◼ Arguments: ◼ Vertical field of view (FOV) ◼ Aspect ratio (of window width to window height) ◼ Distance to near clipping plane ◼ Distance to far clipping plane Computer Graphics Course @Waseda University 引用: コンピュータグラフィックス [改訂新版] (コンピュータグラフィックス編集委員会 著) P. 40, 41 aspect = W/H
  26. Use GLU with GLFW ◼ GLU (OpenGL Utility) ◼ Before

    include “glfw3.h”, specify a macro: GLFW_INCLUDE_GLU Then, ”glu.h” is internally included in “glfw3.h” ◼ Code snippet Computer Graphics Course @Waseda University
  27. What’re needed for drawing 3D objects ◼ 3D shape of

    the object ◼ Specify 3D coordinates instead of 2D ones (Strictly, 2D position in OpenGL is also 3D) ◼ Camera position and direction ◼ From and to where camera looks at the scene? ◼ Projection to camera sensor (elaborate later) ◼ There’re several projection methods ◼ Sensor position and size ◼ Projected objects are rasterized for discrete pixels on display Computer Graphics Course @Waseda University
  28. Viewport transform ◼ Specify where on the display scene will

    be shown ◼ Before: each of x, y is in [-1, 1] (square region) ◼ After: 2D pixel coordinates on the display (rectangular region) ◼ glViewport ◼ Arguments: ◼ 1st, 2nd: XY-coods of lower-left corner on the display ◼ 3rd, 4th: width/height of drawing area ◼ To draw over entire display, specify: ◼ glViewport(0, 0, WIN_WIDTH, WIN_HEIGHT) Computer Graphics Course @Waseda University x y z Camera space Screen space [-1, 1] x [-1, 1] Viewport transform
  29. Source code updates ◼ Reference code ◼ https://github.com/tatsy/OpenGLCourseJP/tree/master/src /coordinate_transformation ◼

    Updates ◼ 3D position of a regular cube is specified ◼ Transformation matrices, and viewport transform are applied Computer Graphics Course @Waseda University
  30. Specify 3D points of a regular cube ◼ Center is

    at origin, size along three axes are all 2. ◼ Copy & paste the definition from reference code Computer Graphics Course @Waseda University
  31. Specify 3D points of a regular cube ◼ Code Computer

    Graphics Course @Waseda University
  32. Depth testing ◼ Check front to back order of faces

    from camera ◼ Algorithms for hidden face removal: ◼ Ray casting ◼ Depth sort method ◼ Scanline method ◼ Z-buffer method ◼ In OpenGL, Z-buffer method is used because: ◼ Its implementation is quite simplicity ◼ It’s easy to be parallelized using GPU Computer Graphics Course @Waseda University
  33. Z-buffer method ◼ Check front-to-back order “pixel by pixel” Computer

    Graphics Course @Waseda University *1) 引用: コンピュータグラフィックス [改訂新版] (コンピュータグラフィックス編集委員会 著) P. 133, 134 Store front-most Z value to “depth buffer” (Z-buffer) Update Z-value on buffer when closer object drawn
  34. Enable depth testing ◼ Reference code ◼ https://github.com/tatsy/OpenGLCourseJP/tree/master/src /depth_testing ◼

    Updates ◼ Enable depth testing ◼ Clear depth buffer along with color buffer Computer Graphics Course @Waseda University
  35. Practice ◼ Practice 3-1 ◼ Check what happens if camera

    position (and other parameters) for gluLookAt is changed (test at least three different positions). ◼ Practice 3-2 ◼ Check what happens if parameters for glOrtho and glFrustum are changed (test at least three different parameters for each of them). Computer Graphics Course @Waseda University
  36. Practice ★Practice 3-3 ◼ Calculate matrices equivalent to glOrtho and

    glFrustum. Then use them with glMultMatrixf. ★Practice 3-4 ◼ Calculate a matrix equivalent to gluLookAt and gluPerspective. Then use them with glMultMatrixf. ★Practice 3-5 ◼ Discuss the difference of “orthographic projection” and “perspective projection” from the aspect of their properties and applications. Computer Graphics Course @Waseda University
  37. Transformation matrices in OpenGL ◼ Transformation is defined by 4x4

    matrix ◼ Homogeneous coordinates: 4D vector for 3D position ◼ Add redundant 4th dimension, representing 3D position as: (𝑥, 𝑦, 𝑧, 𝑤) ◼ Position at 3D Euclidean space is represented as: 𝑥 𝑤 , 𝑦 𝑤 , 𝑧 𝑤 ◼ 4x4 matrix covers: ◼ Linear transform: 3x3 matrix ◼ Rigid transform: 3x3 Unitary + 1x3 translation ◼ Affine transform: 3x3 matrix + 1x3 translation ◼ Homography transform: 4x4 matrix Computer Graphics Course @Waseda University
  38. Properties of transformations ◼ Properties preserved by transformations ◼ Affine

    transform (3x4 matrix): preserve parallel lines ◼ Homography transform (4x4 matrix): preserve straight line ◼ How is transformation applied? Computer Graphics Course @Waseda University 3D position is obtained by dividing 𝑥, 𝑦, 𝑧 coordinates with 𝑤 𝑥′ 𝑦′ 𝑧′ 𝑤′ = 𝐌 𝑥 𝑦 𝑧 1 𝑥′′, 𝑦′′, 𝑧′′ = 𝑥′ 𝑤′ , 𝑦′ 𝑤′ , 𝑧′ 𝑤′
  39. Example of transformations ◼ Translation Computer Graphics Course @Waseda University

    1 0 0 𝑡𝑥 0 1 0 𝑡𝑦 0 0 1 𝑡𝑧 0 0 0 1 𝑥 𝑦 𝑧 1 = 𝑥 + 𝑡𝑥 𝑦 + 𝑡𝑦 𝑧 + 𝑡𝑧 1 Is it possible to achieve translation with 3x3 matrix? Answer is No.
  40. Derivation of projection matrix (glOrtho) ◼ Rectangular is transformed to

    regular cube Computer Graphics Course @Waseda University left right Visible volume: rectangular Screen space: regular cube −1, +1 3
  41. Derivation of projection matrix (glOrtho) ◼ Care about z-direction (backward

    is positive), then ◼ 𝑥scn = 2(𝑥cam−𝑙) 𝑟−𝑙 − 1 = 2 𝑟−𝑙 𝑥cam − 𝑟+𝑙 𝑟−𝑙 ◼ 𝑦scn = 2(𝑦cam−𝑏) 𝑡−𝑏 − 1 = 2 𝑡−𝑏 𝑦cam − 𝑡+𝑏 𝑡−𝑏 ◼ 𝑧scn = −2(𝑧cam−𝑛) 𝑓−𝑛 − 1 = − 2 𝑓−𝑛 𝑧cam − 𝑓+𝑛 𝑓−𝑛 ◼ Rewriting to matrix form, we get: Computer Graphics Course @Waseda University 𝑥scn 𝑦scn 𝑧scn 1 = 2 𝑟 − 𝑙 0 0 − 𝑟 + 𝑙 𝑟 − 𝑙 0 2 𝑡 − 𝑏 0 − 𝑡 + 𝑏 𝑡 − 𝑏 0 0 − 2 𝑓 − 𝑛 − 𝑓 + 𝑛 𝑓 − 𝑛 0 0 0 1 𝑥cam 𝑦cam 𝑧cam 1 Orthographic projection matrix
  42. Derivation of projection matrix (glFrustum) ◼ Frustum in camera space

    is converted to regular cube ◼ Frustrum in camera-space is converted to regular box Computer Graphics Course @Waseda University Y-axis Z-axis 𝐱cam 𝐱scn 1 1 -1 -1 Camera space: frustum Screen space: regular cube Y-axis Z-axis near far
  43. Derivation of projection matrix (glFrustum) ◼ Derive X and Y

    coordinates ◼ According to figure below, Computer Graphics Course @Waseda University {X, Y}-axis Z-axis 𝐱cam Length=2 (from -1 to +1) in screen-space 𝐱scn 1 1 -1 -1 𝑥scn = 𝑛𝑥cam −𝑧cam − 𝑙 ⋅ 2 𝑟 − 𝑙 − 1 = 2𝑛 −𝑧cam 𝑟 − 𝑙 𝑥cam − 𝑟 + 𝑙 𝑟 − 𝑙 {X, Y}-axis Z-axis
  44. Derivation of projection matrix (glFrustum) ◼ X and Y coordinates:

    Computer Graphics Course @Waseda University 𝑥scn = 2𝑛 −𝑧cam 𝑟 − 𝑙 𝑥cam − 𝑟 + 𝑙 𝑟 − 𝑙 𝑦scn = 2𝑛 −𝑧cam 𝑡 − 𝑏 𝑦cam − 𝑡 + 𝑏 𝑡 − 𝑏 𝐱scn = 𝑥scn ′ , 𝑦scn ′ , 𝑧scn ′ , −𝑧cam ↔ 𝑥scn ′ −𝑧cam , 𝑦scn ′ −𝑧cam , 𝑧scn ′ −𝑧cam ◼ With homogeneous coordinates: 𝑥𝑠𝑐𝑛 ′ = 2𝑛 𝑟 − 𝑙 𝑥cam + 𝑟 + 𝑙 𝑟 − 𝑙 𝑧cam , 𝑦𝑠𝑐𝑛 ′ = 2𝑛 𝑡 − 𝑏 𝑦cam + 𝑡 + 𝑏 𝑡 − 𝑏 𝑧cam
  45. Derivation of projection matrix (glFrustum) ◼ So far, projection matrix

    is like: Computer Graphics Course @Waseda University 𝑥scn ′ 𝑦scn ′ 𝑧scn ′ −𝑧cam = 2𝑛 𝑟 − 𝑙 0 𝑟 + 𝑙 𝑟 − 𝑙 0 0 2𝑛 𝑡 − 𝑏 𝑡 + 𝑏 𝑡 − 𝑏 0 0 0 𝐴 𝐵 0 0 −1 0 𝑥cam 𝑦cam 𝑧cam 1 (∵ 𝑧scn is independent of 𝑥cam and 𝑦cam ) 𝑧scn = 𝐴𝑧cam + 𝐵 −𝑧cam = −𝐴 − 𝐵 𝑧cam → A and B in the matrix are still unknown ◼ According to above formula, Z coordinate should be:
  46. Derivation of projection matrix (glFrustum) ◼ Derive Z coordinate ◼

    𝑧scn = −1 at 𝑧near = 𝑛 ◼ 𝑧scn = +1 at 𝑧far = 𝑓 Computer Graphics Course @Waseda University Y-axis Z-axis 𝐱cam Camera space 𝑧far 𝑧near −𝐴 − 𝐵 𝑛 = −1 −𝐴 − 𝐵 𝑓 = +1 𝐵 = − 2𝑓𝑛 𝑓 − 𝑛 𝐴 = − 𝑓 + 𝑛 𝑓 − 𝑛 ◼ Solving above system, we have:
  47. Derivation of projection matrix (glFrustum) ◼ Eventually, we have a

    matrix for glFrustum: Computer Graphics Course @Waseda University 𝑥scn ′ 𝑦scn ′ 𝑧scn ′ −𝑧cam = 2𝑛 𝑟 − 𝑙 0 𝑟 + 𝑙 𝑟 − 𝑙 0 0 2𝑛 𝑡 − 𝑏 𝑡 + 𝑏 𝑡 − 𝑏 0 0 0 − 𝑓 + 𝑛 𝑓 − 𝑛 − 2𝑓𝑛 𝑓 − 𝑛 0 0 −1 0 𝑥cam 𝑦cam 𝑧cam 1 Perspective projection matrix
  48. Remark ◼ By perspective projection, linear depth in camera depth

    will be non-linear in screen space. ◼ Particularly, this problem becomes serious when ratio of “near clip” to “far clip” is tiny! Computer Graphics Course @Waseda University Horizontal axis: camera-space depth Vertical axis: screen-space depth Near: 1, Far: 10 Near: 1, Far: 100 Near: 1, Far: 1000