[3D][DirectX] 평면위에 굴러가는 주사위

PS2초기 타이틀중 XI5라는 게임이 있습니다.
평면위에 주사위를 굴려서 같은 면이 만나면 없어지는 퍼즐게임이죠.

MT갔다가 한 친구가 이거 구현했다는 이야기듣고 한번 따라해봤죠;;;
생각해보니 3D물체의 회전과 이동을 확실히 익히는데 좋은 예제같더군요.

그래서 이 주사위의 움직임만 DX로 구현해봤습니다.


구현한 것을 대충 요약하자면
일단 8x8보드를 Y축으로 -1만큼 내려서 배치시켰습니다.
그리고 주사위는 Y축으로 +1위에서 굴러다니는 것이죠.
주사위를 XZ평면의 위치를 가지게 되고요.
키입력에 따라 위치를 조정해 줍니다.

중요한건 주사위의 위치와 움직임의 구현하는 두가지 방법을 떠올렸습니다.
1. Translation과 Rotation 행열을 저장해서 움직일때마다 구현하는 방법.

2. Position, Look, UP 벡터를 저장해서 움직일때마다 벡터를 변환하고
   변환 행렬을 생성하는 방법.

두번째 방법은 주사위의 위쪽면을 쉽게 구할 수 있는듯 싶었지만,
배치와 굴리는 애니메이션 구현에선 첫번째 방법이 간단해서 이걸로 구현했습니다.

변환행열을 구하는건 두가지로 구분했습니다.
하나는 90도씩 완전히 이동시키는 것과 지정된 각도로 회전만 시키는 것입니다.
사실 하나로 합쳐도 되지만, 애니메이션은 임시변환행렬을 사용했기때문에
두개로 나누었습니다.

90도씩 회전은 간단합니다.
  D3DXMatrixTranslation(&Trans, X축이동, 0, Z축이동);
  D3DXMatrixRotationX or Z(&Rot, 회전각도);
주사위가 다음에 다음한칸에 이동할 변환행열을 구합니다.
그리고 다음에 회전될 변환행열을 구해주죠.
  Object.SetTranslation(*Object.GetTranslation() * Trans);   
  Object.SetRotation(*Object.GetRotation() * Rot);
이것들을 저장하고 있던 주사위의 Traslation과 Rotation에 각각 곱해서
다음에 굴러간 위치의 변환행열을 새로 구해줍니다.


애니메이션을 위한 임의회전은 회전작업에 약간 추가가 필요합니다.
주사위를 굴린다는건 한쪽 모서리를 기준으로 회전시키기 때문이죠.
왼쪽그림처럼 주사위 중심을 기준으로 회전시키면 원하는 회전모양이 아닐것입니다. 
그래서 오른쪽그림처럼 회전할려는 축으로 이동시킨뒤, 일정방향만큼 회전시키고
다시 원점으로 이동시켰습니다.
이걸 이전단계에 가지고 있던 변환행열과 곱해서 위치를 만들어줬죠.

    Result = (*Object.GetRotation()) * Trans * Rot;
    D3DXMatrixInverse(&Trans, 0, &Trans);
    Result = Result * Trans * (*Object.GetTranslation());
여기서 Trans는 회전할려는 변을 원점에 맞추는 Translation이며
이것을 다시 돌려놓기 위해 역행열을 사용했습니다.


남은 구현을 일반적인 게임프로그래밍 구조이니 넘어가고. 결과는 이렇습니다.
Dice.zip
나중에 과제로 쓸 수도 있어서 소스는 올리지 않습니다. 학기끝나고 시간날때 올리죠 뭐;;

배경판의 경우는 정점색으로 그리면 구분이 어렵고 텍스쳐 발라주긴 귀찮아서
WireFrame으로 그려줬습니다.
그외도 기본값대로 주사위의 텍스쳐를 그리니 정점과 섞여서
COLOROP를 텍스쳐로만 구성했습니다.
키보드의 방향키로 주사위를 각 방향으로 굴릴 수 있습니다.


여기서 게임을 완전히 구현한다면 현제 위쪽을 향하는 면이 무었인지 구해야 할것입니다.
이때는 월드변환 후 각 면의 법선벡터를 구해서 법선의 단위벡터가
0.1.0인 면을 찾으면 그 면이 위쪽을 바라보고 있는 면이 되겠지요...



by hellz | 2009/04/08 14:36 | Workshop | 트랙백 | 핑백(1) | 덧글(6)

트랙백 주소 : http://hellzblog.egloos.com/tb/2343794
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at hellz's Blog &am.. at 2009/10/27 01:49

... 로젝트 만들어서 넣어주세요. 3D 처음배울 때 짠 습작이라, 여러모로 엉성합니다 --;; 구현방법에 대한 것은 예전에 아래 페이지에 설명한 것을 참고바랍니다. [3D][DirectX] 평면위에 굴러가는 주사위 ... more

Commented at 2009/04/15 10:39
비공개 덧글입니다.
Commented by hellz at 2009/04/23 01:54
죄송합니다. 이번학기에 과제로 쓸려는 풀소스는 공개안할려고 합니다.. 큐브회전같은건 3D입문서 찾아보시면 금방 발견하실듯 싶네요.
Commented at 2009/10/21 23:33
비공개 덧글입니다.
Commented by hellz at 2009/10/23 23:27
그러고보니 저번학기에 쓸일이 없었네요... 근시일내로 올리겠습니다.
Commented at 2009/10/24 06:25
비공개 덧글입니다.
Commented at 2009/10/25 19:37
비공개 덧글입니다.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶