🎮Unreal4/Basic

[UE4] 좌표 공간 변환(Picking), 렌더링 파이프라인, vector4 w 값에 따른 방향벡터/위치벡터, 동차 좌표계

공대 컴린이 2023. 2. 4. 02:55
728x90

📚 좌표 공간 변환 (3D->2D / 2D->3D)

(파란색 두개의 원이 마우스 포인터의 커서 출력 이미지이다)

마법사가 마우스 포인터가 가르키는 방향으로 워프(Warp)하고 싶을 때 어디로 순간이동 할지 지점을 결정해주어야 한다. 이때 마우스로 지점을 결정하는데 마우스 좌표는 2D 좌표계인 반면, 월드 공간은 3D 좌표계이기 때문에 2D 좌표값에서 3D 좌표값으로 변환하는 작업이 필요하다.

🚩 렌더링 파이프라인

IA -> VS -> RS -> PS -> OM
  • IA (Input Assembly) : 렌더링 할 데이터를 집어넣는 과정
  • VS (Vertex Shader) : 정점을 계산하는 쉐이더
  • RS (Rasterizer) : 3D 공간을 2D로 변환하는 것 (NDC 공간 변화)
  • PS (Pixel Shader) : 변화된 공간을 Pixel 쉐이더로 처리하는 것
  • OM : (추후 그림자를 구현할때 자세히 다루기위해 지금은 생략)

 

정점 세개로 구성된 삼각형IA에서 VS로 전송되면, VS에서 World, View, Projection 연산을 한다. 

이후 RS에서 뷰포트 연산을 수행하고 2D 공간으로 나온다. 2D 공간에 있는 선들이 보간되면서 PS 단계에서 픽셀로 채워지며 렌더링 결과가 나오게 된다.

이 모든 렌더링 파이프라인은 GPU에서 수행해주는 과정이다.

 

3D 좌표를 2D 좌표로 바꾸는 방법은 어렵지 않다. 렌더링 파이프라인이 이미 그 과정을 다루고 있기 때문이다. 그러나 2D좌표를 3D 좌표로 바꾸는 방법은 따로 존재하지 않지만, 렌더링 파이프라인의 과정을 반대로 계산하면 2D 좌표값이 3D 좌표값으로 도출된다.

 

뷰포트 좌표를 투영좌표로 변환하려면 시야에 가까운 위치(near)에서 멀리 있는 위치(far)까지 선을 쭉 긋고, 해당 선에 겹쳐지는 물체들을 체크한다. 이때 체크되는 물체가 존재한다면 해당 물체를 선택했다고 간주한다.

 

따라서 2D 좌표상의 마우스 좌표가 선택했다고 간주되는 3D 공간의 물체에 좌표를 출력함으로써 좌표 변환이 완성된다.

이렇게 2D 좌표에서 3D 좌표로 바꾸는 Unprojection 과정Picking 이라고 한다.

 

Picking 알고리즘
1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다.
2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를 통과하는 반직선을 구한다.
3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다
4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택

2D->3D
Viewport->NDC->View->World->Local

🚩 벡터 w 값에 따른 방향벡터/위치벡터

World는 4x4 행렬은 각 요소를 x, y, z, w로 표현할 수 있는데, 여기서 w의 성분은 동차좌표라고 볼 수 있다.

이때 누군가는 벡터의 x, y, z, w 중 w가 무조건 동차(동일한 차이,비율)이라고 하지만, w가 동차가 되는 경우는 x, y, z의 픽셀 비율이 모두 같은 경우 뿐이다.

 

동차좌표

동차좌표차원의 좌표를 1차원 증가시켜 표현하는 방법을 의미한다. 즉, x,y,z로만 구성된 좌표에 w를 추가하여 차원을 증가시킨 것이다. 이러한 동차좌표는 시점으로 보이는 점들의 위치보다 시점으로부터의 방향을 알아내기 위해 사용한다.

 

3D 에서의 동차좌표행렬간의 이동, 변환 등의 과정을 '곱셈'으로 표현할 수 있고, 벡터와 포인터를 구분하기 위해 사용되기도 한다.

 

이동, 크기, 회전을 표현하는 World(Matrix)의 4x4 행렬을 행렬곱 하려면 대상 행렬도 4x4여야 하므로 DirectX의 Shader에서도 vector3가 아닌 vector4를 사용한다. (D3D는 기본적인 4x4 Matrix이다)

만약 Shader에서 vector3을 사용한다면 내부에서는 vector4로 바꾸어 연산하는 것이다.

그러나 vector3가 vector4보다 편하기 때문에 실질적으로 vector4를 사용하진 않는다.

vector4를 사용하지 않아도 흔히 사용되는 D3D 함수 중 행렬과 벡터의 곱셈을 구현하는 Transformation 함수를 보면 Normal(w=0)과 Coord(w=1)로 구분하여 사용하는것을 볼 수 있다. 즉, vector3를 받아와서 4x4 행렬을 곱하되 마지막 성분 w를 함수가 임의로 넣어서 계산해주는 것이다.

 

만약 w = 0이라면, 3x3 행렬 연산이 되기 때문에 회전만 연산되어 회전 공간이 변환되고, w = 1이면 위치까지 포함되어 위치 공간 변환이 된다. 

 

즉, 이러한 결과들을 w 값이 0이면 해당 벡터는 방향벡터가 되고, w 값이 1이면 해당 벡터는 위치벡터가 된다고 볼 수있다.


참조

https://rito15.github.io/posts/rendering-pipeline/

 

렌더링 파이프라인 간단 정리

렌더링 파이프라인 구조 요약(DirectX 9 기준)

rito15.github.io

https://devhuey.tistory.com/3

 

DirectX - 마우스 픽킹 (Picking) : 3D게임 제작

목적 - 3D 공간의 물체를 2D 화면의 입력장치인 마우스로 선택한다. 개념 화면에서 3D공간으로 레이저를 쏴서 가장 먼저 맞는 오브젝트가 내가 고르고자 하는 오브젝트이다. 방법론 - 3D공간을 구

devhuey.tistory.com

https://m.blog.naver.com/jsjhahi/201983938

 

DirectX Mouse Picking ( Ray 방식 )

픽킹이란? - 스크린 좌표를 이용해 3D상의 물체를 선택하는 것을 말한다. - 스크린 좌표에서 월드좌표로 ...

blog.naver.com

https://www.slideshare.net/QooJuice/picking-129456487

 

Picking

Picking 쿠재아이 김재경 Picking? In computer graphics, the task of determining which screen-rendered object a user has clicked on - wikipedia 주제 선정 이유 • 예전 스터디에서 Pi...

www.slideshare.net

https://gpgstudy.com/forum/viewtopic.php?t=25011 

 

Vector 혹은 Matrix에서 4번째 요소가 의미하는것 - GpgStudy 포럼

수학, 물리학 등 게임 프로그래밍의 기반이 되는 이론에 관한 포럼입니다. 운영자: 류광 비회원 전체글 글쓴이: 비회원 » 2009-11-15 23:25 아 찾다찾다 못찾아서 질문 드립니다. Vector3는 x, y, z 로 3D

gpgstudy.com

 

728x90