- •Учебник
- •Оглавление
- •Введение
- •Глава 1
- •I. Установка
- •II. Удаление
- •Глава 2. Первый проект
- •Глава 3. Создание сцены в режиме design time
- •Создание объектов:
- •Глава 4. Примитивные объекты. Вкладка Basic geometry.
- •Глава 5. Ориентация, координаты.
- •Глава 6. Движение.
- •Глава 7. Как узнать, сколько сейчас fps?
- •Глава 8. Полноэкранный режим.
- •Глава 9. Работа с материалами.
- •I. Прямое обращение к .Material
- •Глава 10. Использование 3d моделей.
- •I. Форматы моделей
- •Глава 11. Прокси объекты.
- •Глава 12. Создание земной поверхности с glTerrainRenderer.
- •Глава 13. Создание земной поверхности с glFreeForm.
- •Глава 14. Итоги работы с glTerainrender и glFreeForm.
- •Глава 15. Создание земной поверхности с glHeightField.
- •Глава 15. Создание неба.
- •Глава 16. GlAtmosphere.
- •Глава 17. Спецэффекты.
- •I. Огонь
- •II. Молния
- •III. Дождь
- •IV. Снег
- •VI. Блики от источников света
- •Глава 18. Растительность.
- •I. Деревья и кустарники
- •II. Трава
- •Глава 19. Работа со шрифтами и вывод надписей.
- •I. Вывод текста через компонент glWindowsBitmapFont
- •II. Проблема с glWindowsBitmapFont в Windows Vista
- •Глава 20. Выделение объекта мышкой.
- •Глава 21. Создание сцены в режиме runtime.
- •Глава 22. Тени.
- •Глава 23. Туман.
- •Глава 24. Vbo или расширение arb_vertex_buffer_object в OpenGl.
- •Глава 25. Fbo или расширение ext_framebuffer_object в OpenGl.
- •Глава 26. Рисование на канве.
- •Глава 27. Использование чистого OpenGl.
- •Глава 28. Звуки.
- •I. Проигрывание звуков с помощью bass
- •II. Проигрывание звуков с помощью fmod
- •III. Проигрывание звуков с помощью OpenAl
- •Глава 29. Игровое меню.
- •Глава 30. Примитивная физика dce.
- •Глава 31. Физика ode.
- •II. Основы библиотеки ode(: tglodeManager и tglodeJointList) на примере создания подобия боулинга.
- •Глава 32. Физика Newton.
- •Глава 33. Ручная проверка коллизий.
- •V. Ручная проверка коллизии
- •Глава 34. Шейдеры. Терменология.
- •Глава 35. Шейдеры. История и компоненты.
- •Глава 36. Шейдеры glsl. Введение.
- •Глава 37. Шейдеры glsl. Использование без компонентов. Самый примитивный шейдер.
- •Глава 38. Шейдеры glsl. Немного о спецификации. Типы данных и переменные
- •Стандартные функции
- •Поддерживаемые компоненты векторов
- •Глава 40. Шейдеры glsl. Текстурирование.
- •Глава 41. Шейдеры glsl. Использование без компонентов. Мультитекстурирование. Смешение трёх цветов по базовой карте.
- •Глава 42. Шейдеры glsl. Использование через компонент glslShader. Часть первая – Первые шаги.
- •Глава 43. Шейдеры glsl. Использование через компонент glslShader. Часть вторая – знакомимся со светом. Передача параметров в шейдер.
- •Глава 44. Шейдеры glsl. Использование через компонент glslShader. Часть третья – текстуры.
- •Глава 45. RenderMonkey.
- •Глава 46. Оптимизация программы.
- •Глава 47. Практика. Создание мира
- •Приложение
- •I. Типы векторов и матриц
- •II. Работа с векторами
- •III. Работа с матрицами
- •IV. Методы объектов glScene
- •Предметный указатель по компонентам glScene
Глава 6. Движение.
Простое движение камеры рассмотрим на примере. Очистите у камеры свойство TargetObject, чтобы мы могли сами управлять направлением взгляда камеры. Подключите модуль GLKeyboard (в старых версиях keyboard), для работы с клавиатурой. В каденсере напишем процедуру перемещения камеры при нажатии клавиш на клавиатуре:
Procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
Begin
if IsKeyDown(VK_ESCAPE) then Close;
//Движение вперед по клавишам ‘ц’ и’ w’
if (IsKeyDown('ц') OR IsKeyDown('w')) then GLCamera1.Move(2*d);
//Движение назад по клавишам ‘ы’ и ‘s’
if (IsKeyDown('ы') OR IsKeyDown('s')) then GLCamera1.Move(-2*d);
//Поворот влево по клавишам ‘ф’ и’ a’
if (IsKeyDown('ф') OR IsKeyDown('a')) then GLCamera1.slide(-2*d);
//Поворот вправо по клавишам ‘в’ и ‘d’
if (IsKeyDown('в') OR IsKeyDown('d')) then GLCamera1.slide(2*d);
//Движение вверх по клавишам ‘u’ и ‘г’
if (IsKeyDown('u')) OR IsKeyDown(‘г’) then GLCamera1.Lift(0.01)
//Движение вниз по клавишам ‘n’ и ‘т’
if (IsKeyDown('n')) OR IsKeyDown(‘т’) then GLCamera1.Lift(-0.01)
end;
Теперь запускаем проект и видим, что мы можем перемещать камеру по сцене.
Воспользуемся стандартным способом работы с мышью.
Переместите из вкладки GLScene Utils на форму GLNavigator. У него в свойстве MovingObject выберите GLCamera1 (это объект, который будет перемещаться).
Добавьте на форму GLUserInterface1 из вкладки GLScene Utils, в свойстве GLNavigator
выберете GLNavigator1. Свойство MouseSpeed – это скорость реакции мыши, сделаем её равным 10.
Теперь нужно скрыть курсор мышки. Для этого в событие OnCreate формы добавьте такую строчку:
GLUserInterface1.MouseLookActive:=true; //Активировать Обзор мышью А в событии OnProgress Cadencer’а добавить строчки: GLUserInterface1.Mouselook; //Обзор мышью GLUserInterface1.MouseUpdate; //Обновить мышь
Всё. Запускаем проект и смотрим, что получилось.
Глава 7. Как узнать, сколько сейчас fps?
FPS – Frames Per Second (количество кадров в секунду) – очень важный параметр для определения
быстродействия графического проекта. При очень маленьких значениях FPS игра начинает "идти скриншотами".
Количество кадров в секунду возвращает метод FramesPerSecond.
Пример:
Поместите на форму таймер из вкладки System. Задайте у него свойство Interval=100. В его событии
OnTimer введите следующие строчки:
Caption:=Format('%.1f FPS', [GLSceneViewer1.FramesPerSecond]); GLSceneViewer1.ResetPerformanceMonitor;
Первая строчка выводит в заголовке формы количество FPS, вторая делает так, чтобы выводилось не среднее значение FPS, а текущее.
Глава 8. Полноэкранный режим.
Для полноэкранного режима используется компонент GLFullScreenViewer, поместите его на форму. В свойстве Camera установите камеру, через которую будет выводиться изображение. Переход в полноэкранный режим:
//укажите эту команду, если хотите оставить текущее разрешение
GLFullScreenViewer1.UseCurrentResolution;
//активация полноэкранного режима
GLFullScreenViewer1.Active:=True;
Ну и соответственно выход из полноэкранного режима:
GLFullScreenViewer1.Active:= False;
Количество FPS можно узнать процедурой GLFullScreenViewer1.Buffer.FramesPerSecond.
Многие не используют компонент GLFullScreenViewer, а просто растягивают форму на весь экран и убирают заголовок окна. Я считаю, что лучше всё же пользоваться GLFullScreenViewer, так как в этом случае существует возможность управлять разрешением. А при уменьшении разрешения fps увеличиваются.
Если не указывать команду UseCurrentResolution, то установится разрешение GLSceneViewer1.Width* GLSceneViewer1.Height.