2024. 4. 19. 20:02ㆍ공부
오늘은 줄기차게 다뤄왔던 기하학, 행렬에서 잠깐 벗어나, 그래픽스에서 물체를 바라보는 시점, Viewing에 대해서 알아보고자 한다.

Perspective Projection은 Projection 의 중앙점 COP가 존재하고, Parallel Projection은 Projector가 서로 평행하여, 뻗어나가 COP는 무한에 수렴한다. 그렇기에 Parallel view 에서는 COP(Center of Prjection)이 아닌, 방향으로 투영한다 하여DOP(Direction of Projection)이라고 칭한다.
이렇게 시점을 다양항게 적용하며, 확인할때는 3가지의 기존 요소가 필요하다.
1.하나혹은 여러개의 Object
무언가 볼수있는 물체가 있어야하므로.
2.투영 평면이 있는 Viewer
물체가 존재하면 이를 확인할수있는 Viewer와 화면에 표시해줄 Projection plane(투영 평면)이 있어야한다.
3.Object에서 Projection plane으로 이동하는 선들(Projectors)
물체를 3d 공간에서 2d평면 공간으로 투영하기위해서는 이를 가져오는 선이 필요하다.
이렇게 3개의 기본적인 요소들을 보유한 projection들은 여러가지 분류로 나뉘게 되는데 해당 분류는 아래와 같다.

우선 Parallel Projection 에 대해서 알아보겠다. Parallel Projection, 평행 투영에는 Orthographic(직교) Axonometric, Oblique 3가지가 존재하는데, 3가지는 모두 다른 특성을 지니고 있다.
Orthographic Projection(직교 투영)
직교 투영은 Object에서 Projector가 평행하게 뻗어서 보이는 면을 입체적이 아닌, 단면처럼 투영한다.
주로 정면, 측면, 위에서 내려보는 시점(Top)에 일반적으로 사용한다.
직교투영의 장점은 거리와 각도를 모두 유지한채로 투영하기때문에 물체의 크기와 모습에 왜곡이 없어 무언가를 측정할때나, 건물의 청사진같이 설계가 필요한 영역에 사용할수있다.
하지만, 단면만 보여주어, 입체의 뒷면이나 대각선 모습등을 확인할수없기 때문에, 물체가 정확이 어떻게 생겼는지 볼수없다. 그래서 우리는 직교투영에 Isometric Projection을 추가한다.
Axonometric Prjections(엑소노 메트릭)
앞서 말했듯 직교 투영에서는 물체의 정확한 모습을 확인할수없는 것이 문제였다.
이러한 문제점을 해결하고자 고안된 투영법이 바로 엑소노 메트릭 투영법이다. 물체를 기울이거나, 비스듬하게 투영평면에 투영하여, 임의의 방향에 대해서 오브젝트를 투영할수있게 한다. 하지만, 투영평면에 대해 선(Projector)들은 여전히 직교를 유지하고 있다.
엑소노 메트릭 투영법은 또하나의 특징이 존재하는 바로 평행선은 보존하지만, 각도는 보존하지 않는다는것이다.
만약 투영물체의 내부각이 모두 같은경우 Isometric, 내부각이 2개만 같고 하나가 다른경우 Diemetric, 모두 다른경우 Trimetric 이라고 표현한다.
엑소노 메트릭 투영법에는 직교성을 유지하며, 물체를 움직이지 않고 투영 평면을 비스듬하게 조절하여, 투영하는 방법또한 존재하는데 이를 Oblique Projection 이라고 한다. 이는 Isometric과 굉장히 유사한 형태를 띄고있어 구분이 어려울수도있다. 그럴때 확인할수있는것은 바로, 물체의 투영모습 차이다. Isometric, Diemetric등의 경우 투영 물체각이 직각을 띄고있다. Oblique는 비스듬하게 위치하고 있어, 직교성을 유지하고 있다고 보기 어렵다.
이렇듯 Parallel Projector들을 알아보았다. 다음은 Perspective Projection(원근 투영)에대해서 알아보겠다.
Perspective Projection(원근 투영법)
원근 투영에서는 평행 투영처럼 여러가지 분류가 나누어져있는것은 아니지만, Vanishing point(소실점)개수의 차이에 따라
One - two - three point Perspective 로 구분된다.
** Vanishing point(소실점) : 객체의 평행선(투영면과 평행하지는 않다)이 한점에 수렴하여 소실하는 점.

원근 투영법에서는 평행투영법에처럼 Object가 얼마나 떨어져있어도 같은 크기로 투영되는것이 아닌, 멀리있는 Object는 동일한 크기의 Object 보다 작게 투영된다.
또한 멀리있는것은 작게 가가이있는것이 크게 투영되기 때문에, 사람의 눈과 동일한 시스템을 구성하고있어 보다 현실적이다.
이는 평행투영보다 구현하기 어렵지만, 컴퓨터에게는 그렇게 어려운일은아니다.(컴퓨터에서는 행렬로 계산하므로 난이도 차이가 거의 나지않는다)
위와 같은 Viewing Process에서 3가지 과정들(viewer위치 지정, projection설정, viewVolume설정)을 컴퓨터에서 구현할때는 모두 파이프라인에서 구현된다.
1. Positioning the camera (카메라 위치선정)
model-view matrix 설정
2. Selecting a lens (Projection투영 시점 결정)
projection matrix 설정
3. Clipping
view volume 설정
The WebGL Camera
그래픽스 기술을 사용하는 WebGL을 예시로 들었을때, ]
WebGL에서는 최초에는 Object와 카메라 프레임이 동일하며, model-view matrix는 항등 행렬의 형태를 취하고있다.
또한 WebGL에서는 오른손 좌표계 시스템을 채택하고있기 때문에, 카메라는 -z방향을 바라보게된다.
WebGL은 view volume또한 기본적으로 정의되어이있는데, 이는 원점을 중심으로 하는 길이가 2인 정육면체 크기이며,
시점을 결정하는 projection matrix또한 항등행렬이다.
**projection matrix가 기본값(항등행렬)인경우 projection은 Orthographic Projection(직교 투영)을 하게된다.
위에서 WebGL에서는 최초값은 Object와 카메라 프레임이 동일하게 되어있다고 하였다. 둘의 위치가 동일한 경우 카메라에 Object가 투영되지 않아 보이지 않는 문제가 발생한다. 이를 방지하기 위해서 물체를 원점에서 이동시키거나, 카메라를 원점에서 이동시켜, 물체를 투영할수있게 처리해야 한다.
Object를 움직이는 방법과 카메라를 움직이는 방법은 조금 다르다. 카메라 프레임을 이동할때는 카메라가 z방향을 바라보고있어(positive z-direction), z의 값을 양수로 적용해야 한다.(프레임을 앞으로 이동할때는 +z 뒤로갈때는 -z를 적용해야한다)
반대로 월드 프레임을 기준으로 움직이는 경우 negative z-direction을 기준으로 하고있기때문에, z의 값이 양수인경우 뒤로 이동하고 z값이 음수인경우 앞으로 이도하는 효과가 발생한다.
또한 아래의 Rotation과 translation을 통해 원하는 위치로 카메라를 이동할수있다.
ex)같은 물체를 양의 x축에서 바라볼때
- 카메라를 회전시킨다
- 원점에서 이동시킨다.
- Model - view Matrix에 C = TR (T : Translation, R : Rotation)을 곱한다.
mat4 t = Translate (0.0, 0.0, -d);
mat4 ry = RotateY(90.0);
mat4 m = t * ry;
** ex) 에대한 WebGL코드
'공부' 카테고리의 다른 글
| [파이썬]내가보려고 정리하는 파이썬 : Pandas (0) | 2024.04.21 |
|---|---|
| [파이썬] 내가보려고 정리하는 파이썬 : Numpy (0) | 2024.04.20 |
| [그래픽스]GeoMetry(지오메트리) (0) | 2024.04.17 |
| [그래픽스]02-1. 그래픽 처리과정2 (0) | 2024.04.14 |
| [그래픽스]02. 그래픽스 처리과정 (0) | 2024.04.14 |