Computer Graphics : บทที่ 2 - Transformation - 3D Viewing
Transformation Transformation World Coordinates Camera Coordinates Camera Coordinates Screen Coordinates(2D) y y y x x z z z x World Coordinates Camera Coordinates Screen Coordinates
World Coordinates พิกัดใน 3 มิติ กำหนดตำแหน่งของต้นกำเนิดแสง ตำแหน่งกล้อง ตำแหน่งวัตถุ หน่วยเป็นอะไรก็ได้ แต่ต้องเหมือนกัน เช่น เมตร เซนติเมตร กิโลเมตร y x z World Coordinates
ประเภทของพิกัด กฎมือขวา กฎมือซ้าย กฎมือขวา กฎมือซ้าย นิ้วโป้ง = x,นิ้วชี้ = y , นิ้วกลาง = z OpenGL กฎมือขวา DirectX กฎมือซ้าย y y x x z z กฎมือขวา กฎมือซ้าย
ประเภทของพิกัด ความแตกต่างของ กฎมือขวา กับ กฎมือซ้าย หลักการในการมอง การคำนวณ โดยทั่วไปเหมือนกัน Cross Product ต่างกัน ข้อมูลของวัตถุ(ตำแหน่งของvertex) ในพิกัดหนึ่ง ถ้าจะนำไปแสดงในอีกพิกัดหนึ่งต้องเปลี่ยนก่อนแสดงภาพ
Camera Coordinates เป็นพิกัดที่เอากล้องเป็นศูนย์กลางในการคิด แกน X,Y ของกล้องคือแกน X,Y ของ Screen ด้านลึกคือแกน Z y y x z z x Camera Coordinates
Screen Coordinates พิกัดบน Screen เป็นพิกัดที่เกิดหลังจากกระบวนการ Projection จุดไหนไกล กลางscreen ค่า Z จำเป็นในการคำนวณความลึก(ใกล้-ไกล) Z-Buffer y y y x z z x z x Camera Coordinates Screen Coordinates
ประเภทของพิกัด OpenGL ด้านที่วิ่งเข้าหาตัวค่าเป็น + DirectX ด้านที่วิ่งออกจากตัว(ด้านลึก) ค่าเป็น - y y z x x z OpenGL DirectX
Model Coordinates => Local Coordinates ของวัตถุ จุดorigin(0,0) จะอยู่ในตัววัตถุ y y y x x z x z z Model Coordinates World Coordinates
ขั้นตอนของ Coordinates Transformation Model Coordinates Screen Coordinates y y Model Coordinates World Coordinates x z x z y y x Camera Coordinates Screen Coordinates z z x
Affine Transformation =>Homogeneous Coordinates Transformation สามารถจัดการการย้าย การหมุน การย่อขยาย วัตถุ ด้วย เมตริกขนาด 4×4 (x, y, z, w) พิกัดใน 3 มิติ (x/w, y/w, z/w)(โดยปรกติ w = 1)
Rotation หมุนรอบจุด (0,0)
Rotation หมุนรอบแกนที่กำหนดทวนเข็มนาฬิกา x y z +
Rotation หมุนรอบแกน Z เหมือนกับการหมุนใน 2 มิติ x’ = x cos(q) – y sin(q) y’ = x sin(q) + y cos(q) z’ = z y x + z glRotatef(q, 0,0,1)
Rotation หมุนรอบแกน y (z -> y, y -> x, x->z) + หมุนรอบแกน y (z -> y, y -> x, x->z) z’ = z cos(q) – x sin(q) x’ = z sin(q) + x cos(q) y’ = y z x y + glRotatef(q, 0,1,0)
Rotation หมุนรอบแกน x (z -> x, y -> z, x->y) + หมุนรอบแกน x (z -> x, y -> z, x->y) y’ = y cos(q) – z sin(q) z’ = y sin(q) + z cos(q) x’ = x y z x + glRotatef(q, 1,0,0)
Rotation หมุนรอบแกนใดๆ glRotatef(q, nx,ny,nz)
ตัวอย่าง หมุนรอบแกน Y ด้วยมุม 90 องศาตามเข็มนาฬิกา y x z (-5,6,3) (-3,6,3) (3,6,5) y (3,6,3) (3,2,3) x (-5,2,3) (3,2,5) (-3,2,3) z
Translation (Tx,Ty,Tz)
ตัวอย่าง (Tx,Ty,Tz) = (8,-2,0) y x z (-3,6,3) (-5,6,3) (3,4,3) (5,4,3) (-5,2,3) (-3,2,3) (5,0,3) z (3,0,3)
Scaling (Sx,Sy,Sz)
ตัวอย่าง (Sx,Sy,Sz) = (2, 0.5, 1) y x z (-3,6,3) (-5,6,3) (-10,3,3) (-6,3,3) x (-5,2,3) (-3,2,3) (-10,1,3) (-6,1,3) z
ตัวอย่าง y Rotation y Translation y x x x z z z
อันไหนทำก่อนจะอยู่ขวา ตัวอย่าง y Rotation y Translation y x x x z z z Translation Rotation อันไหนทำก่อนจะอยู่ขวา
ตัวอย่าง y y y x x x z z z y x z Translation Rotation Rotation
ตัวอย่าง y Translation y Rotation y x x x z z z Rotation Translation
ตัวอย่าง y Rotation y Translation y x x x z z z Translation Rotation
Affine Transformation y y y x x z z z x
Coordinates Transformation Model Camera วัตถุอยู่ที่ตำแหน่ง (-10,0,4)พิกัดอยู่ทิศทางเดียวกับ world co. กล้องหมุนรอบแกน Y 90องศา ตำแหน่ง(8,2,3) x y z (-10,0,4) (8,2,3)
Coordinates Transformation Model World (0,0,0) (-10,0,4) Translation x y z (-10,0,4) (8,2,3)
Coordinates Transformation World Camera y y y x x (8,2,3) x (-10,0,4) z z z
Coordinates Transformation World Camera y y x z x x (-18,-2,1) z z
Coordinates Transformation Model World World Camera Model World x y z (-10,0,4) (8,2,3)
Coordinates Transformation Model World World Camera Model World y (0,0,0) x z
3D Viewing 3D เหมือนการถ่ายรูป
3D Viewing ซับซ้อนกว่า 2 มิติ เรื่องยากคือทำอย่างไรที่จะวาดภาพ 3 มิติลงบนจอ 2 มิติ การมองวัตถุ 3 มิติในมุมมองที่ต่างกัน ภาพที่ได้บนจอ 2 มิติต่างกัน position, orientation, field of view ต่างกันภาพต่างกัน
Different Views
The Viewing Process สิ่งที่จำเป็นในการสร้างภาพ กำหนด scene geometry กำหนด view (camera) วาดวัตถุ 3 มิติลงบนระนาบ 2 มิติ (Transform the 3D objects onto a 2D plane ) กำหนด real-world window บนระนาบ 2 มิติ real-world window viewport(2D viewing)
ตำแหน่งของกล้องใน world co-ordinate ทิศทางที่ส่องกล้อง การกำหนด Camera การกำหนด View : ตำแหน่งของกล้องใน world co-ordinate ทิศทางที่ส่องกล้อง มุมของกล้อง(ขึ้น ลง ) ขนาดของ view
Projections Perspective Projection Parallel Projections หลังกำหนด view แล้ว ฉายภาพลงบนจอ 2 มิติ (2D Viewplane) การฉายภาพของวัตถุ 3 มิติลงบนจอ 2 มิติ เรียกว่า Planar Geometric Projections มี 2 ประเภท : Perspective Projection Parallel Projections
Perspective Projections y x z
Perspective Projection
Perspective Projection วัตถุที่อยู่ไกลจะเล็กเหมือนกับ Real World สิ่งที่ต้องกำหนด: จุดศูนย์กลางที่จะทำการ Projection Plane ของการ Projection Projection: เชื่อมวัตถุให้ไปรวมกันที่จุดศูนย์กลางของ Projection projection plane camera
Parallel(Orthographic) Projection No effect เกี่ยวกันความใกล้ไกล –ไม่สนใจว่าระยะทางจากกล้องถึงวัตถุ จุดศูนย์กลางของ Projection Infinity Projection calculation ไม่สนใจแกน Z
Field of View กำหนดขนาดของโลก 3 มิติ center of projection x y z y z q
Projection Transformation สิ่งที่ต้องกำหนด Perspective or Orthographic Field of view and image aspect ratio Near and far clipping planes
Near and Far Clipping Planes ภาพที่อยู่ระหว่าง near กับ far เท่านั้นที่จะถูกวาด Near plane + far plane + field of view = Viewing Frustum Near plane x y z Far plane
Viewing Frustum วัตถุที่อยู่นอก frustum จะถูก clip ออก Near plane Far plane y z x Viewing Frustum
Projection Transformation map the object from 3D space to 2D screen x y z x y z Perspective: gluPerspective() Parallel: glOrtho()
Perspective Projections glFrustrum(xmin, xmax, ymin, ymax, zmin, zmax);
Perspective Projections gluPerspective(fov, aspect, near, far);
Perspective Projections
Lens Configurations fov = 122° fov = 84° fov = 54° fov = 10°
Perspective Projection Parameters: centre of projection (COP) field of view (q, f) projection direction up direction
Perspective Projection x y z Z = -1 Z = 1 (-1, -1) (1, 1) eye near far (top view)
Perspective Projection (-1, -1, 1) (1, 1, -1) Canonical View Volume x y z
Parallel Projection (Xp, Yp) y z (x,y,z) x
Parallel Projection (2) OpenGL: ทุกอย่าง canonical view volume glOrtho(xmin, xmax, ymin, ymax, near, far) (xmax, ymax, far) (1, 1, -1) (xmin, ymin, near) (-1, -1, 1) Canonical View Volume
Projection Transformation In OpenGL: Set the matrix mode to GL_PROJECTION Perspective projection: gluPerspective(fovy, aspect, near, far) or glFrustum(left, right, bottom, top, near, far) Orthographic: glOrtho(left, right, bottom, top, near, far)
Projection Transformation void display() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJETION); glLoadIdentity(); gluPerspective(fove, aspect, near, far); glMatrixMode(GL_MODELVIEW); gluLookAt(0,0,1,0,0,0,0,1,0); display_all(); // your display routine }