Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > PeTa4eK

Оценить эту запись

Flare3D 2.0 и первый эксперимент

Запись от PeTa4eK размещена 23.10.2011 в 11:08

Всем привет. Сегодня расскажу про такой простой 3D движок как Flare3D
Все мы знаем что после релиза Flash Player 11 появились гигантские возможности для создания красивых 3D игр.

После некоторого поиска на эту тему нашел несколько вариантов
Alternativa3D 8 - http://alternativaplatform.com/ru/
Minco - http://hub.aerys.in/minko
Away3D - http://away3d.com/
proscenium - http://labs.adobe.com/downloads/proscenium.html
Flare3D - http://www.flare3d.com/

Большинство из них все еще в бета тесте, так что судить о них еще рано, но из всех движков, мой выбор пал на Flare3D. Почему? Просто он показался мне проще всех и довольно богатым функциями(за исключением того, что пока нет теней, но в скором времени должны добавить)

Собственно выбрали мы Flare3D, что дальше?
1. Скачиваем движок - http://www.flare3d.com/signup20 В архиве будут лежать библиотека, примеры, плагин для 3dsMax(проверено в 3dsMax2012 - работает) для экспорта моделек.
2. Настраиваем проект во FlashDevelop(последней версии) почти идиентично как было сказано в этом посте - Proscenium во FlashDevelop , только в файле конфигов вместо ссылок на либы Proscenium,задаем одну ссылку на либу Flare3D_2043b.swc
3. Готово, создаем проект с подключенной либой и далее приступаем к первому эксперименту.

Заходим в класс Main.as

Объявляем переменные
Код AS1/AS2:
private var scene:Scene3D;
private var sphere:Sphere;
private var plane:Plane;
private var light:Light3D;
Дальше идем в метод инициализации и инициализируем все объекты
Код AS3:
scene = new Scene3D(this); // Создаем сцену
 
scene.camera = new Camera3D(); // Создаем камеру которой мы видим
scene.camera.setPosition(0, 15, -20);
scene.camera.lookAt(0, 0, 0);
scene.lights.maxPointLights = 1;
 
light = new Light3D(); // Создаем свет
light.setParams(0xFFFFFF, 0, 40, 2);
light.setPosition( 0, 15, - 10);
light.parent = scene;
 
sphere = new Sphere("sphere"); // Создаем шар
sphere.setPosition(0, 5, 0);
scene.addChild(sphere);
 
plane = new Plane("plane", 40,40, 4, null, "+xz"); // Создаем плоскость повернутую по осям x и z
scene.addChild(plane);
Весь код теперь выглядит так
Код AS3:
package {
    import flare.basic.Scene3D;
    import flare.core.Camera3D;
    import flare.core.Light3D;
    import flare.primitives.Plane;
    import flare.primitives.Sphere;
    import flash.display.Sprite;
    import flash.events.Event;
 
    public class Main extends Sprite {
 
        private var scene:Scene3D;
        private var sphere:Sphere;
        private var plane:Plane;
        private var light:Light3D;
 
        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
 
            scene = new Scene3D(this); // Создаем сцену
 
            scene.camera = new Camera3D(); // Создаем камеру которой мы видим
            scene.camera.setPosition(0, 15, -20);
            scene.camera.lookAt(0, 0, 0);
            scene.lights.maxPointLights = 1;
 
            light = new Light3D(); // Создаем свет
            light.setParams(0xFFFFFF, 0, 40, 2);
            light.setPosition( 0, 15, - 10);
            light.parent = scene;
 
            sphere = new Sphere("sphere"); // Создаем шар
            sphere.setPosition(0, 5, 0);
            scene.addChild(sphere);
 
            plane = new Plane("plane", 40,40, 4, null, "+xz"); // Создаем плоскость повернутую по осям x и z
            scene.addChild(plane);
        }
    }
}
Компилируем - вауля! Шар лежит на плоскости и освещается источником света!

Теперь добавим немного интерактивности

Создаем слушатель для обработки обновлений игры
Код AS3:
scene.addEventListener(Scene3D.UPDATE_EVENT, update);
Обьявляем метод update
Код AS3:
private function update(e:Event):void {
       light.translateX(Math.cos(getTimer() / 250));
       light.translateZ(Math.sin(getTimer() / 250));
}
Метод getTimer() если кто не знал находится тут -
Код AS3:
flash.utils.getTimer;
Компилируем - теперь свет двигается!

На этом бы можно было и закончить, но нет!
Совсем внезапно я захотел рассказать о добавлении NormalMap эффекта сфере и плоскости.

Гуглим, NormalMap текстуру
Я выбрал - http://zarria.net/nrmphoto/crossnrm.jpg для шара и http://zarria.net/heightmap/nrm2.jpg для плоскости.

Сохраняем эти картинки и кидаем их в проект, а именно в папку res(если её нет, создайте)

Теперь embed'им наши картинки(есть алтернатива загружать все извне, но нам это щас не нужно, а если нужно, ищите в примерах Flare3D)
Код AS3:
[Embed(source = "../res/crossnrm.jpg")]
private var sphere_texture_class:Class;
 
[Embed(source = "../res/nrm2.jpg")]
private var plane_texture_class:Class;
И теперь после инициализации всех объектов инициализируем материалы
Код AS3:
var planeNormalMapTexture:Texture3D = new Texture3D((new plane_texture_class() as BitmapAsset).bitmapData);
var sphereNormalMapTexture:Texture3D = new Texture3D((new sphere_texture_class() as BitmapAsset).bitmapData);
 
var planeShader:Shader3D = new Shader3D("plane_mat");
planeShader.filters.push(new ColorFilter(0x555555));
planeShader.filters.push(new SpecularFilter());
planeShader.filters.push(new NormalMapFilter(planeNormalMapTexture));
planeShader.build();
plane.setMaterial(planeShader);
 
var sphereShader:Shader3D = new Shader3D("sphere_mat");
sphereShader.filters.push(new ColorFilter(0x555555));
sphereShader.filters.push(new SpecularFilter());
sphereShader.filters.push(new NormalMapFilter(sphereNormalMapTexture));
sphereShader.build();
sphere.setMaterial(sphereShader);
Ну и вот финальный код
Код AS3:
package {
    import flare.basic.Scene3D;
    import flare.core.Camera3D;
    import flare.core.Light3D;
    import flare.core.Texture3D;
    import flare.materials.filters.ColorFilter;
    import flare.materials.filters.NormalMapFilter;
    import flare.materials.filters.SpecularFilter;
    import flare.materials.Shader3D;
    import flare.primitives.Plane;
    import flare.primitives.Sphere;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.utils.getTimer;
    import mx.core.BitmapAsset;
 
    public class Main extends Sprite {
 
        [Embed(source = "../res/crossnrm.jpg")]
        private var sphere_texture_class:Class;
 
        [Embed(source = "../res/nrm2.jpg")]
        private var plane_texture_class:Class;
 
        private var scene:Scene3D;
        private var sphere:Sphere;
        private var plane:Plane;
        private var light:Light3D;
 
        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
 
            scene = new Scene3D(this); // Создаем сцену
 
            scene.camera = new Camera3D(); // Создаем камеру которой мы видим
            scene.camera.setPosition(0, 15, -20);
            scene.camera.lookAt(0, 0, 0);
            scene.lights.maxPointLights = 1;
 
            light = new Light3D(); // Создаем свет
            light.setParams(0xFFFFFF, 0, 40, 2);
            light.setPosition( 0, 15, - 10);
            light.parent = scene;
 
            sphere = new Sphere("sphere"); // Создаем шар
            sphere.setPosition(0, 5, 0);
            scene.addChild(sphere);
 
            plane = new Plane("plane", 40,40, 4, null, "+xz"); // Создаем плоскость повернутую по осям x и z
            scene.addChild(plane);
 
            var planeNormalMapTexture:Texture3D = new Texture3D((new plane_texture_class() as BitmapAsset).bitmapData);
            var sphereNormalMapTexture:Texture3D = new Texture3D((new sphere_texture_class() as BitmapAsset).bitmapData);
 
            var planeShader:Shader3D = new Shader3D("plane_mat");
            planeShader.filters.push(new ColorFilter(0x555555));
            planeShader.filters.push(new SpecularFilter());
            planeShader.filters.push(new NormalMapFilter(planeNormalMapTexture));
            planeShader.build();
            plane.setMaterial(planeShader);
 
            var sphereShader:Shader3D = new Shader3D("sphere_mat");
            sphereShader.filters.push(new ColorFilter(0x555555));
            sphereShader.filters.push(new SpecularFilter());
            sphereShader.filters.push(new NormalMapFilter(sphereNormalMapTexture));
            sphereShader.build();
            sphere.setMaterial(sphereShader);
 
            scene.addEventListener(Scene3D.UPDATE_EVENT, update);
        }
 
        private function update(e:Event):void {
            light.translateX(Math.cos(getTimer() / 250));
            light.translateZ(Math.sin(getTimer() / 250));
        }
    }
}
Если все сделано правильно, будет такой результат
Всего комментариев 8

Комментарии

Старый 25.10.2011 21:16 dimarik вне форума
dimarik
 
Аватар для dimarik
Результат "впечатляет".
Старый 27.10.2011 11:40 Art_133 вне форума
Art_133
 
Аватар для Art_133
Спасибо автору.
Старый 27.10.2011 14:39 PeTa4eK вне форума
PeTa4eK
 
Аватар для PeTa4eK
dimarik, цель поста была не в том чтобы сделать что-то убер красивое, основы, ну и продемонстрировать normal mapping, немного они канешь кривые попались(но суть была в том как легко их добавить), но если постараться можно добиться намного более красивых результатов
Старый 27.10.2011 14:49 crazyone вне форума
crazyone
 
Аватар для crazyone
У тебя картинка умерла. По http://i.hebimage.com/1011/4ea3af14d9920.jpg выдает 403-ю
Перезалей куда-нибудь.
Старый 22.11.2011 23:34 parovozeg вне форума
parovozeg
 
Аватар для parovozeg
Flare3D довольно слабый движок,и форум у них убогий(точнее его подобие).Аlternativa хоть немного геморройная, но гораздо интересней, и, что для многих важно, почти всё на русском, т.к. разработчики наши. Я сейчас занимаюсь созданием интерактивной модели станка и попробовал и то, и то(и ещё кучу всякой ереси).Во Flare3D большие проблемы с прорисовкой 3д моделей из макса(особенно если они вплотную друг к другу). Не знаю почему так, но заказчика это никак не устроило.
Старый 21.09.2012 22:52 PeTa4eK вне форума
PeTa4eK
 
Аватар для PeTa4eK
parovozeg, согласен, я в этом уже убедился) Попробовал Альтернативу, разобравшись оказалось ничуть не сложнее, а качество напорядок выше(чего только стоят динамичные тени). Могу запилить сатью и по ней.
Старый 23.09.2012 01:13 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
PeTa4eK, было бы интересно.
Старый 21.04.2013 14:52 men вне форума
men
С кодом все понятно, движок стал на голову выше, подкиньте ссылку где можно скачать swc или библиотеку - mx.*.
 
Последние записи от PeTa4eK

 


Часовой пояс GMT +4, время: 10:15.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.