<보안 study>/리버싱

[게임핵개발연습#4] 게임에선 좌표계산이 어떻게 될까? - 2. screen상의 오브젝트 위치 표시하기

gosoeungduk 2022. 1. 4. 22:02
반응형

#게임핵 #AssaultCube #ESP #OpenGL


지난 게시글에서 나의 시점을 표시하는데에 관여하는 MVP Matrix 값을 메모리 상에서 View Matrix 의 변화를 통해 찾아보았다.

이번 시간에는 우리가 구한 MVP Matrix 값과 다른 Player 의 좌표 값을 이용하여 상대가 정확히 어디에 있는지 벽너머에서도 보이게 표시해보도록 하겠다.

그전에 OpenGL 에서 오브젝트가 우리가 보는 평면 2D screen 상에 어떻게 그려지는지에 대한 과정을 알아보도록 하자.

위 사진은 OpenGL 렌더링 파이프라인 에서 정적인 3D 좌표가 2D 스크린을 통해 우리 눈으로 들어오기까지 과정을 여러 행렬과 함께 간략히 나타낸 것이다.

OpenGL API 상에서는 각 Coordinates 에 대해 변환을 진행하려면 glRotatef(), glTranslatef(), glScalef() 함수를 사용하면 된다고 한다.

일단은 각 좌표 기준으로 설명을 진행해본다.

1. Eye Coordinates

Eye Coordinates 라는 것은 Object 의 3D 상 좌표View MatrixModel Matrix 를 곱한 것으로 공간개념(?) 적으로는 Object Space 에서 World Space 로 변환하는데 이용되는게 Model Matrix 이고, World Space 에서 Eye Space 로 변환하는데 이용되는게 View Matrix 라고 한다.

결론적으로는 아직 실질적인 2D 좌표와는 거리가 멀다.

2. Clip Coordinates

현재 Eye Coordinates 는 Clip Coordinates 를 구하기 위한 재료이다.

Projection Matrix 같은 경우는 한국말로 투영행렬 이라 해서 위와 같은 절두체 좌표를 정의한다.

이 Projection Matrix 에서 정의된 절두체를 통해 우리는 Screen 에 3D Object 가 어떻게 투영되고 화면에 얼마만큼 필요한 부분만 clip 시켜서 실제처럼 보여줄 것이냐를 정의한다. 그리고 그것을 Clip Coordinates 라고 부른다.

이 때, w 값은 나머지 (x, y, z) 가 얼마만큼 clip 될지를 정하는 값으로 동차좌표계 라고도 한다. (우리가 기벡에서 배운 정사영? 사영? 개념이 어느정도 들어간거라고 보면 되나..?)

3. Normalized Device Coordinates(NDC)

이것도 사실 컴퓨터 그래픽스 내용이다.(다음학기에 컴퓨터 그래픽스를 들어야하나.. ㅜ)

perspective division 이라고 해서, 각 x,y,z,w 값을 w 로 나눔으로써 동차좌표 이전 상태인 일반좌표 상태로 바꾸는 것을 의미하고 바뀐 일반좌표는 Normalized Device Coordinates 라고 부른다.

이 때, 일반좌표에서 w 값은 없는 것이나 마찬가지기에 1 이 되는 것은 진리이다. 결론적으로 의미있는 것은 (x/w, y/w, z/w) 뿐임.

4. Window Coordinates (Screen Coordinates)

위 사진에서 w 는 내가 띄운 게임화면의 width, h 는 height 이다. 보통 1920 x 720 으로 하기도 하고 다양한 그런 환경에서 NDC Coordinates 를 screen 에 맞게 조정하는 공식이다.

여기까지 완료했으면 진짜 우리가 적을 식별할 수 있는 (x, y, z) 를 구할 수 있는 것이다.


간단하게 적의 위치를 표현해보았다.

보는 것과 같은 Windows GDI 의 깜빡임 현상(flicking) 은 어쩔 수 없는 문제긴한데 추후 D3D9 로 구현하면 이 부분은 해결? 된다고 한다.

다음은 player 에 대한 체력, 총알 정보 및 z 축 거리에 따른 위치 표시 박스 사이즈 조정도 진행해보려고 한다. 이상.

출처

OpenGL 렌더링 파이프라인
OpenGL Transforming

반응형