[[TableOfContents]] = ì œ 1 장 그래픽 기초 ì´ë¡ = == 수학ì 기초 ì´ë¡ == === 좌표계 === * ì˜¤ë¥¸ì† ì¢Œí‘œê³„ : 우리가 수학책ì—서 ë§Žì´ ë³´ë˜ ê·¸ 좌표계다. 위아래가 Z, 앞뒤가 X, 좌우가 Y, 그래픽스ì—ì„ ìž˜ 안쓴다. * ì™¼ì† ì¢Œí‘œê³„ : ê³µê°„ê°œë… ì´í•´í•˜ê¸° 쉽기 ë•Œë¬¸ì— ê·¸ëž˜í”½ìŠ¤ì—서 ë§Žì´ ì‚¬ìš©í•œë‹¤. 앞뒤가 Z, 좌우가 X, 위아래가 Y * 구면 좌표계 : 주로 시ì ì„ í‘œí˜„í• ë–„ 잘 ì“°ì¸ë‹¤. ì›ì ì—ì„œë¶€í„°ì˜ ê±°ë¦¬ Ï, zì¶•ê³¼ì˜ ê° Î¸, xì¶•ê³¼ì˜ ê° Ï† 로 구성ëœë‹¤. ì´ê±¸ ê·¸ë¦¼ì— ë”°ë¼ í’€ì–´ë³´ë©´, * x = Ïsinθcosφ * y = Ïsinθsinφ * z = Ïcosθ === 벡터 === * ë.. 별로 볼거 없다. 다 ê³ ë“±í•™êµ ë•Œ í–ˆë˜ ê±°ë‹¤. ìƒì†Œí•œê±°ë§Œ 몇개 ì ì–´ë³´ë©´.. * 벡터 표현ì„.. ì›ë¬¸ìžë¡œ í•´ì•¼ê² ë‹¤. 화살표 그릴ë¼ë‹ˆê¹Œ ì—´ë¼ ê·€ì°®ë‹¤. * 외ì ì€ â“Xâ“‘ ì´ë ‡ê²Œ 표현한다. ë°©í–¥ì€ ë²¡í„° â“ì—서 벡터ⓑ쪽으로 180ë„보다 ìž‘ì€ ê°ìœ¼ë¡œ ëŒë¦´ë•Œ 나사가 진행하는 ë°©í–¥ì´ë‹¤. ì´ê²Œ ë” ê°œì†Œë¦¬ëƒ--; * ë²¡í„°ì˜ í¬ê¸° : |â“Xâ“‘| = |â“||â“‘|sinθ * 외ì ì˜ ì„±ì§ˆ : ë‘ ë²¡í„°ì™€ ë™ì‹œì— 수ì§ì¸ 벡터 === í–‰ë ¬ === * 3X3ì˜ í–‰ë ¬ì‹ {{{~cpp | a1 b1 c1 | | b2 c2 | | b1 c1 | | b1 c1 | D = | a2 b2 c2 | = a1 | | - a2 | | + a3 | | | a3 b3 c3 | | b3 c3 | | b3 c3 | | b2 c2 | }}} * ë²¡í„°ì˜ ì™¸ì ì„ í–‰ë ¬ë¡œ 표시하기(i,j,k는 ê°ê° x,y,zë°©í–¥ì˜ ë‹¨ìœ„ë²¡í„°) {{{~cpp | i j k | â“Xâ“‘ = | Xa Ya Za | | Xb Yb Zb | }}} * ê¼ì§€ì ë°©í–¥ íŒë³„? ì´ê±´ ì–´ë”° 쓰는 ê±°ì§€.. == ë™ì°¨ 좌표계와 3ì°¨ì› ë³€í™˜ í–‰ë ¬ == * ë™ì°¨ 좌표계? 그냥 알기 쉽게 ë§í•˜ìžë©´, í‰í–‰ì´ë™ì„ ì¼ë°˜ì ì¸ ì¼ì°¨ë³€í™˜ìœ¼ë¡œ 나타내기가 불가능해서, í•˜ë‚˜ì˜ ì„±ë¶„ì„ ì¶”ê°€í•´ì„œ 그걸로 나타내는 거다. * 3ì°¨ì› ì¢Œí‘œë¥¼ 나타낼때는 x,y,z ê·¸ë¦¬ê³ wë¼ëŠ” ê°’ì„ ì¶”ê°€ë¡œ ì¨ì¤€ë‹¤. 그냥 1로 ì¨ì£¼ë©´ ëœë‹¤. === ìž„ì˜ì˜ ì¶•ì„ ì¤‘ì‹¬ìœ¼ë¡œ íšŒì „ì´ë™ 하기(í—‰ ì´ê²ƒì€ ìˆ˜ì¹˜í•´ì„ ì‹œí—˜ë¬¸ì œ?) === * íšŒì „ì¶•ì´ ì›ì ì„ ì§€ë‚˜ê²Œ í‰í–‰ì´ë™ 시킨다. * íšŒì „ì¶•ì´ xzí‰ë©´ê³¼ 만나ë„ë¡ xì¶•ì„ ì¤‘ì‹¬ìœ¼ë¡œ íšŒì „ì´ë™ 시킨다. * íšŒì „ì¶•ì´ zì¶•ê³¼ ì¼ì¹˜í•˜ê²Œ yì¶•ì„ ì¤‘ì‹¬ìœ¼ë¡œ íšŒì „ì´ë™ 시킨다. * ì›í•˜ëŠ” ë§Œí¼ zì¶•ì„ ì¤‘ì‹¬ìœ¼ë¡œ ëŒë ¤ì¤€ë‹¤. * ìœ„ì˜ ìœ„ì˜ ê²ƒì˜ ì—변환 * ìœ„ì˜ ìœ„ì˜ ìœ„ì˜ ê²ƒì˜ ì—변환 * ìœ„ì˜ ìœ„ì˜ ìœ„ì˜ ìœ„ì˜ ê²ƒì˜ ì—변환 * ìš” í–‰ë ¬ë“¤ì„ ë‹¤ 곱하면 {{{~cpp T(-x1, -y1, -z1) Rx(φ) Ry(-θ) Rz(α) Ry(θ) Rx(-φ) T(x1, y1, z1) ì ˆë¼ ë³µìž¡í•´ ë³´ì¸ë‹¤. ê·¼ë° ì§ì ‘ ì†ìœ¼ë¡œ ë”°ë¼ í•´ë³´ë©´ 별루 안 복잡하다. }}} == 윈ë„우와 ë·°í¬íЏ == * ë·°í¬íЏ : 화면ìƒì— 나타낼 ë¶€ë¶„ì„ ê°€ë¥´í‚´ * 윈ë„ìš° 위ì—서 xê°’ì˜ ìµœì†Œê°’ì„ x(min), ìµœëŒ€ê°’ì„ x(max), yê°’ì˜ ìµœì†Œê°’ì„ y(min), ìµœëŒ€ê°’ì„ y(max) ë¼ í•˜ìž. * ë·°í¬íŠ¸ì˜ ì‚¬ê°í˜•ì˜ ìµœì†Œ,ìµœëŒ€ê°’ì„ X(min), X(max), Y(min), Y(max) ë¼ í•˜ìž. * 확대/ì¦ê°€ëŸ‰ 구하는 ê³µì‹ * delx = (X(max) - X(min)) / (x(max) - x(min)) * dely = (Y(max) - Y(min)) / (y(max) - y(min)) * x(c) = (x(max) + x(min)) / 2 * y(c) = (y(max) + y(min)) / 2 * X(c) = (X(max) + X(min)) / 2 * Y(c) = (Y(max) + Y(min)) / 2 * c1 = X(c) - x(c) * delx * c2 = Y(c) - y(c) * dely * X = delx * x + c1 * Y = dely * y + c2 == Polygon Mesh ë°ì´í„° 구조 == === ì¡°ê±´ === * ëª¨ë“ ë©´ì€ ì¸ì ‘해야 한다. * íŠ¹ì •í•œ 다ê°í˜•ì„ mesh ë‚´ì—서 ì°¾ì„수 있어야 한다. * í•˜ë‚˜ì˜ ë‹¤ê°í˜•ì„ ì´ë£¨ëŠ” ëª¨ë“ ëª¨ì„œë¦¬ëŠ” ì •í™•í•˜ê²Œ 표현ë˜ì–´ì•¼ 한다. * í•˜ë‚˜ì˜ ëª¨ì„œë¦¬ë¥¼ ê³µìœ í•˜ëŠ” 다ê°í˜•ë“¤ì„ ì§ì ‘ ì°¾ì„수 있어야 한다. * mesh ì „ì²´ë¥¼ 바꾸거나 ë””ìŠ¤í”Œë ˆì´í• 수 있어야 한다. === Explicit Polygons Mesh === * ê¼ì§€ì ì„ vertex tableì— ì €ìž¥í›„ 다ê°í˜•ì„ ê¼ì§€ì ì˜ ì—°ì†ëœ 순서로 나타내는 방법 * 리스트와 ë°°ì—´ì„ ì“¸ 수 있는ë°, 리스트가 ì¢€ë” íŽ¸í•˜ë‹¤. * ë§Œì•½ì— P1 다ê°í˜•ì„ ì´ë£¨ëŠ” Vertexë“¤ì„ ë°˜ì‹œê³„ ë°©í–¥ 순으로 v1,v3,v4,v6ì´ë¼ 하면 v1->v3->v4->v6 ì´ë ‡ê²Œ 가르키게 리스트를 구현하면 ëœë‹¤. * 단ì * ëª¨ë“ ëª¨ì„œë¦¬ê°€ ë‘번씩 ê·¸ë ¤ì§€ê²Œ ëœë‹¤. * ì–´ë–¤ 모서리를 ê³µìœ í•˜ê³ ìžˆëŠ” 다ê°í˜•ì„ ì°¾ê¸°ê°€ ì–´ë µë‹¤. * ë•Œë¬¸ì— ì†ë„ê°€ ì¡¸ë¼ ëŠë¦¬ë‹¤. === Explicit Edges Mesh === * ì´ê±´ 잘 ì´í•´ê°€ 안가는군. ë‚˜ì¤‘ì— = 3ì°¨ì› ê·¸ëž˜í”½ = == 3ì°¨ì› ê·¸ëž˜í”½ì´ëž€? == * ì–´ë–¤ 물체를 ì§ì„ ê³¼ ê³¡ì„ ì˜ ì§‘í•©ì²´ë¡œ 표현한 ë‹¤ìŒ íˆ¬ì˜ì„ 통해 í…Œë‘리를 표시하는 'Wire frame 모ë¸' * ì–´ë–¤ 물체를 ê·¸ê²ƒì„ ë‘˜ëŸ¬ì‹¸ê³ ìžˆëŠ” 면으로 나타낸 ë‹¤ìŒ ì€ì„ , ì€ë©´ì œê±° ì•Œê³ ë¦¬ì¦˜ì´ë‚˜ Shading ì•Œê³ ë¦¬ì¦˜ì„ ê°€ë¯¸í•˜ì—¬ 보다 í˜„ì‹¤ê° ìžˆê²Œ ê·¸ 물체를 표현하는 'Surfaced 모ë¸' * 수학ì ì¸ ê³ ì²´ë¡œ ì–´ë–¤ 물체를 표현하는 'Solid 모ë¸' * 가장 í° ë¬¸ì œì : 깊ì´ê° 표현 === íˆ¬ì˜ === * 3ì°¨ì›ì„ 2ì°¨ì›ìœ¼ë¡œ 표현하는 가장 기초ì ì¸ ë°©ë²• * í‰í–‰íˆ¬ì˜ (Parallel projection, orthogonal projection) : ë¬¼ì²´ì˜ ëª¨ë“ ì ì„ í™”ë©´ìƒì— 투ì˜. 깊ì´ê°...ì€ ë³„ë£¨ë‹¤. * ì›ê·¼íˆ¬ì˜ (Perspective projection) : 우리 ëˆˆì— ë³´ì´ëŠ” 대로(ì›ê·¼ê° ì‚´ë ¤ì„œ) 깊ì´ê° ì‚´ë¦¬ëŠ”ë° ì¢‹ë‹¤. === ì€ì„ /ì€ë©´ ì œê±° === * ë§ê·¸ëŒ€ë¡œ 안보ì´ëŠ” 부분 ì—†ì• ê¸° === ë©´ì˜ ìƒ‰ === * ê´‘ì› ëª¨ë¸ ì‚¬ìš©(Ray-Tracing법 ë§Žì´ ì‚¬ìš©) === ê·¸ë¦¼ìž === * ì ê´‘ì› : 계산하긴 쉽지만 í˜„ì‹¤ê° ë–¨ì–´ì§ * ë¶„ì‚°ê´‘ì› : 계산하긴 ì–´ë µì§€ë§Œ í˜„ì‹¤ê° ì¢‹ìŒ == 시ê°ë³€í™˜ê³¼ ì›ê·¼íˆ¬ì˜ == * 실좌표계(Xw,Yw,Zw) -> 시ê°ì¢Œí‘œê³„(Xe,Ye,Ze) -> 스í¬ë¦° 좌표계(X,Y) === 시ê°ë³€í™˜ === * 시ê°ì¢Œí‘œëŠ” 앞ì—서 ë§í–ˆë“¯ì´ 구면좌표계를 쓴다. * [ Xe, Ye, Ze, 1 ] = [ Xw, Yw, Zw, 1] V : V는 실좌표계를 시ê°ì¢Œí‘œê³„로 바꾸기 위한 í–‰ë ¬ * í–‰ë ¬ V 구하기 * ì‹¤ì¢Œí‘œê³„ì˜ ì¤‘ì‹¬ O를 시ì E로 í‰í–‰ì´ë™ì‹œí‚¨ë‹¤. T( -Xe, -Ye, -Ze ) * yì¶•ì„ ì‹œì„ ë²¡í„°ì˜ xyí‰ë©´ì„±ë¶„ì˜ ë°©í–¥ê³¼ ì¼ì¹˜ì‹œì¼œì•¼ 한다. Zì¶•ì„ ì¤‘ì‹¬ìœ¼ë¡œ (파ì´/2-θ) íšŒì „ (θ는 xì¶•ê³¼ì˜ ê°) * zì¶•ì´ ì‹œì„ ë²¡í„°ì˜ ë°©í–¥ì´ ë˜ì–´ì•¼ 하므로 xì¶•ì„ ì¤‘ì‹¬ìœ¼ë¡œ (φ-파ì´) íšŒì „ (φ는 zì¶•ê³¼ì˜ ê°) * xì¶•ì˜ ë±¡í–¥ì„ ë°”ê¾¼ë‹¤. * ê²°ë¡ (지금 ë³´ë‹ˆê¹ ìš°ë¦¬ê°€ ì¼ë°˜ì 으로 쓰는 í–‰ë ¬ì´ëž‘ 좀 다르다. 행과 ì—´ì´ ë°”ê»´ìžˆë‹¤.) {{{~cpp V = T( -Xe, -Ye, -Ze) Rz(파ì´/2-θ) Rx(φ-파ì´) Myz | -sinθ -cosφcosθ -sinφcosθ 0 | | cosθ -cosφsinθ -sinφsinθ 0 | = | 0 sinφ -cosφ 0 | | 0 0 1 | }}} === ì›ê·¼íˆ¬ì˜ === * 그림 ë´ì•¼ ì´í•´í• 수 있는ë°.. 그냥 ì‹ë§Œ ì¨ë³´ë©´.. * X = d*x/z + c1, Y = d*y/z + c2 (d는 시ì ê³¼ 스í¬ë¦° 사ì´ì˜ 거리, 스í¬ë¦°ì˜ 가로 2c1, 세로 2c2) = 혼합(Blend) = * í—·ê°ˆë ¸ë˜ ë¶€ë¶„ì´ê³ ì¸í„°ë„·ì—서 ì°¾ì•„ë„ ë³„ë¡œ ìžì„¸ížˆ 안나왔길래 ì ì—ˆìŒ. * ì›ë³¸(source) : 새로 ê·¸ë ¤ì§€ëŠ” 픽셀 * 대ìƒ(destination) : í”„ë ˆìž„ 버í¼ì— ì´ë¯¸ ê·¸ë ¤ì ¸ 있는 픽셀 * 사용하는 함수 : glEnable(GL_BLEND), glBlendFunc(ì›ë³¸ í”½ì…€ì— ëŒ€í•œ 블랜딩 계수를 계산하는 ë°©ì‹, ëŒ€ìƒ í”½ì…€ì— ëŒ€í•œ 블랜딩 계수를 계산하는 ë°©ì‹) ì›ë³¸(대ìƒ) 혼합 함수들 * ì›ë³¸ í”½ì…€ì— ëŒ€í•œ 계산 ë°©ì‹ || ë°©ì‹ || 설명 || || GL_ZERO || ì›ë³¸ 색ìƒì„ 0,0,0,0 으로한다 || || GL_ONE || ì›ë³¸ 색ìƒì„ 그대로 사용한다 || || GL_DST_COLOR || ì›ë³¸ 색ìƒê³¼ ëŒ€ìƒ ìƒ‰ìƒì„ 곱한다 || || GL_ONE_MINUS_DST_COLOR || ì›ë³¸ 색ìƒê³¼ ((1,1,1,1)-ëŒ€ìƒ ìƒ‰ìƒ)ì„ ê³±í•œë‹¤ || || GL_SRC_ALPHA || ì›ë³¸ 색ìƒì— ì›ë³¸ 알파 ê°’ì„ ê³±í•œë‹¤ || || GL_ONE_MINUS_SRC_ALPHA || ì›ë³¸ 색ìƒì— (1-ì›ë³¸ 알파값)ì„ ê³±í•œë‹¤ || || GL_DST_ALPHA || ì›ë³¸ 색ìƒì— ëŒ€ìƒ ì•ŒíŒŒ ê°’ì„ ê³±í•œë‹¤ || || GL_ONE_MINUS_DST_ALPHA || ì›ë³¸ 색ìƒì— ((1,1,1,1)-ëŒ€ìƒ ìƒ‰ìƒ ì•ŒíŒŒê°’)ì„ ê³±í•œë‹¤ || || GL_SRC_ALPHA_SATURATE || ì›ë³¸ 색ìƒì— ì›ë³¸ì•ŒíŒŒ ê°’ê³¼ (1-ëŒ€ìƒ ì•ŒíŒŒê°’)중 ìž‘ì€ ê²ƒì„ ê³±í•œë‹¤ || * ëŒ€ìƒ í”½ì…€ì— ëŒ€í•œ 계산 ë°©ì‹ || ë°©ì‹ || 설명 || || GL_ZERO || ëŒ€ìƒ ìƒ‰ìƒì„ 0,0,0,0 으로한다 || || GL_ONE || ëŒ€ìƒ ìƒ‰ìƒì„ 그대로 사용한다 || || GL_SRC_COLOR || ëŒ€ìƒ ìƒ‰ìƒê³¼ ì›ë³¸ 색ìƒì„ 곱한다 || || GL_ONE_MINUS_SRC_COLOR || ëŒ€ìƒ ìƒ‰ìƒê³¼ ((1,1,1,1)-ì›ë³¸ 색ìƒ)ì„ ê³±í•œë‹¤ || || GL_SRC_ALPHA || ëŒ€ìƒ ìƒ‰ìƒì— ì›ë³¸ 알파 ê°’ì„ ê³±í•œë‹¤ || || GL_ONE_MINUS_SRC_ALPHA || ëŒ€ìƒ ìƒ‰ìƒì— (1-ì›ë³¸ 알파값)ì„ ê³±í•œë‹¤ || || GL_DST_ALPHA || ëŒ€ìƒ ìƒ‰ìƒì— ëŒ€ìƒ ì•ŒíŒŒ ê°’ì„ ê³±í•œë‹¤ || || GL_ONE_MINUS_DST_ALPHA || ëŒ€ìƒ ìƒ‰ìƒì— ((1,1,1,1)-ëŒ€ìƒ ìƒ‰ìƒ ì•ŒíŒŒê°’)ì„ ê³±í•œë‹¤ || || GL_SRC_ALPHA_SATURATE || ëŒ€ìƒ ìƒ‰ìƒì— ì›ë³¸ì•ŒíŒŒ ê°’ê³¼ (1-ëŒ€ìƒ ì•ŒíŒŒê°’)중 ìž‘ì€ ê²ƒì„ ê³±í•œë‹¤ || = TextureMapping = * í…ìŠ¤ì³ ë§µí•‘í•˜ëŠ” ê³¼ì • {{{~cpp Define the LoadBMPfile(char *filename) function declare GLuint tex[n] declare AUX_RGBImageRec *texRec[n] assign LoadBMPFile("filename.bmp") to each texRec[i] glGenTextures(count,&tex[0]) glBindTexture(GL_TEXTURE_2D,tex[i]) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D,0,3,texRec[i]->sizeX ,texRec[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,texRec[i]->data); if(texRec[i]) if(texRec[i]->data) free(texRec[i]->data); free(texRec[i]); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); Example of using the texturemapping glBindTexture(GL_TEXTURE_2D, tex[0]); DrawQuad(1,1,1,normal); }}} ------ = Thread = * 그리스 ë¬¸ìž ì“°ëŠ”ë²• ã…Ž ëˆ„ë¥´ê³ í•œìží‚¤ * ì›ë¬¸ìž ã…‡ ëˆ„ë¥´ê³ í•œìží‚¤ * ã…Š ëˆ„ë¥´ê³ í•œìží‚¤ 치면 분수 쓸수 있다. * ㄹ ëˆ„ë¥´ê³ í•œìží‚¤ 치면 ë‹¨ìœ„ë„ ë‚˜ì˜¨ë‹¤. ["3DGraphicsFoundation"]