Сентябрь 2009

Пример и исходник к уроку «Использование PVS - дерева».

21.09.2009

Добавил пример и сходники к уроку «Использование PVS - дерева»

Вы можете скачать - исходник.

Вышла новая версия движка 1.4.D

17.09.2009

Теперь библиотека движка развивается в двух вариантах:

  1. Версия для разработки, получила название “Version for the development“. К номеру версии библиотеки прибавляется “D” например 1.4.D
  2. Версия для публикации, получила название “Version for release“. К номеру версии библиотеки прибавляется “R” например 1.4.R

Основные отличия этих двух версий:

  • Версия для разработки прошита отладочным функционалом (как на уровне ввода данных, так и на уровне динамических расчетов): вывод подсказок, ошибок, сбор статистики и т.д., что замедляет скорость работы движка.
  • Версия для релиза по максимуму очищена от проверок на ошибки, сбора статистики и выполнения различных операций, направленных на проверку правильности данных.

Концепция данного разделения проста:

При разработке проекта используется версия  “Version for the development“, отлаживается весь проект, исправляются ошибки и неправильные данные. Затем весь проект публикуется  версией  “Version for release“, при этом скорость его работы возрастает.

Новые возможности:

  1. Добавлен новый объект Sprite3D. Спрайты являются полноценными полигональными объектами, врезаются в геометрию сцены, поддерживают все доступные материалы и т.д.;
  2. Добавлен новый объект Sound3D. Данный объект имитирует трехмерный звук, позволяет оживить сцену. Может выступать в роли контейнера для любых полигональных объектов;
  3. Добавлен новый материал DisplayObjectMaterial. Материал, заполняющий полигоны текстурой на основе DisplayObject’ов.

Добавления:

  1. В класс Object3D добавлено новое свойство visible. Свойство позволяет пропускать объект при рендеринге, но при этом не удаляет его со сцены, что очень важно для быстрой и удобной работы с объектами на сцене;
  2. В класс Object3D добавлено новое свойство priority. Свойство отвечает за последовательность добавления объектов в динамическое BSP - дерево, позволяет повысить производительность и уменьшить количество распилов BSP - деревом;
  3. В класс Object3D добавлено новое свойство collision. Свойство позволяет исключать объект и его детей из проверки на столкновения;
  4. В класс Object3D добавлен новый метод lookAt(). Метод перенесен из класса BaseController для большей функциональности;
  5. В класс Object3D добавлен новый метод сalculateObject(). Метод принудительно вызывает перерасчет матрицы объекта, а так же позволяет рассчитать матрицу объекта, не добавляя объект на сцену и не дожидаясь обновления сцены;
  6. В класс Object3D добавлен новый метод move(). Метод позволяет изменять координаты объекта сразу по трем осям. Вызов данного метода более быстрый и удобный, чем вызов трех свойств X, Y, Z, В систему сигналов добавляется лишь одно действие, а не три;
  7. В класс Object3D добавлен новый метод rotation(). Метод позволяет поворачивать объект сразу по трем осям. Вызов данного метода более быстрый и удобный, чем вызов трех свойств rotationX, rotationY, rotationZ, В систему сигналов добавляется лишь одно действие, а не три;
  8. В класс Object3D добавлен новый метод scale(). Метод позволяет масштабировать объект сразу по трем осям. Вызов данного метода более быстрый и удобный, чем вызов трех свойств scaleX, scaleY, scaleZ, В систему сигналов добавляется лишь одно действие, а не три;
  9. В класс MeshOptimization добавлен новый метод mergerMeshs(). Метод объединяет (сливает) геометрию полигональных объектов, не связанных иерархией (т.е. не выступающих ни родителями, ни детьми друг другу) и возвращает новый объект;
  10. В класс MeshOptimization добавлен новый метод mergerMeshChildren(). Метод объединяет всех детей родителя и добавляет их геометрию в геометрию родителя. Метод не учитывает детей детей родителя, но можно поэтапно проводить слияние;
  11. В класс MeshOptimization добавлен новый метод faceVerticesOnPlane(). Метод проверяет находятся ли все вершины грани в одной плоскости с определенной погрешностью;
  12. В класс UVCoords добавлен новый метод reset(). Метод обнуляет текстурные координаты;
  13. В класс DynamicBSPRender добавлено новое свойство autoPriority. Свойство позволяет отключать автоматическую расстановку приоритетов объектам и назначать приоритеты объектам вручную;
  14. В класс StatsDisplay добавлен новый метод appendControlHelpText(). Метод позволяет добавлять HTML - текст в качестве подсказок управления;
  15. В класс StatsDisplay добавлены новые свойства: _height и _width. Свойства позволяют получать размеры области вывода статистики для позиционирования других DisplayObject’ов на экране.

Расширения:

  1. При проверке на столкновения учитываются все полигональные объекты и их дети, ранее только объекты на основе Mesh;
  2. Расширен функционал класса StatsDisplay, помимо RenderTime (время, затраченное на мат. расчеты) выводятся DrawTime (время, затраченное на отрисовку сцены) и PhysicsTime (время, затраченное на физику). Также, выводится полная информация о сцене: количество объектов, камер, вершин, граней, треугольников и т.д.;
  3. Расширен функционал материала LoadingMaterial. По аналогии с загрузчиками можно подписаться на события: LoaderEvent.LOADING_COMPLETE, ProgressEvent.PROGRESS, IOErrorEvent.IO_ERROR, SecurityErrorEvent.SECURITY_ERROR. Перенесены все свойства материала BitmapMaterial для более удобного управления материалом.
  4. Камера при переходе в перспективный режим автоматически изменяет расстояние до ближней плоскости пирамиды видимости на 0, если оно было меньше 0, что позволяет избежать некоторых визуальных артефактов;
  5. Движок проводит автоматический поиск оптимальных объектов в роли сплиттеров при DynamicBSPRender фильтре, что обеспечивает более быструю работу BSP - дерева и уменьшает количество распилов.
  6. Ускорена “конвейерная” обработка путем определения актуальности выполнения тех или иных действий.
  7. Улучшено качество картинки при ортографической проекции путем расчета текстурных матриц для каждого треугольника отдельно (в версиях 1.1 - 1.3 расчет проводился для многоугольников, хотя в более старых версиях для треугольников).
  8. Теперь любой объект на основе Object3D может выступать в роли контейнера.

Изменения:

  1. Для большей функциональности метод lookAt () удален из класса BaseController и перенесен в класс Object3D;
  2. Расчет активного объекта PVS перенесен из проверки на столкновения в рендеринг, что позволяет без физики (без проверки камеры на столкновения) пользоваться PVS - деревом;
  3. Полностью переписан объект SkyBox. Можно применять любой доступный материал к граням SkyBox’a. Объект ведет себя  как любой другой полигональный объект, за исключением того, что не участвует в столкновениях, игнорирует пирамиду видимости (но не клиппинг по области ViewPort’a) и всегда рисуется первым;
  4. Исправлено название класса Clipping. Ранее назывался Cliping.

Исправления:

  1. В методе addMaterialToAllSurface() класса Mesh исправлена ошибка;
  2. В методе getUVsByName() класса Mesh исправлена ошибка;
  3. В методе removeSurface() класса Mesh исправлена ошибка;
  4. Исправлена ошибка в классе DynamicBSPRender. Когда в пирамиду видимости не попадал ни один объект, вызов построения BSP - дерева все равно происходил, что вызывало ошибку;
  5. Исправлена ошибка в классе DynamicBSPRender. Когда в пирамиду видимости не попадал ни один объект, не происходило удаление из ViewPort’a старой графической информации;
  6. Исправлена ошибка в контроллерах. Если контроллеру не назначали камеру, он пытался управлять объектом со ссылкой на null, что вызывало ошибку;
  7. Решена проблема с округление flash playr’a, которая приводила к ошибочному расчету нормалей к граням.

P.S. Особая благодарность Дворцину Александру за всестороннее тестирование движка, выявление ошибок и неточностей.

Демка «Helicopter».

10.09.2009

Добавил еще тестовую демку показывающую разницу между BaseRender и DynamicBSPRender фильтрами и между Orthographic и Perspective режимами. С помощью подобных демок я провожу тестирование движка перед сборкой новой версии, а так же отслеживаю актуальность новых алгоритмов.

По количеству полигонов эта демка равна вот этому “краш тесту” http://www.infinity3d-engine.com/ru/blog/archives/323, но в отличии от того теста тут более сложная геометрия и демка больше приближена к реальному использованию.

В демки есть возможность переключать:

1) рендер фильтры;

2) переходить из перспективного режима в ортографический и обратно;

3) показывать ребра полигонов (и разбиения BSP - деревом);

4) можно включать разные виды анимации (включить анимацию пропеллеров или вращение всего вертолета или то и другое вместе);

5) возможность переключения качества отрисовки.

P.S. В демке загружается 3D модель вертолета в формате *.ase  весом 747 кб и 2 текстуры 157кб и 54кб - так что вертолет не сразу появится.

Демка «Sound3D».

08.09.2009

Добавил демку, демонстрирующую работу нового объекта в трехмерном пространстве Sound3D (будет доступен с версии 1.4). Объект Sound3D поможет оживить сцену. Можно создавать различные эффекты, а также позволит ориентироваться в трехмерном пространстве, опираясь не только на визуальную информацию, но и на звуковую (например, для игр - определять местонахождение других персонажей на игровой карте).

В демке используются 5 звуковых объектов. 4 из них расположены по углам сцены и радиус распространения звука равен 1000 пикселей, для наглядности на земле нарисована проекция сфер  распространения звука. А 5 звуковой объект, крутится в центре сцены с радиусом распространения звука 1500 пикселей.

Демка «полностью динамическое BSP - дерево» на новой версии движка 1.4.

07.09.2009

Для сравнения версий 1.3 и 1.4 выложил новую версию демки «полностью динамическое BSP - дерево».

В новой версии, проводится выборка оптимальных объектов в роли сплиттеров и система приоритетов объектов - уменьшают количество разбиений.

Вот та же демка на версии 1.3 без выборки оптимальных объектов и без системы приоритетов
http://www.infinity3d-engine.com/example/dynamicBSP.html - разбиения хаотичны.

Демка «BSP_Box».

06.09.2009

Добавил новый “краш тест”, на это раз проводим тестирование DynamicBSP - дерева. В демке используется 300 Box’сов и 2 двусторонние плоскости для увеличения количества разбиений. Так же демка динамическая, все объекты двигаются и крутятся.

Удалось решить проблему flash player’a  при рисовании полигонов с разрывами при “LOW QUALITY”. Теперь, при любой детализации, и при рендеренге DynamicBSPRender фильтром, швы от распилов BSP - деревом почти исчезли. Динамическое дерево стало более стабильным, теперь нет хаотичного разбиения (проводится выборка оптимальных объектов в роли сплиттеров и система приоритетов объектов - уменьшают количество разбиений).

_______________________________________

Последнее обновление демки: 16.09.2009 (Оптимизирован и ускорен DynamicBSPRender фильтр)