본문 바로가기

엔진프로그래밍

백페이스 컬링과 원근 투영

벡터 외적의 활용

시작하기에 앞서 저번 게시글에서 했던 forward벡터와 up벡터가 주어질 때 물체가 왼쪽에 있는지 오른쪽에 있는지 판별하는 방법을 알아보겠습니다.

다음과 같이 플레이어의 정면방향 왼쪽, 오른쪽에 각각 타겟이 있다고 가정할 때, 수식으로 Target의 위치를 판별하려면 먼저 forward벡터와 target벡터를 외적합니다.

A벡터는 forward벡터와 왼쪽 target벡터를 외적한 값이고 B는 아래쪽 target벡터와 외적한 값입니다. 오른손 법칙에 따라서 저렇게 그려집니다. 이렇게 나온 벡터 A와 B를 각각 Up벡터(0,1,0)와 내적할 때 벡터의 내적한 값이 방향이 같으면 양수 다르면 음수가 나오게 됨으로써 결과값이 양수가 나오면 물체는 왼쪽으로 판별되고 음수가 나오면 오른쪽으로 판별됩니다.

백페이스 컬링

백페이스 컬링이란 카메라를 기준으로 바라보는 물체의 뒷면에 해당하는 삼각형을 렌더링 과정에서 생략하는 기법입니다.

정면에서 삼각형을 바라볼 때, 인덱스 정보는 시계방향으로 배치됩니다. 반대로 후면에 삼각형은 시계 반대방향으로 배치됩니다.

이 연결정보를 벡터로 표현했을 때 위 그림처럼 나옵니다. 위에 두 벡터 A,B를 외적한 결과 벡터의 방향이 카메라 방향을 향하느냐 아니면 그 반대방향을 향하느냐에 따라 정면과 후면을 판별할 수 있습니다.

 

제가 쓰는 프로젝트는 오른손 좌표계를 쓰고있기 때문에 (0,0,-1)과 내적하여 양수가 나온다면 컬링해줍니다.

결과

원근 투영

일반적으로 카메라가 렌더링하는 영역을 평면화해서 보면 위의 그림과 같습니다.

결과 행렬부터 보면 아래 행렬이 나옵니다.

여기서 d는 초점거리, a는 해상도의 (너비/높이), n은 근평면의 z값, f는 원평면의 z값입니다.

어떻게 이런 행렬이 나오는지에 대해 설명해야 하지만 아직 머리속에서 정리되지 않아서 나중에 수정하도록 하겠습니다.

소스 코드

결과 화면

'엔진프로그래밍' 카테고리의 다른 글

투영 보정 매핑  (0) 2020.07.19
오일러 각과 평면의 방정식  (0) 2020.07.15
회전 행렬과 LookAt 행렬  (0) 2020.07.01
UV좌표와 뷰 좌표계  (0) 2020.06.24
Galois Field와 아핀 조합  (0) 2020.06.10