perspective projection은 우리 눈이 실제 세계를 보는 것과 같은 방식으로 canvas에 3D 물체를 그리는 방법이다.
실제 물체의 꼭지점과 우리 눈을 잇는 직선을 그리고 그 사이에 있는 canvas와 만나는 점을 찾는다.
이 점을 이어 wire frame을 얻을 수 있다.
실제 물체와 눈 사이의 거리가 멀어질수록 canvas에 그린 그림은 더 작아진다. 이를 foreshortening이라고 한다.
perspective projection에는 두 가지 중요한 가정이 있다.
첫째, eye는 canvas의 정중앙에 있다.
둘째, canvas의 크기는 변할 수 있다.
canvas의 꼭지점과 eye를 직선으로 이으면 생기는 피라미드를 frustrum이라고 부른다. 물체에 까지 직선을 연장하면 viewing frustrum이라고 부른다. 오직 viewing frustrum 안에 위치한 물체만이 우리 눈으로 볼 수 있다.
canvas의 사이즈를 작게하면 작게할수록 viewing frustrum이 작아지고 볼 수 있는 것이 적어진다.
canvas 사이즈를 무한히 작게하면 frustrum을 만들던 직선이 서로 평행하게 된다. 이를 orthographic projection이라고 한다. frustrum이 canvas와 orthogonal하게 된다. 이런 경우 foreshortening이 없어지고 사물을 본래 크기 그대로 표현한다.
canvas와 꼭지점에서 eye까지 이은 직선이 만나는 점을 구하는 방법을 알아보자.
삼각형 ABC와 A'B'C'는 닮음이다. 따라서
이고 eye부터 canvas거리가 1이라고 하면
같은 방식으로 P'.x 는
이렇게 구하는 방식을 perspective division 또는 z divide라고 한다.
visibility problem을 다루는 방식에는 두 가지가 있다.
하나는 Rasterization이다. 물체를 화면에 projection 하는 방식을 쓰기 때문에 perspective division을 사용한다.
다른 하나는 Ray-tracing이다. canvas 점 P'에서 물체 P까지 ray를 따라가기 때문에 projection은 사용하지 않는다.
Rasterization을 Ray-tracing보다 빠르고 GPU가 rendering 작업할 때 많이 사용해오던 방식이다.(그러나 Ray-tracing이 더 사실과 같은 그래픽을 구현하기 쉬운 방법이다.)
참조 : Rendering an Image of a 3D Scene: an Overview (Perspective Projection) (scratchapixel.com)
Rasterization: a Practical Implementation The projection stage (0) | 2022.03.07 |
---|---|
Rasterization: a Practical Implementation Rasterization Algorithm Overview (0) | 2022.03.07 |
Visibility problem (0) | 2022.03.06 |
Rendering 프로세스 이해하기 (0) | 2022.03.02 |
3D Scene의 구성 요소 (0) | 2022.03.02 |
댓글 영역