[코딩의탑] 2층: 포탈(Portal)
포탈이란 무엇인가요? 수많은 게임 팬들을 환호하게 만든 센세이셜한 게임이 있습니다: 바로 밸브 사의 포탈이죠. 포탈은 서로 다른 두 공간을 이어주는 문입니다. 플레이어는 포탈을 통과해 공간을 이동할 수 있고, 통과하지 않아도 맞은 편의 공간을 볼 수 있죠. 또한, 포탈을 통과할 때는 운동량이 보존됩니다. 공중에서 빠른 속도로 낙하하면서 땅바닥에 열려 있는 포탈을 통과하게 되면, 맞은편 포탈로 대포알처럼 튕겨나갈 수 있다는 것이죠! <Portal> 코딩의 탑 2층에서 우리는 이러한 포탈의 구현을 다루게 될 것입니다. 어떻게 해결할 수 있을까요? 우리는 다음 두 가지 작은 목표를 해결해나갈 것입니다. 임의의 좌표계의 벡터를, 다른 임의의 좌표계로 변환할 수 있습니다. 사원수(Quaternion)를 이용하여, 두 좌표계의 차이만큼 회전시킬 수 있습니다. 준비운동을 시작해 보자구요.. 기저 우리는 좌표 공간에 벡터를 표현하죠. 이 때의 축은 각각 x축, y축, z축이 됩니다. 사실 이 축들은 곧 기저 벡터입니다. 기저 벡터라 함은, 벡터 공간에서 임의의 벡터를 표현하는데 쓸 수 있는 벡터들입니다. 기저 벡터가 x축, y축, z축의 단위 벡터라면 이는 다음과 같이 표현해볼 수 있겠죠: x (1,0,0), y (0,1,0), z (0,0,1). 이 세 가지 벡터만 있다면, 3차원의 모든 벡터를 표현할 수 있습니다. 가령 (1,2,3)은 1* x +2* y +3* z 로 표현해볼 수 있습니다. 다음 그림을 참고해보세요: 재미있는 사실은 이러한 기저 벡터들은 우리가 원하는 대로 얼마든지 만들 수 있다는 것입니다. 심지어, 다른 기저 벡터의 표현으로도 변환해볼 수 있죠! 그러기 위해, 우리는 행렬식을 이용해 벡터의 표현을 일반화해볼 수 있습니다. 다음 그림을 참고해보세요: i, j, k는 각 기저의 성분이 되며, (x1, y1, z1), (x2, y2, z2), (x3, y3, z3)는 기저 ...