#keywords 3차원,3D,rendering,렌더링,거리,원근감,레이캐스팅,반사,골격,와이어,회전,삼각함수,sin,cos,tan,atan,distance,rotate,x,y,z,축 #title 3차원 그래픽 [wiki:Home 대문] / [wiki:CategoryProgramming 프로그래밍] / [wiki:3DGraphics 3차원 그래픽] ---- == [wiki:3DGraphics 3차원 그래픽] == * 작성자 조재혁([mailto:minzkn@minzkn.com]) * 고친과정 2008년 5월 2일 : 처음씀 [[TableOfContents]] === 3차원 좌표를 2차원으로 변환하는 기본공식 === {{{#!plain 1. x' = distance * x / z; 2. y' = distance * y / z; 3. distance 의 적정 원근값은 경험치에 의해서 결정하는것이 좋으며 보통 z에서 (distance * 2)를 빼면 화면의 중앙에 적당한 위치를 가지게 될겁니다. }}} === 회전에 필요한 기본공식 === {{{#!plain θ = 회전각 1. z축 회전공식 (Front) * x' = (x * sinθ) - (y * cosθ) * y' = -((x * cosθ) + (y * sinθ)) 2. x축 회전공식 (Side) * y' = (y * sinθ) - (z * cosθ) * z' = -((y * cosθ) + (z * sinθ)) 3. y축 회전공식 (Top) * z' = (z * sinθ) - (x * cosθ) * x' = -((z * cosθ) + (x * sinθ)) }}} === Scale 에 필요한 기본공식 === {{{#!plain 1. x' = x * scalex; 2. y' = y * scaley; 3. z' = z * scalez; }}} === z buffer 라는 것이 뭘까요? === 3차원 와이어 프레임만을 그리면 된다는 조건이 있다면 진짜 간단하겠지만 게임에서 보면 와이어 프레임이 아닌 실사에 가까운 빛의 반사등을 보실수 있을겁니다. 헌데 와이어 프레임에서는 전면에 가려진 후면도 그려진다는 것을 알수 있습니다. 여기서 그 후면을 그리지 않기 위해서 z buffer 라는 용어가 생겼습니다. z buffer 라는 것이 복잡한 것은 아니고 단지 각 와이어를 그릴때 z축에 대한 버퍼를 마련한것으로 가장 사용자 시점에 가까운것 (가시거리에서 가장 근접한 상태)이 z buffer에 기록됩니다. 그렇게 기록된 z buffer 를 가지고 그림을 그리면 전면에 가려진 후면은 그려지지 않게 되는 겁니다. === 예제소스 다운로드 === * [attachment:mz3d.tar.gz] : Linux frame buffer 상에서 동작하는 예제 * [attachment:mz3dx_simple.tar.gz] : X-Windows 상에서 동작하는 예제 === 마지막으로 === * 수학적인 이론만으로 정리하였는데 실제 구현상 성능의 이유로 많은 부분이 이론공식을 우회하여 최적화하여 구현하는것으로 알고 있습니다. 실제 그러한 부분이 어떤것이 있는지 정리되는것이 훨씬 많은 도움이 될거라 사료됩니다. 예를 들어서 회전공식을 행렬연산으로 대체하는 방법이라든지.. 레이캐스팅기법에 대한 설명이라든지... 그런거 말이죠... * 아래 화면은 구현예제 source를 이용하여 PDA로 porting 한 화면입니다. [attachment:mz3d_pda_porting.jpg] === 참고자료 === * [wiki:TrigonometricalFunction 삼각함수의 정리]