Viewing Viewing 329 24 년봄학기 5//24 박경신 관측의기본요소 객체 (Objects) 관측자 (Viewer) 투영선 (Projector) 투영면 (Projection plane) 투영중심 (Center of Projection: COP) COP가유한한경우 투시관측 (Perspectie iews) COP가무한한경우 평행관측 (Parallel iews) Classical Viewing Classical Viewing Planar projections Parallel Perspectie 전면관측측면경사관측평면경사관측 Oblique Orthographic -point 2-point 3-point other Caalier Cabinet Aonometric Multiiew orthographic Isometric Dimetric Trimetric 등축관측 - 소실점투시관측 3- 소실점투시관측
Parallel Viewing Perspectie Viewing (Direction of Projection) Orthographic Projection 직교투영 (Orthographic Projection) 에서는투영선 (Projector) 은투영면 (Projection plane) 에수직이다. Multiiew Orthographic Projection 다중관측직교투영 (Multiiew Orthographic Projection) 에서는여러개의투영면을만드는데 각각은객체의주면 (principal face) 중하나와평행하다. 일반적으로세개의관측 ( 전면 상면 우측면등 ) 을표시한다. Isometric (not multiiew orthographic iew) front top 거리와각이모두보존됨 또한 거리와모양의왜곡이없음 그러나 다중관측직교투영으로부터객체가어떻게생겼는지추측이어려움 그래서 Isometric iew과함께제공함 sie se
Aonometric Projections Construction of an Aonometric Projection 축측관측 (Aonometric iew) 에서투영선은투영면에수직이지만 투영면은객체에대해어떠한방향에도존재할수있다. q q 2 q 3 등축투영 (isometric) - 만일투영면이사각형객체의모서리에서만나는세개의주면에대해서대칭으로놓여짐 이축투영 (imetric) 투영면이두개의주면이대칭되도록놓여짐 삼축투영 (trimetric) 일반적인경우 투영면투영면투영면 축측투영의평면도 & 측면도 Tpes of Aonometric Projections Oblique Projection 경사투영 (Oblique Projection) 에서투영선은투영면과임의의각을가질수있다. 투영면에평행한면내의각은보존된다. 선들의평행은이미지안에서보존되지만각은보존되지않는다. 등축투영: 이미지공간에서선분의길이는객체공간에서측정된길이보다짧다. 이러한거리의단축 (foreshortening) 은세개의주면에서똑같이발생한다. 따라서거리비교는가능하다. 이축투영 : 두개의다른단축비를가진다. 삼축투영 : 세개의다른단축비를가진다. 경사투영의평면도 & 측면도
원근 ( 투시 ) 관측 () 은객체가관측자로부터멀리떨어질수록크기가축소된다. 투영선은투영중심 (Center Of Projection) 으로모인다. - 2-3-Point Perspectie 일점 이점 삼점투시 (one two three point perspecties) 관측의차이는객체의세가지주방향가운데얼마나많은방향이투영면에평행한가에있다. 삼점투시의경우세개의주방향에평행한모든직선들은세개의소실점 (anishing point) 에서만난다. COP 원근 ( 투시 ) 관측은크기가축소 (iution) 되는특징을가진다. 이러한크기변화는자연스러운모습의관측 (realistic iew) 을얻게한다. 그러나 선분의길이가얼마나짮아지는가는그선분이관측자로부터얼마나떨어져있는가에의존하기때문에 길이측정을할수없다. 3 점투시 2 점투시 점투시 Orthographic Projection 직교투영 (Orthographic projection) 은직육면체 (rectilinear bo) 의관측공간을화면에투영한다. 객체의크기가거리에따라변하지않는다. 원근투영 (Perspectie projection) 은절두체 (frustum i.e. truncate t prami) 관측공간을화면에투영한다. 가까운객체는크게나타나고 멀리있는객체는작게나타난다. Viewing olume Viewing olume
OpenGL Orthographic Projection glm::ortho(left right bottom top near far) 이함수의매개변수는 glfrustum의매개변수와동일하다. 관측공간은직육면체이다. near 와 far 는양수만받는다. 내부에서음수로바꿔서사용한다. OpenGL OpenGL에서투시투영 (perspectie projection) 은카메라가원점 (origin) i 에위치하고있으며 Z 축을바라보고있다. glm::frustum(left right bottom top near far) 앞면과뒷면의거리는양수이어야하며 COP 에서평면까지의거리로측정된다. 관측공간은절두체 (frustum i.e. truncate prami) 이다. OpenGL glm::perspectie(fo aspect near far) fo Y-축방향에서의시야 (fiel of iew) 각도 aspect 투영면의 ( 너비를높이로나눈 ) 종횡비 (aspect ratio) near 앞쪽클리핑면 far 뒤쪽클리핑면 Projection = glm::perspectie(45 aspect. ); COP aspect = w/h Orthographic Projection 직교투영 (Orthographic projection) 투영선이관측평면에수직인평행투영의특수한경우이다. 렌즈와카메라의뒷면이평행하고초점거리가무한대이다. Orthographic projection p = p = p = w p = M q=mp ortho = M ortho p = q =
COP 원근 / 투시투영 (Perspectie projection) 투영중심 (Center of projection) 은원점 (Origin) 투영면 (Projection plane) p = Projection plane p = / p = / p = Perspectie projection M pers = p = q = / Mp = p / p = = / M pers p = q = 투영면 (Projection plane PP) 이투영중심 (Center of j ti COP) 의앞에있는경우 projection COP) 의앞에있는경우 P P COP () M = 투영면 (Projection plane PP) 이투영중심 (Center of projection COP) 의뒤에있는경우 M = P() COP () P ( ) /
투영면 (Projection plane PP) 이 = 에있고 투영중심 (Center of projection COP) 이 = - 에있는경우 P P COP (-) Projection Normaliation 투영정규화 (projection normaliation) 는왜곡된객체의직교투영이원래객체의원하는투영이되도록 객체들을사전왜곡시킴으로써 모든투영을직교투영으로변환시키는작업이다. ( ) ( ) M = / Orthogonal Projection Matri Orthogonal projection은관측공간 (View olume) 을정규관측공간 (Canonical iew olume) 으로매핑한다. 직육면체 -> 정육면체직교투영 -> 직교투영 Orthogonal Projection Matri 지정된관측공간의중심을정규관측공간의중심으로이동 ( left right) ( top bottom) ( far near) T 2 2 2 지정된관측공간의변을길이가 2 가되도록크기변환 2 2 2 S ( right left) ( bottom top) ( far ( near)) Projection matri: P = ST = General case: P = M ortho ST 2 right left right left right left 2 top bottom top bottom top bottom 2 far near far near far near
Oblique Projection Matri Oblique Projection Matri shear ( alues unchange) 경사투영 -> 직교투영직육면체 -> 정육면체직교투영 -> 직교투영 H() = cot θ cot φ top iew tan p p cot - p - p sie iew tan p p cot Projection matri: P = M ortho H() General case: P = M ortho ST H() Matri Matri Perspectie projection은관측공간 (View olume) 을정규관측공간 (Canonical iew olume) 으로매핑한다. [l r] => [- ] [b t] => [- ] [-n -f] => [ -] COP Projection plane at = - 절두체 -> 정육면체원근투영 -> 직교투영한점으로모이던투영선들이평행해짐 - 원근감생성
Matri 원근정규화 (Perspectie normaliation) Distorte object projects correctl Matri 원근정규화 (Perspectie normaliation) 는원근투영을직교투영으로바꾸는작업이다. 투영면 (PP) 이 = - 투영중심 (COP) 이원점인원근투영행렬 M M pers = = = = near/far New clipping olume 관측공간의측면이투영면을 45도로교차하도록함으로써시야를 9 도로고정 = = Matri N 행렬 : N = p =Np: α β w 원근나눗셈 (Perspectie iision) 한후 p ->p : p Matri = 이면 = = 이면 = Far plane = ma 이면 ma ma Near plane = 이면 -> 매핑하도록 와 를선정 : (- -) & (- ma ) ma ma ma & = ma ma ma ma ma 2 ma = ( ma) ma ma ma ma ma ma
OpenGL OpenGL glm::frustum(left right bottom top near far) Shear right left top bottom H (cot cot) H cot cot 2 far 2 far Then right left top bottom near far 2 far 2 far Scale 2 near 2 S S near right left top bottom Then Shear Scale N - - Normalie N = α β = = far near far near 2 far near far near OpenGL Computer Viewing P = NSH= 2near right left right left right left 2near top bottom top bottom top bottom far near 2 far near far near far near 컴퓨터에서의관측은다음과같이구성된다. 카메라의위치와방향을잡아준다. Moel-iew transformation matri 투영변환을적용한다. Projection transformation matri 클리핑 (Clipping) 한다. View olume OpenGL 에서초기카메라는 객체프레임의원점에놓이고 -축의음수방향을향한다. 직교관측으로설정되어있고 원점을중심으로한각변의길이가 2인정육면체로된관측공간을가진다. 기본투영면은 =인면이고 투영방향은 축과나란하다. 2 clippe out =
Positioning the Camera Frame 모델-관측변환행렬 (moel-iew transformation matri) 방법 관측참조점 (VRP) 관측면법선 (VPN) 관측상향벡터 (VUP) 를이용한관측- 방향행렬 (i (ieworientation matri) 방법 Look-at 함수 Positioning the Camera Frame OpenGL 에서카메라위치지정방법 카메라를원점으로부터뒤로이동시키는방법 또는물체를카메라의앞으로이동시키는방법을사용한다. Worl = glm::translate(glm::mat4(.f) l t l t4( glm::ec3(.. -)); Worl frame = Camera frame Moing the camera frame after translation b > Positioning the Camera 연속된회전 (rotation) 과이동 (translation) 으로카메라위치를지정할수있다. 예제 : 축방면에서바라보는관측 R = 카메라를 축을중심으로회전 T = 카메라를원점에서먼곳으로이동 Moel-iew matri C = TR Worl = glm::translate(glm::mat4(.f) glm::ec3(.. -)) * glm::rotate(glm::mat4(.f) ( -9 glm::ec3( )); - -9º u Camera Frame 관측참조점 (View reference point VRP) 관측면법선 (View plane normal VPN) n = PRP - VRP 관측상향벡터 (View-up ector VUP) 측면벡터 (Sie ector) u = VUP n 상향벡터 (Up ector) = n u u n를정규화 (normalie) 관측좌표계 (iewing coorinate sstem u - -n ) 와 VRP를추가하여카메라프레임 (camera frame) 을정의 n PRP (Projection Reference Point)
Camera Frame View-orientation matri M u n u n M u n Rotation matri M - = M T = R Worl frame 에서카메라의위치지정: V = RT u u u e u u u e u e e n n n e n n n e n lookat glm::lookat(ec3 & ee ec3 & at ec3 & up) = n u n n = ee at u = up n u lookat Ee Point : 카메라의원점 ( 월드좌표계 ) Look-At : 카메라가쳐다보고있는위치 ( 카메라이미지의중심이되는위치 ) Up-Vector : 월드좌표계에서카메라가보는 up 벡터 ( 카메라이미지에서어디로향하는지에대한방향벡터 ) Ee point (c c c ) Up-ector ( ) glulookat oi glulookat(glouble e GLouble e GLouble e GLouble a GLouble a GLouble a GLouble u GLouble u GLouble u) { GLouble M[6]; GLouble u[3] [3] n[3]; GLouble mag; n[] = e a; n[] = e a; n[2] = e a; // n (camera frame Z) mag = sqrt(n[]*n[] + n[]*n[] + n[2]*n[2]); if (mag){ n[] []/= mag; n[] /= mag; n[2] /= mag; } [] = u; [] = u; [2] = u; // u (camera frame X) u[] = []*n[2] [2]*n[]; u[] = -[]*n[2] + [2]*n[]; u[2] = []*n[] - []*n[]; mag = sqrt(u[]*u[] + u[]*u[] + u[2]*u[2]); [2]) if (mag) { u[] /= mag; u[] /= mag; u[2] /= mag; } [] = n[]*u[2] n[2]*u[]; [] = -n[]*u[2] + n[2]*u[]; [2] = n[]*u[] - n[]*u[]; // (camera frame Y) mag = sqrt([]*[] + []*[] + [2]*[2]); if (mag) { [] /= mag; [] /= mag; [2] /= mag; } Worl space origin Camera space origin Look-at point (p p p ) } M[] = u[]; M[4] = u[]; M[8] = u[2]; M[2] =.; ; // R M[] = []; M[5] = []; M[9] = [2]; M[3] =.; M[2] = n[]; M[6] = n[]; M[] = n[2]; M[4] =.; M[3] =.; M[7] =.; M[] =.; M[5] =.; glmultmatri(m); gltranslate(-e -e -e); // RT
Yaw Pitch Roll 편요 (Yaw) Y 축회전 종전 (Pitch) X 축회전 횡전 (Roll) Z 축회전 Eleation an Aimuth 방위각 (Aimuth) X 축회전 (-8 ~ 8) 앙각 (Eleation) Y 축회전 (-9 ~ 9) 꼬임각 (Twist angle) Z 축회전 (-8 ~ 8) 3차원극좌표계 (Spherical Polar Coorinates Sstem) Reference 원근정규화 http://www.songho.ca/opengl/gl_projectionmatri.html