3장 변환
이 포스팅의 내용은 DirectX 12를 이용한 3D 게임 프로그래밍 입문 (프랭크 D. 루나 저) 책과 인터넷을 참고하여 간단히 정리하였다.
3차원 그래픽에 쓰이는 주된 기하학적 변환은 이동변환, 회전변환, 비례변환이다. 이번 장에서는 3차원 공간의 점과 벡터를 변환하는 데 사용할 수 있는 행렬 방정식을 살펴본다.
- 선형변환
수학 함수 는 3차원 벡터 하나를 입력받아 3차원 벡터 하나를 출력한다. 만일 함수
에 대해 다음과 같은 성질이 성립하면 를 가리켜 선형변환(linear transformation)이라고 부른다.
여기서 와
는 임의의 3차원 벡터이고
는 스칼라이다.
예)
를 생각해보자 예를들어
이다. 그런데 이 함수는 선형변환이 아니다.
에 대해
이지만
이기 때문이다.
- 행렬 표현
- 비례
이를 비례행렬이라하고,
이를 비례행렬의 역이라 한다.
예)
최솟점 (-4, -4, 0)과 최댓점 (4, 4, 0)으로 정의된 사각형을 z축은 그대로 놔두고, x축으로 0.5단위, y축으로 2단위 비례해보자. 이를 비례행렬로 표현하면 다음과 같다.
이제 사각형을 실제로 비례(변환)하려면, 최솟점과 최댓점에 이 행렬을 곱하면 된다.
- 회전
여기서
이다.
회전행렬에는 흥미로운 성질이 있는데, 행렬의 각 행벡터는 단위 길이이고, 행벡터들은 서로 직교이다. 따라서 행벡터들은 정규직교이다.
직교행렬에는 그 역행렬이 자신의 전치행렬과 같다는 성질이 있다. 즉, 회전행렬의 역은 다음과 같다.
특히 회전축이 x축이나, y축, z축이면(즉, n = (1, 0, 0)이나 n = (0, 1, 0), n = (0, 0, 1)이면) 회전행렬이 간단해진다.
다음은 각각 x, y, z축에 대한 회전행렬이다.
예)
최솟점(-1, 0, -1)과 최댓점(1, 0, 1)로 정의된 사각형을 y축에 대해 시계방향으로 -30º(반시계방향으로 30º) 회전한다고 하자. 이 경우 n=(0, 1, 0) 이므로 해당 y축 회전행렬을 쉽게 구할 수 있다.(위에 행렬을 그대로 대입)
이제 실제로 사각형을 회전하려면, 최솟점과 최대점에 이 행렬을 곱하면 된다.
- 아핀변환
- 동차좌표
1. 벡터를 나타내는 동차좌표는
2. 점을 나타내는 동차좌표는
이렇게 표기한다.
벡터는 위치와 무관하게 오직 방향과 크기만 서술하는 것이므로, 벡터에 대해서는 이동이 의미가 없다.(벡터의 성분이 바뀌면 벡터의 본질적인 속성인 방향과 크기가 변하므로, 벡터에 이동변환을 적용했을 때 벡터의 성분들이 바뀌어서는 안 된다)
따라서 점에만 이동변환이 제대로 수행될 수 있게끔 위와같은 동차좌표를 이용해야한다.
- 아핀변환의 행렬 표현
b는 본질적으로 하나의 이동(위치 변경)을 나타낸다.
다시 한번 강조하지만 벡터는 위치가 없으므로 벡터에 대해서는 이동을 적용하지 말아야한다. 하지만 아핀변환의 선형변환 부분은 벡터에 적용해야하므로, 벡터의 동차좌표의 넷째 성분을 0으로, 즉 w = 0으로 설정하면 b에 대한 이동은 적용되지 않는다.
- 이동
예)
최솟점 (-8, 2, 0)과 최댓점 (-2, 8, 0)으로 정의되는 사각형을 x축을 따라 12단위, y축을 따라 -10.0단위를 이동한다고 하자. z축 위치는 그대로 둔다. 이러한 이동에 해당하는 이동행렬은 다음과 같다.
이제 이 행렬을 최솟점과 최댓점에 곱하면 사각형이 실제로 이동(변환)한다.
(점 이므로 4번째 원소(w)가 1임을 명심하자)
- 비례와 회전을 위한 아핀변환 행렬
이런 방식을 이용하면 배운 모든 종류의 변환을 일관되게 4 x 4 행렬로 나타낼 수 있으며, 점과 벡터를 1 x 4 동차 행벡터로 나타낼 수 있다.
- 변환들의 합성
하지만 행렬 곱셈은 결합법칙을 만족하므로, 이를 다음과 같이 표기해도 된다.
이러한 합성은 성능에 영향을 미친다. 첫 번째 방법처럼 세 가지 기하 변환을 연달아 적용한다고 가정하면, 벡터 대 행렬 곱셈이 20,000 x 3회 필요하다.
하지만 두 번째 방법처럼 합성시키면 벡터 대 행렬 곱셈 20,000회에 행렬 대 행렬 곱셈 2회면 된다.
- 좌표 변경 변환
'DirectX 12 > 기초 수학' 카테고리의 다른 글
2장 행렬 대수 (0) | 2019.03.13 |
---|---|
1장 벡터 대수 (0) | 2019.03.13 |