[OpenGL] 좌표계

haeryong·2023년 5월 30일
0

좌표계

  • Object들은 Local space 기준으로 기술.
  • Local space -> World space -> View space -> Canonical space로 변환.
  • OpenGL의 그림은 [-1, 1] 사이로 normalized된 Canonical space에 그려진다.
  • 3개의 transform을 각각 Model matrix, View matrix, Projection matrix라 함. 합쳐서 MVP matrix라고 부름.
  • Vclip=MprojectionMviewMmodelVlocalV_{clip}=M_{projection}M_{view}M_{model}V_{local}
  • Canonical space에서 -1, 1 범위 밖으로 벗어난 면들을 cliping을 거침.

  • Orthogonal Projection

    • 평행한 선이 계속 평행하도록 투영.
    • left, right, bottom, top, near, far를 통해 행렬이 결정됨.
    • 변환 후에는 RHS에서 LHS로 변경됨.
    • (2rl00r+lrl02tb0t+btb002fnf+nfn0001)\begin{pmatrix}\frac{2}{r-l}&0&0&-\frac{r+l}{r-l}\\0&\frac{2}{t-b}&0&-\frac{t+b}{t-b}\\0&0&\frac{-2}{f-n}&-\frac{f+n}{f-n}\\0&0&0&1\end{pmatrix}

      이미지 출처
  • Perspective Projection

    • 평행한 선이 한 점(소실점)에서 만나도록 변환.
    • 멀리 있는 물체일수록 작게보이는 원근감이 발생.
    • aspect ratio, fov, near, far를 통해 결정됨.
    • (1aspecttan(fov/2)00001tan(fov/2)0000f+nfn2fnfn0010)\begin{pmatrix}\frac{1}{aspect*tan(fov/2)}&0&0&0\\0&\frac{1}{tan(fov/2)}&0&0\\0&0&-\frac{f+n}{f-n}&-\frac{2*f*n}{f-n}\\0&0&-1&0\end{pmatrix}
  • Depth Buffer

    • 각 픽셀의 컬러값 이외에 depth 값을 저장.
    • depth test를 통해 해당 픽셀을 그릴 지 선택.(뒤에있는 물체는 그릴 필요 없기 때문.)
  • Depth Test

    • OpenGL의 Depth Buffer 초기값 = 1
    • 가장 뒤 = 1 / 가장 앞 = 0 (LHS)
    • glEnable(GL_DEPTH_TEST);

카메라

  • 파라미터
    • camera position(ee) : 카메라 위치
    • camera target(tt) : 카메라가 바라보는 중심 위치
    • camera up vector(uu) : 카메라 화면의 세로 축 방향

z=etetz=\frac{e-t}{||e-t||} , 카메라에서 target을 바라보는 크기가 1인 벡터
x=u×zu×zx=\frac{u\times z}{||u\times z||}, u와 z에 모두 수직인 크기가 1인 벡터
y=z×xy=z\times x
p=ep=e

결과 행렬 : 카메라의 world -> local transform matrix

  • (xTxTpyTyTpzTzTp01)\begin{pmatrix} x^T&-x^Tp\\y^T&-y^Tp\\z^T&-z^Tp\\0&1 \end{pmatrix}

0개의 댓글