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
Объявляем переменные
private var scene:Scene3D; private var sphere:Sphere; private var plane:Plane; private var light:Light3D;
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);
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); } } }
Теперь добавим немного интерактивности
Создаем слушатель для обработки обновлений игры
Обьявляем метод update
private function update(e:Event):void { light.translateX(Math.cos(getTimer() / 250)); light.translateZ(Math.sin(getTimer() / 250)); }
На этом бы можно было и закончить, но нет!
Совсем внезапно я захотел рассказать о добавлении NormalMap эффекта сфере и плоскости.
Гуглим, NormalMap текстуру
Я выбрал - http://zarria.net/nrmphoto/crossnrm.jpg для шара и http://zarria.net/heightmap/nrm2.jpg для плоскости.
Сохраняем эти картинки и кидаем их в проект, а именно в папку res(если её нет, создайте)
Теперь embed'им наши картинки(есть алтернатива загружать все извне, но нам это щас не нужно, а если нужно, ищите в примерах Flare3D)
[Embed(source = "../res/crossnrm.jpg")] private var sphere_texture_class:Class; [Embed(source = "../res/nrm2.jpg")] private var plane_texture_class:Class;
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);
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 | |
Результат "впечатляет".
|
27.10.2011 11:40 | |
Спасибо автору.
|
27.10.2011 14:49 | |
У тебя картинка умерла. По http://i.hebimage.com/1011/4ea3af14d9920.jpg выдает 403-ю
Перезалей куда-нибудь. |
23.09.2012 01:13 | |
PeTa4eK, было бы интересно.
|
21.04.2013 14:52 | |
С кодом все понятно, движок стал на голову выше, подкиньте ссылку где можно скачать swc или библиотеку - mx.*.
|
Последние записи от PeTa4eK
- Flare3D 2.0 и первый эксперимент (23.10.2011)
- Поворот без косяков! (13.12.2010)