OpenGL Programming (II) 3D Graphics Fundamentals 컴퓨터 그래픽스 1999. 4. 29 담당교수 : 김 창 헌
3D Perception 3D vs 3D Perception 3D 에서 실제 본다(see)는 것 깊이나 3D에 대한 환영(illusion)을 제공 3D 에서 실제 본다(see)는 것 두 눈으로 물체를 본다. 각 눈의 망막에 서로 다른 2D 이미지를 만듬. 뇌가 서로 다른 2장의 2D 이미지를 한 장의 3D 이미지로 합성. 물체가 멀리 있을수록 두 눈이 응시하는 각 작아짐.
한 장의 사진에서 3D 효과 한 장의 사진이면? Cartoon, animation등 Perspective Hidden Surface Removal Color and Shading Lights and Shadow
2D + Perspective = 3D 하나의 눈 (카메라)에서 생성된 이미지도 3D 효과를 가질 수 있다. 가까운 물체는 먼 물체보다 더 큰 것 같다. 이 특징 하나로 3D 효과 가능
Hidden Line Removal Depth Cueing Hiddein Surface removal 눈에서 거리가 멀수록 edge는 희미하게 보인다. Hiddein Surface removal surface로 된 육면체는 뒤쪽 표면이 보이지 않는다.
Colors and Shading Wireframe Texture Color 여전히 이미지는 real하지 않다. 나무 질감, 과자 상자 위의 무늬 Color 각 면의 색깔을 다르게
Lights and Shadows Light 물체의 intensity의 분포를 결정짓는다. Shadow 빛에 의한 그림자 효과
Coordinate Systems 3D 물체가 어떻게 스크린에 그려지나? 좌표계 필요 OpenGL Window가 생성되면 Coordinate system 필요 지정된 좌표계가 screen pixel상에 매핑되는 함수 지원
2D Cartesian Coordinate Clipping Area Viewport Drawing Primitive
Coordinate Clipping Window를 점유하는 Cartesian Space의 영역 명시 ( Clipping Area) 지정된 좌표를 스크린 좌표로 이동 Window Client Area
Viewport Clipping area를 그리기 위해 사용하는 window의 client area 안의 영역 Clipping area를 window 영역에 mapping ( 대개 영역 전체에 할당 ) Clipping Area Window Client Area 일부 영역 가능(Viewport
계속 Logical coordinate가 더 큰 screen coordinate에 매핑
Projections, The Essence of 3D 3D Cartesian Coordinate Orthographic Projections Perspective Projections top Clipping Volume near Viewport
Window Screen Coordinate y x (100, 100) (100, 100) y x Windows Screen Coordinate OpenGL Screen Coordinate
Drawing Shapes with OpenGL Simple Program using AUX Lib void main(void) { // AUX library window and mode setup auxInitDisplayMode(AUX_SINGLE | AUX_RGBA); auxInitPosition(100,100,250,250); auxInitWindow("My second OpenGL Program"); // Set function to call when window needs updating auxMainLoop(RenderScene); }
Rendering Function Callback 함수 예제 window가 update될 필요가 있을 때마다 부른다. void CALLBACK RenderScene(void) { }
Drawing a Rectangle 2D flat rectangle Sample 3D 상의 z=0인 평면 위에 존재 glClearColor(0.0f, 0.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(100.0f, 150.0f, 150.0f, 100.0f); glFlush();
Scaling to the Window Setting the Viewport and Clipping Volume window creation code auxInitPosition(100,100,250,250); viewport 와 window size viewport는 1사분면에 존재 (0, 0, 255, 255)
Reshape Function ( Aux lib ) Viewport setting Code glViewport(0, 0, w, h); Reshape Function ( Aux lib ) main( ) { . auxReshapeFunc(ChangeSize); auxMainLoop(RenderScene); }
Defining Viewport and Clipping Volume void CALLBACK ChangeSize(GLsizei w, GLsizei h) { // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset coordinate system glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) if (w <= h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); }
Keeping a Square Square Apect ratio height/width Image distortion ex) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); Clipping Region 250 250 250 250 250 250