루빅스큐브 (27개의 작은 정육각형 블럭으로 구성된 퍼즐 장난감) 을 시뮬레이션 하는
간단한 opengl 프로그램을 만들고 있는데요..
각 블럭마다 3/3/3 행렬의 고유 원소값을 가지고 있고
이를 기반으로 퍼즐내의 자기 위치를 구성합니다 ( 슬라이스를 회전할 때 어떤 블럭들이 회전할지 알아야 하니까요)
문제는 이 블럭 하나가 처음 90도를 회전한 뒤에, 아직 회전하지 않은 블럭들과 함께 슬라이스가 구성이 되는데
이 상태에서 (아직회전하지 않은 블럭)+(한번 회전 한 블럭) 의 슬라이스를 회전시키면
이미 회전을 한번 한 녀석의 좌표계 기준으로 90도를 돌아버립니다.
사용자가 큐브를 x 축CW(clockwise) 방향으로 돌리고 싶어서 명령을 하면,
이미 한번 (예를들어 y 축으로) 회전 한 놈 기준으로는 x 축이 전역좌표계의 -z 축과 일치하므로
자기 기준으로 돌아버리니 같은 x 축 CW 명령이라도 사용자 시점에서
이미 회전을 했던 3블럭은 전역좌표계의 -z을 기준으로, 나머지 6블럭은 기존의 x 축 기준으로 회전하게 되어
슬라이스가 깨지는 (사실 전체 큐브가 깨지는) 현상이 발생합니다.
그래서 해법을 고민하다가 두가지 방법을 생각해 냈는데요
1. 회전이 끝나면 전역좌표계와 지역좌표계를 일치시켜준다
2. 회전을 할 때마다 회전량을 저장할 변수를 지정하고, 이 변수에 따라 매 회전 명령마다 이후 회전할 값을 보정해준다
이상인데요
1번은 방법을 모르겠습니다. 내장함수에서 지원하는 방법이 있는건지 몇시간씩 구글링 해봐도
지역좌표계 초기화 관련해서만 나오는데 glMatrixMode 를 초기화 다음에 한번 더 부르면 화면 자체가 깨져버리고요
2번의 경우는 머리가 돌지를 않네요; 번쩍번쩍 생각나는 것들은 어찌보면 간단한데 돌려볼때마다 새로운 문제에 봉착하고..
그래서 혹시 레임에 같은 고민을 하시는 분이나 해결하셨거나 해법을 아시는 분이 있을까 해서 질문을 올려 봅니다.