본문 바로가기

Graphics Note

opengl의 스크린공간은 왼손좌표계이다.

스크린좌표라 하면 으레 윈도우즈 시스템의 좌표형태(우측이 +x, 아래측이 +y)라고 생각한다.

 

opengl에서 NDC -> screen space로 변환할 때, 당연히 y-negation을 해서 오른손 좌표계가 되는 줄 알았다. 어차피 뷰포트 변환이야 레스터라이저가 알아서 하고, glViewport만 호출하고 끝내니 지금까지 이처럼 알고 잘 쓰고있었는데,, 고맙게도 어느분께서 이 부분에 대해 이상한 현상이 발생한다고 질문해주신 덕분에 정확히 알게되었다.

 

OpenGL의 스크린공간은 y-up 왼손좌표계이다.

 

+y

│      +z

│    /

│  /

│/

└─────>+x

 

opengl의 텍스쳐좌표계와 통일성을 주려 한것일까.. 아무튼 이러하다.

 

때문에 프래그먼트셰이더상에서 뷰포트 역변환을 해야한다면

[math!]\begin{aligned} x_{ndc} &= \frac{2}{vp.width}( x_{scr} - vp.x) - 1\\  y_{ndc} &= \frac{2}{vp.height}(y_{scr} - vp.y) - 1 \\ z_{ndc} &= \frac{2}{(vp.zfar - vp.znear)}(z_{scr} - vp.znear) - 1\end{aligned}[/math!]

가 된다. 그런데 마우스 이벤트를 통해 들어오는 스크린좌표는 윈도우즈 스크린좌표계를 따라 아래방향이 +y축이라 오브젝트 피킹 등 어플리케이션 상에서 수행하는 뷰포트역변환은 오른손좌표계의 스크린공간이라 생각하고 계산해야한다.

'Graphics Note' 카테고리의 다른 글

implementing GJK in 3D  (0) 2014.05.24
enabled, but unused vertex attribute array  (0) 2014.05.11
converting rotation quaternion into matrix, and vice versa  (0) 2014.04.21
rigid body collision 2  (0) 2014.04.21
rigid body collision 1  (0) 2014.04.21