Переход на восьмую версию движка
Материал из AlternativaPlatform Wiki
Содержание |
[править] Введение
Если вы уже немного знакомы с Molehill API, можете это введение пропустить (и перейти к основам Alternativa3D 8), оно призвано познакомить читателя с основными понятиями реализации аппаратного 3д во флэше. Раньше все экранные объекты были наследниками DisplayObject и должны были быть включенными в DisplayTree. Отрисовывать при помощи аппаратного 3D API видеокарты в такие объекты не получится, для этого в Molehill есть специальный класс stage3D, и также как и с обычным stage – в приложении они создаются автоматически, и пользователь не может влиять на этот процесс. stage3D в приложении представлены в количестве 4х штук, они также как и DisplayObject-ы отсортированы по глубине друг относительно друга, и всегда находятся "глубже" всего, что находится в DisplayTree, то есть теперь нельзя будет расположить флэшовый спрайт за трехмерной картинкой.
Для работы потребуется по меньшей мере одна stage3D, и ее можно взять как свойство stage
stage3D = stage.stage3Ds[0];
Следующим нововведением, связанным с аппаратным 3д, является то, что всё, что используется при отрисовке видеокартой, должно быть загружено в ее память.
В Alternativa3D такие загружаемые данные называются ресурсами и в общем виде их можно разделить на две группы: геометрия и текстуры.
У каждой stage3D есть свойство context3D, которое тесно связано с памятью видеокарты, из которой будут браться данные для отрисовки в эту stage3D.
[править] Нововведения в архитектуре приложения
Базовая структура приложения не сильно изменилась относительно 7й версии. Можно сказать, что все изменения на этом уровне связаны с загрузкой ресурсов в видеокарту. Поскольку для работы с памятью нужен соответствующийcontext3D, то нужно его запрашивать. Только после того, как он будет получен, можно будет загружать ресурсы и вызывать camera.render(), поскольку контекст нужно передавать в параметр этому методу, так как камере нужно знать откуда брать ресурсы для отрисовки.
class foo { public function foo() { stage3D = stage.stage3Ds[0]; stage3D.addEventListener(Event.CONTEXT3D_CREATE, init); stage3D.requestContext3D(); ... } private function init(e:Event):void { stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); var res:Vector.<Resource> = container.getResources(true); for (i = 0; i < res.length; i++) { res[i].upload(stage3D.context3D); } } private function onEnterFrame(e:Event):void { camera.render(stage3D); } }
Таким образом, если вы изменяете геометрию, или назначаете новую текстуру, то после этого нужно у соответствующего ресурса вызвать метод upload()
В самом простом случае, когда ресурсов не жалко можно пробегать по всей иерархии. Метод getResources() рекурсивно соберет все ресурсы, которые используются текущим и дочерними объектами.
Для ручной загрузки текстуры можно использовать класс BitmapTextureResource, класс FileTextureResource удобно испоьзовать совместно с TexturesLoader.
[править] Камера, отрисовка и вьюпорт
Некоторые изменения коснулись и всего названного, но мы попытались свести изменения апи к минимуму. Несмотря на то, что непосредственно отрисовка в большинстве случаев производится в stage3D, мы оставили свойство view у камеры, которое во-первых, является "оберткой" для stage3D, в которой можно устанавливать такие привычные настройки как ширина и высота; во-вторых, при включеном флаге "render to bitmap", view как и раньше будет тем DisplayObject, который можно добавить в DisplayTree. Также в конструкторе камеры нужно обязательно задавать farClipping и nearClipping, которые могут разительно отличаться от сцены к сцене.
[править] Изменения в организации иерархии и базовых трехмерных объектах
Изменения затронули базовые классы трехмерной иерархии. Контейнеры потеряли свою актуальность, так как любой трехмерный объект может выполнять их функцию. Изменился способ хранения и работы с геометрией. Эти изменения представлены на иллюстрациях, которые, как мы надеемся, не требуют дополнительных пояснений.


