드디어 오늘 플레이어 이동 & 카메라 구현을 완료했다.
처음 만드는 3D게임이여서 어려웠던거 같다.
그래도 만들면서 카메라 회전이나 회전행렬등을 이해할 수 있었다
구현 영상
조작은 마우스로도 할 수 있고 키보드 방향키로도 할 수 있다
구현 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | void PlayerAirplane::InputMouse() { // vGap : 전프레임과 현재 프레임의 마우스 위치의 차이. Vector2 vGap(INPUT.GetMouseGap()); //fForwardAngle : Forward축으로 돌릴 회전값 float fForwardAngle = -(D3DXToRadian(vGap.x) * 0.05f); //fRightAngle : Right축으로 돌릴 회전값 float fRightAngle = -(D3DXToRadian(vGap.y) * 0.05f); //키보드 사용시 if (KEYPRESS(VK_UP)) fRightAngle += D3DXToRadian(3.f); if (KEYPRESS(VK_DOWN)) fRightAngle -= D3DXToRadian(3.f); if (KEYPRESS(VK_RIGHT)) fForwardAngle -= D3DXToRadian(3.f); if (KEYPRESS(VK_LEFT)) fForwardAngle += D3DXToRadian(3.f); // 각 축의 회전행렬과 초기화 D3DXMATRIX matForwardRot; D3DXMatrixIdentity(&matForwardRot); D3DXMATRIX matRightRot; D3DXMatrixIdentity(&matRightRot); #pragma region AIRPLANE ROTATION // 플레이어를 회전 코드 if (fForwardAngle) { // Forward 축으로 회전한 Matrix를 다른축에다 적용시켜준다 D3DXMatrixRotationAxis(&matForwardRot, &vAxis[E_AXIS_FORWARD], fForwardAngle); D3DXVec3TransformNormal(&vAxis[E_AXIS_RIGHT], &vAxis[E_AXIS_RIGHT], &matForwardRot); D3DXVec3TransformNormal(&vAxis[E_AXIS_UP], &vAxis[E_AXIS_UP], &matForwardRot); } if (fRightAngle) { // Right 축으로 회전한 Matrix를 다른축에다 적용시켜준다 D3DXMatrixRotationAxis(&matRightRot, &vAxis[E_AXIS_RIGHT], fRightAngle); D3DXVec3TransformNormal(&vAxis[E_AXIS_FORWARD], &vAxis[E_AXIS_FORWARD], &matRightRot); D3DXVec3TransformNormal(&vAxis[E_AXIS_UP], &vAxis[E_AXIS_UP], &matRightRot); } if (fRightAngle != 0 || fForwardAngle != 0) transform->matRot = transform->matRot * matForwardRot * matRightRot; #pragma endregion AIRPLANE ROTATION #pragma region CAMERA_SETTING // 카메라를 회전 코드 // 구한 회전 행렬을 플레이어와 카메라위치, 카메라LookAt위치에 대한 방향에 적용시켜준다. if (fForwardAngle) { D3DXVec3TransformNormal(&vCameraLookAtDir, &vCameraLookAtDir, &matForwardRot); D3DXVec3TransformNormal(&vCameraDir, &vCameraDir, &matForwardRot); } if (fRightAngle) { D3DXVec3TransformNormal(&vCameraLookAtDir, &vCameraLookAtDir, &matRightRot); D3DXVec3TransformNormal(&vCameraDir, &vCameraDir, &matRightRot); } //카메라 위치 셋팅 vCameraPos = transform->pos + (vCameraDir * fCameraDistance); vCameraLookAt = transform->pos + (vCameraLookAtDir * fCameraLookAtDistance); CAMERA.SetCameraInfo(vCameraPos, vCameraLookAt, vAxis[E_AXIS_UP]); #pragma endregion CAMERA_SETTING } void PlayerAirplane::InputKeyboard() { if (KEYPRESS('W')) transform->pos += vAxis[E_AXIS_FORWARD] * (200 * Et); if (KEYPRESS('S')) transform->pos -= vAxis[E_AXIS_FORWARD] * (200 * Et); } | cs |
각 코드의 설명은 주석으로 작성해놨다.
알아두고 가야할 요소들.
* 값의 변화를 잘 알아두고 작업하자
144줄과 150줄 사이에서 Forward벡터를 축으로한 회전이 이루어진다
그리고 153줄과 160줄 사이에서 Right축으로한 회전이 이루어지면서
Forward벡터가 변경되는데
여기서 입력이 동시에 이루어진다면 Forward벡터는 변경되기 전 값으로
계속 먼저 회전되고나서 값의 변경이 이루어진다.
이 값이 계속 누적되면 카메라가 플레이어를 똑바로 바라보지않고 오차가 생기게된다
--------------------------------------------------------------------------
만들때는 어려웠지만 만들고 보닌까 이해가 됐다.
'게임개발 > 2019지방기능대회연습_3D비행슈팅게임' 카테고리의 다른 글
DirectX9 3D비행슈팅게임 쿼터니온회전 (0) | 2019.02.15 |
---|