1.1. 1. 좌표계 사용하기 ¶
3D 영역에서의 작업을 위해서는 사용할 좌표계를 정의해야 한다.
가장 일반적인 좌표계인 데카르트 좌표계는 원점으로 사용할 점과 원점을 지나며 서로 지각인 세 개의 축이 있다.
그리고, 이런 데카르트 좌표를 표현할수 있는 구조는.. 다음과 같다.
가장 일반적인 좌표계인 데카르트 좌표계는 원점으로 사용할 점과 원점을 지나며 서로 지각인 세 개의 축이 있다.
그리고, 이런 데카르트 좌표를 표현할수 있는 구조는.. 다음과 같다.
~cpp struct Point3D { float x; float y; float z; }
1.1.1. 1.1 폴라 좌표계 ¶
"원점에서 동쪽을 바라보며 죽쪽으로 38도 회전하고, 위로 65도 회전한 후에 이 선을 따라 7.47피트로 이동"하는 방법으로 위치를 설명할 수 있다. 그러나, 수학적으로 풀 경우, 점을 이리저리 움직이면 처리하기가 더운 어려워진다. 그래서 이런 폴라 좌표계는 제어가 어렵기 때문에 3D엔진에서는 거의 사용하지 않는다.
1.1.2. 1.2 다중 좌표계 사용하기 ¶
3D 오브젝으를 사용하여 작업하다 보면 하나의 점으로 작업하는 것보다 여러 점을 묶어 작업하는 것이 효율적임을 알게 된다.
예를 들어, 컴퓨터를 모델링할 경우 다음 코드와 같은 구조로 저장할수 있다.
하나의 code[] 절대 "세계"좌표를 구하려면 다음과 같은 코드를 사용한다.
CPU::GetWorldCoord(int index)는 그 세계의 원점에 대해 CPU 여덟개 점 중의 하나를 반환한다. 단지 coordindex를 반환한다면, CPU중앙에 해당하는 CPU점을 반환하기 때문에 나중에 CPU를 그랠 때 원하는 대로 그릴 수 없게 된다. 중앙을 움직이면서도 CPU점 여덟개를 모두 옮기는 효과를 낼 수도 있다.
예를 들어, 컴퓨터를 모델링할 경우 다음 코드와 같은 구조로 저장할수 있다.
~cpp struct CPU { Point3D center; // the center of CPU. in world coordinates Point3D coord[8]; // the 8 corners of the CPU box relatives to the center point };이렇게 하면 게임에서 CPU를 움직여야 할 경우, CPU를 그리는데 사용하는 모든점에 대한 컴퓨터 중앙 만 움직이면 된다.
하나의 code[] 절대 "세계"좌표를 구하려면 다음과 같은 코드를 사용한다.
~cpp struct CPU { Point3D center; Point3D coord[8]; Point3D GetWorldCoord (int index) { Point3D result; result.x = center.x + coord[index].x; result.y = center.y + coord[index].y; result.z = center.z + coord[index].z; return result; } };