물체에 대한 수학
벡터 공간 : 어떤 대상의 성질을 표현하는데 사용되는 데이터
벡터 공간에 n차원 물체를 표현하기 위해서는 2차원 물체를 표현하기 위한 벡터
와 물체의 변화량 벡터
두가지가 필요하다.
예를 들어서 만약 3차원 물체의 이동을 표현 한다면 4차원의 공간을 활용하게된다.
이번 프레임의 물체의 형태(x,y,0)와 다음 프레임의 물체의 변화량(dx, dy ,1)와 같은 형태로
마지막 차원에 두 벡터값을 구분하기 위한 값을 넣는다 (일반적으로는 0과 1로 구분 한다.)
예를 들어서 만약 3차원 물체의 이동을 표현 한다면 4차원의 공간을 활용하게된다.
즉, 벡터 공간을 목적에 따라 분리해서 관리
하기 위해서 한 차원을 더 활용하게 된다.
- 물체의
현재 형태
를 저장할 공간 -아핀 공간
- 물체의
변화량
을 저장할 공간 -이동 벡터
게임공간에 물체를 배치할때 일어나는 일 - 월드 공간과 로컬 공간
모든 게임의 요소를 담을 게임 공간 즉, 게임의 중심이 되는 월드 공간
자체는 움직일 일이 없이 고정
되있기 때문에
벡터 공간은 기본값
으로 유지된다.
그리고 배치하는 물체의 공간을 로컬 공간
이라고 하고, 물체는 n차원의 좌표값을 가진
수 많은 점들로 표현되고 각각의 점들은 벡터 공간을 가진다.
{(x,y,z,0) , (dx,dy,dz,1)}
로컬 공간안에 물체의 형태가 표현되지만
월드 공간의 입장에서 보면 로컬 공간 자체가 하나의 물체이다.
그래서 물체를 게임의 월드 공간에 배치하는 것은로컬 공간을 월드 공간에 배치
하는 것이다.
월드 공간 에서는 트랜스 폼을 통해서 배치된 물체를 로컬 공간 채로 움직일수 있고,
로컬 공간 내부에서는 이동 벡터를 통해 로컬 공간 내에서 물체의 위치를 움직일 수 있다.
월드 공간의 입장에서는 이동 벡터를 통한 물체의 이동은 물체의 위치가 변한것이 아니라 물체의 형태가 변화한 것이다.
점
에 대한 수학
벡터 공간 = 아핀 공간 + 벡터
이다.
아핀 공간의 좌표는 하나의 점의 위치
를 말하고, (이동)벡터는 크기와 방향을 가지며 점을 프레임마다 이동시키게 된다.
P를 점, v를 이동벡터라고 할 떄,
- P1 + v = P2 점 P1에서 v만큼 이동하면 점 P2가된다.
- P2 - P1 = v 점 P1과 P2 사이의 거리는 v이다.
이동벡터의 마지막 차원 값이 0이기 때문에, 점을 이동벡터 만큼 밀어서 이동시키더라도 그전 위치와 항상 평행
하다.
점 + 벡터 계산을 통해 다음 프레임의 점의 좌표가 생성된다.
물체의 형태는 변화하지 않고 위치만 변하게 된다.
이 게산을 마지막 차원의 값만을 생각한다면 아래와 같이 생각할 수 있다.
- 점 + 벡터 = 점 (1+0 = 1)
- 점 - 점 = 벡터 (1-1 = 0)
- 벡터 + 벡터 = 벡터 (0 + 0 = 0)
그렇다면 마지막 차원 값이 1인 점과 점을 더한다면 어떻게 될까??
- 점 + 점 = ???? (1 + 1 = 2)
마지막 차원 값이 2가 되버리기 때문에 아핀 공간의 영역을 벗어나게 되고, 이런 방식으로는 점과 점을 더할 수 없다.
그래서 우린 점과 점을 아핀 조합
을 사용하여 선
을 생성한다.
선
에 대한 수학 - 아핀 조합
이때 점에 계수를 붙혀주어서 다음과 같은 계산을 할 수 있다.
aP1 + bP2
= a(x1,y1,1) + b(x2,y2,1)
= (ax1,ay1,a) + (bx2,by2,b)
= (ax1 + bx2, ay1 + by2, a+b)
이때 a + b 가 1이라면?
P = aP1 + bP2 = aP1 + (a-1)P2 = (ax1 + bx2, ay1 + by2, 1)
마지막 차원의 값이 1로 떨어지게 된다.
즉, 점에 합이 1이되는 계수 a,b를 붙혀서 두 점을 더하여 새로운 선
을 생성한다.
이렇게 계수를 붙혀서 두 아핀공간을 더하는 연산을 아핀조합
이라고 한다.
이 아핀 조합은 물체를 구성하는데 기본이 되고 중요한 역할을 하게된다.
aP1 + (1-a)P2
이 식을 만족하는 실수 a는 무한하고 그렇기 때문에 aP1 + (1-a)P2는 직선을 그린다.
이때 계수 a의 값이 0이라면 P2에 위치한 점, 1이라면 P1에 위치한 점을 시작점으로
반대의 점은 뭐든지 될수 있기 때문에 반대의 점 방향으로 무한히 확장 할 수 있어 `반직선`을 그린다. 이때 반직선 (Ray)는 레이캐스팅, 레이트레이싱 등 에서 사용된다.
그리고 a의 값이 0에서 1사이의 값의 범위라면 두 점의 값이 확정되므로 범위가 정해진 `선분`이 만들어진다.
면
면을 만들때는 3개의 점을 아핀 조합한다.
P = aP1 + bP2 + (1-a-b)P3
이때 a와 b의 값이 0~1사이의 값이라면 세 점의 값을 확정되고 세 선분이 그려져 삼각형이 형성된다. 그리고 세 점 내부에 위치한 점 즉, `삼각형 내부의 점을 생성`하게 된다.
그래서 이 영역을 `삼각형`의 영역이라고 하고, 이 영역을 픽셀로 변환하는 과정을 `픽셀화` 라고한다.
삼각형이 모여서 물체를 구성하게 되고 이것이 게임 그래픽의 기본 원리
이다.
삼각형으로 구성된 물체의 데이터를 메쉬
라고 한다.
텍스쳐 매핑
각 점에 붙은 계수 a,b,(1-a-b)의 값에 따라서 새로 생성될 점이 어느 점에 더 가까운지 알 수 있고
이 때 좌표 (a,b,1-a-b)를 무게중심 좌표
라고한다
3D물체는 메쉬라고 불리는 삼각형들의 집합으로 구성되어 있고 삼각형은 3개의 정점으로 구성된다.
이 삼각형의 3개의 정점은 3D공간에서의 좌표를 가지고 있고
이 메쉬를 삼각형으로 구성된 평면으로 펼쳐서 저장하는 과정을 `트라이앵글 메쉬 생성`이라고 한다.
이렇게 2D로 펼쳐진 각 삼각형의 정점은 3D 공간에서의 텍스쳐 좌표를 가지고 있고 이것을 `UV좌표` 라고한다.
> 그렇기 때문에 2D 텍스쳐에 적힌 UV 좌표는 2D이미지를 우리가 눈으로 보는 좌표와는 일치 하지않는다.
텍스쳐를 통해서 3D 물체의 메쉬에 이미지를 씌우는 과정을 텍스쳐 매핑
, UV매핑
이라고 하고,
이때, 정점에 지정한 UV좌표들의 끄트머리를 붙여주면 삼각형 내부 영역이 무게중심 좌표를 사용해서 채워지는데 이것을 삼각형 보간
이라고 한다
이 과정은 렌더링 파이프라인
으로 정형화 되어있고, 원하는 기능을 끼워넣을수 있도록 두가지 함수를 제공한다.
- 정점 셰이더 (Vertex Shader) : 삼각형을 구성하는 각 정점의 최종 데이터를 결정하는 함수
- ex ) 시간에 따라서 흔들리는 물체를 표현한다
- 픽셀 셰이더 (Pixel shader) : 삼각형 내부를 구성하는 각 픽셀의 최종 색상을 결정하는 함수