GLScene

GLScene — графический движок для создания кросс-платформенных приложений на языках программирования Delphi, Free Pascal и C++, использующий библиотеку OpenGL в качестве интерфейса программирования приложений. GLScene является свободным программным обеспечением и распространяется с лицензией Mozilla Public License. С его помощью программирование трёхмерной графики в Windows становится более простым и быстрым. Последние версии движка также доступны в среде программирования Lazarus для создания приложений для Linux MacOS и мобильных операционных систем.

Разработка данного движка началась в 1997 году Майком Лишке и версия 0.5 была выложена с открытым исходным кодом. Дальнейшее развитие GLScene было продолжено Эриком Гранжем, а после 2006 года поддерживается командой разработчиков. Поддержка языка С++, юникода, работы на платформе Windows 64, переход с Subversion на Git, создание зеркал SourceForge репозитория на GitHub и GitFlic, а также разработка и выпуск новых версий с 2011 по 2023 год выполнялись Павлом Васильевым, администратором vassiliev . В настоящий момент движок пополнился новыми функциями работы с полигональными объектами, вокселами и шейдерами, стал быстрее благодаря различным оптимизациям кода.

GLScene позволяет программистам создавать 3D-объекты OpenGL в design-time с использованием интерфейса, показанного на картинке. Большое количество объектов и дополнительных визуальных компонентов VCL помогает программистам создавать графические 3D-приложения для Delphi, C++Builder и Lazarus.

Загружаемые форматы файлов моделей: 3ds, obj, vrml, smd, md2, md3, nmf, oct, lwo, b3d, gl2, gls, ms3d, Nurbs, lod, и некоторые другие.

Сохраняемые форматы файлов моделей: glsm, obj и smd.

Поддерживаемая физика: ODE, Newton Game Dynamics. Также есть небольшой собственный движок расчёта столкновений с учётом законов сохранения импульса DCE.

Некоторые объекты GLScene 

TGLCamera — объект камера. Это точка, из которой смотрят на трёхмерный мир. Камере можно задавать положение и целевой объект, на который она смотрит. Варьируя её параметр FocalLength, можно изменять фокусное расстояние камеры. Параметры DepthOfView и NearPlaneBias отсекают дальние и ближние объекты. Отсечение дальних объектов может сильно повысить скорость работы.

Таким образом, поле зрения камеры — это усечённый конус, ограниченный с обеих сторон параметрами DepthOfView и NearPlane, угол которого задан через параметр FocalLength.

TGLSceneViewer — объект для визуализации трёхмерного мира. Его нужно кинуть на форму и установить ему свойство Camera, то есть указав камеру, с которой надо смотреть на мир. После этого он будет показывать то, что видит указанная камера.

TGLDummyCube — объект, не содержащий графики, но имеющий позицию (position), ротацию в виде векторов направления (direction) и верха (up) и масштаб (scale). При помощи этих свойств объекту можно придавать различные положения в пространстве. А используя несколько TGLDummyCube’ов, прикреплённых друг к другу, можно создавать сложные пространственные конструкции, как, например, скелет, в котором кости соединены друг с другом суставами или сочленениями (joints).
Кроме того TGLDummyCube удобен для использования в качестве целевого объекта камеры TGLCamera.

TGLMaterialLibrary — библиотека материалов. Находящиеся в ней материалы переносятся в видеопамять видеокарты. Все материалы могут использоваться разными объектами GLScene одновременно. Каждый материал может иметь свою текстуру или использовать текстуры других материалов со своими настройками её отображения. Таким образом, например, загрузив текстуру машины зелёного цвета, можно использовать её в другом материале, но изменив её цвет на, скажем, синий.

TGLFreeForm — статичная трёхмерная модель. Используется, чтобы загрузить, например, здания, ландшафты, деревья и прочие подобные объекты. Чтобы загрузить 3D-модель в GLScene достаточно двух строчек кода:
  // Указываем какую библиотеку материалов использовать.
GLFreeForm1.MaterialLibrary := GLMaterialLibrary1;
  // Загружаем 3D-модель.
GLFreeForm1.LoadFromFile('mymodel.3ds');
Также надо добавить в uses модуль загрузчика моделей. Для моделей 3ds это GLFile3DS, для моделей smd — GLFileSMD,  по аналогии.
После загрузки модель полностью попадает в видеопамять, и процессорное время на её отображение практически не тратится. При изменении матрицы этого объекта, в видеопамять пересылается только новая матрица.

TGLActor — трёхмерная модель с анимацией. Используется для загрузки моделей людей, монстров, других движущихся объектов. Загрузка аналогична загрузке модели в TGLFreeForm.
Чтобы запустить анимацию достаточно двух строчек.
  // Грузим модель со скелетной анимацией 'mymodel.smd'.
GLActor1.LoadFromFile('mymodel.smd');
  // Добавляем анимацию ходьбы из файла 'walk.smd'.
GLActor1.AddDataFromFile('walk.smd');
  // Переключаемся на анимацию ходьбы 'walk'. 
GLActor1.SwitchToAnimation('walk');
  // Запускаем проигрывание анимации в циклическом режиме.
GLActor1.AnimationMode := aamLoop;
В отличие от моделей, находящихся в TGLFreeForm, здесь рендеринг частично возложен на центральный процессор. Когда происходит изменение позиции модели со скелетной анимацией, то для каждого положения каждой кости в каждый момент времени происходит перерасчёт положения вершин модели, после чего они пересылаются в видеопамять и отображаются на экране. Этот подход более медленный, но зато позволяет добиться практически идеальной плавности движений.

TGLPoints — позволяет рисовать на экране точки. Добавлять точки нужно в список Positions. Чтобы точки были цветными, нужно добавлять цвета в список Colors. Если в него добавлен только один цвет, то все точки будут этого цвета. Если количество цветов равно количеству точек, то каждая точка будет своего цвета.

TGLLines — позволяет рисовать линии и сплайны. Линии задаются точками, добавлять которые можно в список Nodes через процедуру NodesAdd. Линии по заданным точкам рисуются в зависимости от способа отображения LineSplineMode. Если это lsmSegments, то каждые две точки означают отдельную линию. Если lsmLines, то линии проводятся от точки к точке. Если какой-то другой режим, то по точкам рисуется сплайн, то есть плавная линия, проходящая через все заданные точки. Плавность линии зависит от параметра Division. Чем он больше, тем линия плавнее. Если в опции LinesOption включён параметр loUseNodeColorForLines, то для каждой точки линии можно будет использовать свой цвет. Цвета задаются в NodeColor.

Также есть возможность выделять разными способами точки по которым строятся линии. Способ задаётся в параметре LineNodesAspect.
 lnaInvisible — выделение отсутствует.
 lnaAxes — выделение осями.
 lnaCube — выделение кубами
 lnaDodecahedron — выделение двенадцатигранниками.

TGLLightSource — источник освещения, который освещает всю трёхмерную сцену. Их в OpenGL может быть максимум восемь. Поэтому в GLScene их тоже восемь. Светит данный источник освещения или нет, определяется параметром Shining (светимость).

За цвет освещения отвечают три параметра: Ambient, Diffuse и Specular. Ambient — это общее освещение сцены, не зависящее от положения источника света, как освещённость в тени в солнечный день. Diffuse — направленный свет, зависит от положения источника. То есть, если поверхность отвёрнута от него, то он её не освещает. Specular — зеркальный свет. Зависит ещё и от нормали поверхности. С его помощью можно делать яркие блики, как например яркая точка на железном блестящем шарике от лампочки.

За ослабление яркости света в зависимости от удаления от источника отвечают три параметра: ConstAttenuation, LinearAttenuation, QuadraticAttenuation. Первый — это постоянное ослабление (в общем не зависит от расстояния, а просто можно считать, что управляет яркостью источника света), второй — линейное ослабление, третий — квадратичное.

Источник света может быть прожектором. Для этого его параметр SpotDirection нужно выставить в lsSpot и указать параметры прожектора. SpotDirection — указывает направление света прожектора. SpotCutOff — угол конуса прожектора. Если он равен 180 градусам, то считается, что это не прожектор, а обычный источник освещения. Если меньше 90, то прожектор. SpotExponent — коэффициент изменения яркости от центральной точки пятна прожектора до его краёв.

Прожекторы часто используются в качестве фар автомобилей или фонариков в руках героя в играх.

Примечания

Ссылки 

 Сайт GLScene
 Графический движок GLScene на SourceForge
 GLScene Engine на GitHub
 GLScene Engine на GitFlic
 Официальный форум GLScene* 
 Установка GLScene под Lazarus
 Галерея — сборник «больших» демонстрационных программ, показывающих возможности GLScene

Графические движки
Свободные игровые движки
Свободное программное обеспечение, написанное на Delphi
Свободное программное обеспечение, написанное на C++
Программное обеспечение с лицензией MPL