Alternativa3D. Урок 1.

Дорогие читатели, страждующие трехмерного просвещения, здравствуйте! Сейчас мы с вами узнаем основы работы с трехмерным движком Alternativa3D. В этом уроке будем создавать простую сцену, на которой будет находиться вращающаяся плоскость. При щелчке мыши на плоскости, она будет менять свой угол вращения.

Ну что? Поехали?

Для работы нам понадобится FlashDevelop (ну и что там с ним связано). Так же понадобится Flash IDE (во всяком случае я компилил при помощи флеша).

Устанавливаем FlashDevelop и настраиваем. Я указывал путь до Flash IDE. Для этого идем в Tools->Program Settings->ASCompletion. Находим Path to Flash IDE и прописываем путь:
Настройка пути до Flash IDE во FlashDevelop

Теперь создаем проект во FlashDevelop. Для этого идем в Project->New Project, в открывшемся окне выбираем AS3 Project, указываем место сохранения и задаем имя:
Создание нового проекта во FlashDevelop

Поздравляю, вы на пути к истине! Справа, в дереве проекта, выбираем папку src, в ней находим файл Main.as. Он содержит примерно следующий код:
package
{
        import flash.display.Sprite;
        import flash.events.Event;

        public class Main extends Sprite 
        {
                
                public function Main():void 
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                
                private function init(e:Event = null):void 
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                }
                
        }
        
}

Единственное, что сейчас стоит сделать — это изменить
package{
…
}
на
package src {
…
}


Теперь идем на сайт Alternativa3D и качаем дистрибутивы. В дистрибутивах нас интересует на данный момент только библиотека swc. Ее мы распаковываем в папку с проектом и кладем в папку lib. Во FlashDevelop в дереве проекта жмем на ней правой кнопкой и выбираем Add To Library:
Добавление библиотеки в проект

Далее открываем Flash IDE и создаем проект ActionScript 3.0:
Создание fla-файла

Вначале сохраняем файл в папку с проектом, созданным во FlashDevelop. Теперь идем в свойства флешки. В поле Class вводим src.Main:
Свойства

Далее жмакаем на кнопку Edit… напротив Profile . В открывшемся окне на вкладке Flash жмем на кнопку Settings…:
Настройки

В открывшемся окне выбираем вкладку Library path, жмем на красную кнопку и указываем, где лежит наша swc:
Добавление библиотеки во Flash IDE

На этом наши подготовления закончены и начинается веселье. Открываем файл src/Main.as и меняем существующий код на следующий код (не отлыниваем и вводим ручками, вдумываясь в каждое слово, в каждую буковку и закорючечку):
package src
{
        import flash.display.Sprite;
        import flash.events.Event;

        import alternativa.engine3d.core.Camera3D;
        import alternativa.engine3d.core.MouseEvent3D;
        import alternativa.engine3d.core.Object3DContainer;
        import alternativa.engine3d.core.View;
        import alternativa.engine3d.materials.FillMaterial;
        import alternativa.engine3d.primitives.Plane;

        public class Main extends Sprite
        {
                //Контейнер - это сцена на которой находятся трехмерные объекты
                private var container:Object3DContainer = new Object3DContainer();
                //Камера - это камера
                private var camera:Camera3D = new Camera3D();
                //Без слов
                private var plane:Plane;
                //Скорость вращения плоскости
                private var rotationSpeed:Number = 0.01;

                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }

                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        initAlternativa3D();
                }

                private function initAlternativa3D():void
                {
                        //Камера производит отображение трехмерного мира
                        //на двухмерную плоскость. Вот эта плоскость и есть View. 
                        //View еще по-другому называют вьюпорт. View является DisplayObject.
                        camera.view = new View(stage.stageWidth, stage.stageHeight);
                        addChild(camera.view);
                        
                        //camera.diagram - содержит отладочную информацию
                        addChild(camera.diagram);
                        
                        //Устанавливаем позиции нашей камеры
                        camera.rotationX = -120 * Math.PI / 180;
                        camera.y = -800;
                        camera.z = 400;
                        //Добавляем камеру в контейнер
                        //Камера при рендеринге будет перерисовывать 
                        //все объекты находящиеся с ней в одном контейнере
                        container.addChild(camera);
                        
                        //Создание плоскости
                        plane = new Plane(500, 500);
                        plane.rotationX = 90 * Math.PI / 180;
                        //Добавляем событие при щелчке левой кнопкой мыши на плоскости
                        plane.addEventListener(MouseEvent3D.CLICK, onPlaneClick);
                        //При наведении на плоскость курсор будет меняться на руку
                        plane.useHandCursor = true;
                        
                        //Создаем материал. Материал - это что-то наподобии текстуры. 
                        //В нашем случае мы создаем FillMaterial. 
                        //При создании FillMaterial указываем цвет материала,
                        //прозрачность, толщину линий обводки полигона и цвет линий.
                        var material:FillMaterial = new FillMaterial(0xECF936, 1, 1, 0x000000);
                        //Задаем для плоскости материал.
                        plane.setMaterialToAllFaces(material);
                        //Добавляем в контейнер плоскость. 
                        //Теперь она будет отрисовываться во вьюпорт.
                        container.addChild(plane);
                        
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }

                private function onPlaneClick(e:MouseEvent3D):void
                {
                        //При клике мыши на плоскости мы меняем 
                        //скорость вращения на противоположную
                        rotationSpeed *= -1;
                }

                private function onEnterFrame(e:Event):void
                {
                        // Вращение примитива
                        plane.rotationZ += rotationSpeed;
                        // Перерисовка содержимого container в camera.view
                        camera.render();
                }

        }

}


Ввели? Не копировали? Ну молодцы. Теперь жмакаем F6 и радуемся своей необузданной крутости.
Неипатькакаякрутотошка

UPDATE: исходники можно скачать тут.
  • +6

Комментарии (25)

+1
Советую параллельно потыкать papervision3d очень схож с альтернативой по структуре, но зато сразу есть исходники. Очень удобно иногда заглядывать внутрь движка, так быстрее придёт понимание как это работает.
0
И вот эту штуку перечитать www.packtpub.com/papervision3d-essentials/book. В ней база по тому как работают 3д движки на примере papervision3d.
+1
Читал. Полезная книга. Одобряю :)
0
Тыкал. Заглядывал. Уже делал проекты на нем. Понимание пришло. Просто на форуме изъявили желание почитать про Alternativa, вот я и пишу про неё. Изначально хотел про Papervision написать.
0
А чо не ждём альтернативу 8?
0
Всмысле не ждем?
0
Ну просто вполне вероятно что апи очень сильно изменится и прийдётся делать новые уроки))

А так — плюсищее — оч ждал. но до выхода молхила пробывать не буду:)
+1
Обещают что не сильно. Да и нет им смысла сильно менять, количество разработчиков, пользующихся Альтернативой пока очень мало и они дорожат ими…
0
Менять там нечего. Поменяют только уровень перерисовки полигонов и соответственно мы это не почувствуем. Может быть косметические изменения еще будут. А так нет смысла менять. Все это ИМХО.
А попробывать стоит ;) времени не много займет, а +1 к интеллекту прибудет ))))) Если кому надо, могу исходники кинуть на мыло…
+1
Ок будем качать интеллект:) А исходники можно закрепить ссылкой в посте. А выложить куданить на ifolder например
0
Залил. Ссылка в конце поста.
0
Для работы нам понадобится FlashDevelop (ну и что там с ним связано). Так же понадобится Flash IDE (во всяком случае я компилил при помощи флеша).
Понадобится или FlashDevelop или Flash IDE. Вы дальше создаете и настраиваете 2 рабочих проекта. Первый во FlashDevelop и создаете его как AS3 Project (не Flash IDE Project) он сам по себе соберется и будет работать если прописан путь к Fleks SDK. А второй для Flash IDE.

Если бы вы создавали во FlashDevelop проект как Flash IDE Project — то да понадобилась бы настройка пути к флешу и запуск на исполнение во FlashDevelop запускал бы проект во флеше.
0
Почему два рабочих? Мне привычнее и удобнее код создавать во FlashDevelop, а рисовать в FlashIDE. Кодить в FlashIDE — это как ремонтировать машину без инструментов голыми руками. В данном случае просто может не видно смысла использовать FlashIDE. Да и лень было качать Flex:)))
Кстати создавал во FlashDevelop FlashIDE Project и он был пустым. Не стал заморачиваться дальше.
FlashDevelop может и так запускать во FlashIDE проект через F6.
0
Я понял. Но в итоге у вас 2:) И FlashDevelop и Flash IDE соберут проект.
Вы 2 раза делаете одну и ту же работу по настройке проектов. Уже обсуждали в блоге о разделении графики и кода.
FlashIDE Project — an empty project writen in ActionScript 3 with compiliation using the Flash IDE
AS3 Project — a project writen in ActionScript 3for the flash 9/10 player

Вы создали именно AS3 Project который работает без Flash IDE, в то же время настроили и Flash IDE :)
Мелочи конечно.
0
Если FlexSDK не установлен, то FlashDevelop соберет только через FlashIDE. Хотя в проекте действительно лучше было FlashIDE Project указать.
И кстати, уроки на какой версии Альтернативы планируется делать? В самой свежей версии например класс Geometry убрали и еще многое поменяли.
0
Данный урок делал на Alternativa 7.6.0. Особо пока на версию завязываться не буду. Если что напишу;)
0
А еще я бы в первом уроке рассказал о расположении осей координат. Все-таки здесь они не так расположены как в Flash, да и про вращение камеры неплохо бы.
0
Таких уроков по всяким движкам пруд пруди. Написали бы что-нить про трехмерную математику, решение какой-то полезной задачи, матрицах преобразования.
+2
ээээ… Написал бы ты что-нибудь про биоинженерию… Какие-нибудь уроки чтобы на дому учиться… А то про трхмерную математику в инете ито больше туторов.

Я хз — мне нравится и жду продолжения.
0
Ну может подкинете пару линок о том как построить например 3д мир с колиженами и вьюпортами? Только внятных :)
0
Где моя табличка «сарказм»…
+1
ну если вы хотите «погорячее», то вам непременно стоит почитать ryzed ;)
0
Оо спасибо!
+2
Урок готовится, только не спешно, т.к. защита диплома на носу. но продумываю цепочку, что бы был смысл в них, а не отдельные уроки, которых в этих ваших интернетах пруд пруди.
0
А за это вам человеческое спасибо.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.