Попробуем переместить камеру через нажатие клавиш. Этот способ не совсем правильный, но его всех проще реализовать. В конце этого шага я расскажу о недостатках такого способа.
Для начала откроем свой последний проект. И добавим одну единственную функцию реагирующую на клавиши. Установим мигающий курсор в класс CMainWnd и добавим событие: WM_CHAR - OnChar, более подробно о событиях рассказано в "Шаг 11 - Добавляем событие OnPaint, LButtonDbl и устанавливаем полноэкранный режим средствами MFC".
И заполним получившуюся функцию:
void CMainWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CFrameWnd::OnChar(nChar, nRepCnt, nFlags); switch (nChar) { case 'a': x+=(float)0.03; break; case 'd': x-=(float)0.03; break; case 'w': cameraz+=(float)0.5; break; case 's': cameraz-=(float)0.5; break; } }
Переменную х нужно объявить в классе CMainWnd как float x;. Также перейдите в функцию Transform3D и закомментируйте строку:
//static float x; x+=(float)0.003;
И не забудьте в конструкторе класса окна рамки к значению х присвоить нуль.
x = 0;
В классе окна-рамки объявите переменную:
float cameraz;
Начальное значение присвойте ему в конструкторе класса окна-рамки:
cameraz = -70;
И в функции Transform3D измените функцию D3DXMatrixLookAtLH, вместо -70 укажите cameraz:
D3DXMatrixLookAtLH (&matView, &D3DXVECTOR3 (0.0f, 0, cameraz), &D3DXVECTOR3 (0.0f, 0.0f, 0.0f), &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
Все, можете запускать приложение и клавишами A, D, W, S, Вы можете немного поперемещаться в пространстве. Если Вам не хватает перемещений, можете добавить сами :)
Теперь о недостатках:
Попробуйте приблизить куб и начать его вращать, Вы заметите, как он дергается на экране. Чтобы такого не было и все действия пользователя создаваемые при помощи джойстика, мышки или клавиатуры были плавными, нам нужно использовать DirectInput, но об этом поговорим попозже.