[Главная] [Новости] [Статьи] [Игры] [Проекты] | [Автор] | |||
Теоретические основы 3D-программирования: теоретические и практические основы программирования 3D-игр. | ||||
[Все уроки] | ||||
Основы Вращений и Управления камерой | ||||
Предисловие Данный цикл статей призван помочь тем, кто решил заняться освоением DirectX. Примеры даны применительно к Delphi 6-7. В данной статье рассматривается пример 3D-приложения содержащий замкнутое пространство, движущуюся модель субмарины и возможность управления обзором из камеры. |
Особенности примера: используется чистое WinAPI-приложение (без использования VCL). К исходному коду прилагаются все необходимые файлы - *.pas и *.dll необходимые для полноценной работы с DirectX8.1 на Delphi 6-7. | |||
Примечание: для лучшего понимания данного примера Вам нужно познакомиться с понятием кватерниона. | ||||
Некоторые теоретические сведения смотри здесь. | ||||
Камера Камера описана следующим образом: TD3DCamera
= class(TObject)
|
исходный код примера (29 Кб) общий код (585 Kb) - необходим для компиляции и исполнения данного примера и других DirectX-приложений (которые Вы еще напишете) под Delphi 6-7. медиа-файлы (676 Кб) |
|||
Управление камерой Управление камерой осуществляется от клавиатуры. Для опроса состояния клавиатуры используется интерфейс DirectInput8 и утилита из модуля DX8_DIUtil8 (см. исходный код примера). Клавиши управления - стрелки - перемещение камеры в пространстве; [Del]/[Page Dn] - вращение вокруг оси Y; [Home]/[End] - вращение вокруг оси X; [Ins]/[Page Up] - вращение вокруг оси Z. |
||||
Реализация опроса клавиатуры находится в методе GameActions; Этот метод периодически вызывается в методе FrameMove. |
||||
Сам процесс перемещения и поворота камеры реализован в ряде методов:
procedure CameraMoveLR(Direction: Integer); |
||||
Вращение реализовано следующим образом:
procedure CSubmarineD3DApp.CameraRotate(Direction:
Integer; Axis: TRotationAxis);
// определяем текущую ориентацию - углы вращений
по осям
case Axis of // ограничиваем вращение диапазоном -90..90 градусов (-pi/2..pi/2 радиан)
if (Direction = 1) and (CurrentRotation < D3DX_PI*0.499) then // запоминаем новый угол case
Axis of //
формируем кватернион вращения - из 3 вращений: рысканье (yaw), тангаж
(pitch), крен (roll) //
временная переменная для вывода значений на экран (с целью отладки) |
||||
В методе FrameMove следующие строчки кода преобразуют кватернион ориентации камеры (D3DCam.FOrient) в матрицу вращения, положение камеры задается матрицей смещения (matTrans) по текущим координатам камеры. D3DXMatrixRotationQuaternion(matCursor, D3DCam.FOrient); D3DXMatrixIdentity(m_matView);
D3DXMatrixTranslation(matTrans, D3DCam.FPosX, D3DCam.FPosY, D3DXMatrixMultiply(m_matView, m_matView, matTrans); |
||||
Важные замечания - смотри здесь. | ||||
исходный код примера и общий код можно скачать здесь: | ||||
необходимые медиа-файлы: | (676 Кб) | |||
[Назад] [Все уроки] | ||||
[Главная] [Новости] [Статьи] [Игры] | ||||
(c) Мега Информатик 2006-2007 |