Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Переделать из Alternativa в Away3D (http://www.flasher.ru/forum/showthread.php?t=176325)

Alex Lexcuk 07.03.2012 13:23

Переделать из Alternativa в Away3D
 
Есть такой код Alternativa3D_8.27.0
Код AS3:

package {
 
        import alternativa.engine3d.controllers.*;
        import alternativa.engine3d.core.*;
        import alternativa.engine3d.lights.*;
        import alternativa.engine3d.materials.*;
        import alternativa.engine3d.primitives.*;
        import alternativa.engine3d.resources.*;
        import alternativa.engine3d.shadows.*;
 
        import flash.display.*;
        import flash.events.*;
 
        /**
        * Alternativa3D "Hello world!" application.
        * Создание простейшего трёхмерного приложения.
        */

        public class HelloAlternativa3D extends Sprite {
                private var rootContainer:Object3D = new Object3D();
                private var camera:Camera3D;
                private var stage3D:Stage3D;
                private var box:Box;
 
                public function HelloAlternativa3D() {
                        // Ресурсы
 
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
 
                        stage3D = stage.stage3Ds[0];
                        stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
                        stage3D.requestContext3D();
                }
 
                private function onContextCreate(e:Event):void {
                        //ресурсы
                        var grass_diffuse:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFF0000));
 
                        var grass_normal:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0x7F7FFF));
 
                        var box_normal:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFFFFFF));
 
                        grass_diffuse.upload(stage3D.context3D);
                        grass_normal.upload(stage3D.context3D);
                        box_normal.upload(stage3D.context3D);
 
                        // Camera and view
                        // Создание камеры и вьюпорта
                        camera = new Camera3D(0.1, 10000);
                        camera.view = new View(stage.stageWidth, stage.stageHeight, false, 0, 0, 4);
                        addChild(camera.view);
                        addChild(camera.diagram);
 
                        // Initial position
                        // Установка положения камеры
                        camera.rotationX = -120*Math.PI/180;
                        camera.y = -800;
                        camera.z = 400;
                        rootContainer.addChild(camera);
 
                        // Light sources
                        // Источники света
                        var ambientLight:AmbientLight = new AmbientLight(0x333333);
                        ambientLight.intensity = 3;
                        rootContainer.addChild(ambientLight);
 
                        var directionalLight:DirectionalLight = new DirectionalLight(0xFFFF99);
 
                        directionalLight.z = 20000;
                        directionalLight.y = -20000;
                        directionalLight.x = 20000;
                        directionalLight.intensity = 1;
 
                        directionalLight.lookAt(2000, 0, 0);
                        //rootContainer.addChild(directionalLight);
 
                        // Primitive box
                        // Создание примитива
                        box = new Box(250, 250, 250, 1, 1, 1, true);
                        box.z = 200;
                        var material:StandardMaterial = new StandardMaterial(box_normal, box_normal);
                        box.setMaterialToAllSurfaces(material);
                        rootContainer.addChild(box);
 
 
                        var plane:Plane = new Plane(1000, 1000);
                        var planeMaterial:StandardMaterial = new StandardMaterial(grass_diffuse, grass_normal);
                        plane.setMaterialToAllSurfaces(planeMaterial);
 
                        rootContainer.addChild(plane);
 
 
                        // Shadow
                        // Тень
                        var shadow:DirectionalLightShadow = new DirectionalLightShadow(1000, 1000, -500, 500, 512, 2);
                        shadow.biasMultiplier = 0.97;
                        shadow.addCaster(plane);
                        shadow.addCaster(box);
                        directionalLight.shadow = shadow;
 
 
                        for each (var resource:Resource in rootContainer.getResources(true)) {
                                resource.upload(stage3D.context3D);
                        }
 
 
                        // Listeners
                        // Подписка на события
                        stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        // Width and height of view
                        // Установка ширины и высоты вьюпорта
                        camera.view.width = stage.stageWidth;
                        camera.view.height = stage.stageHeight;
 
                        // Rotation
                        // Вращение примитива
                        box.rotationZ -= 0.01;
 
                        // Render
                        // Отрисовка
                        camera.render(stage3D);
                }
 
        }
}

Мне хочется собрать простейший пример с тенью. Вот если раскоментировать строку
Код AS3:

//rootContainer.addChild(directionalLight);

то тень появляется, но куб становится чёрным
Как этот простейший пример перевести на away (away3d-core-fp11_4_0_0_beta.swc)
Нужно что-бы была тень от куба на план. В авэй сильно сложные и тяжёлые примеры.

redefy 07.03.2012 14:00

Это очень абстрактный вопрос: как...
Нужно изучить инициализацию движка, работу с геометрией, примитивами, источниками света, материалами...

Можете посмотреть эту статью, там про самые основы Away3D 4.0:
http://redefy.net/2012/03/03/away3d40-basics/

Alex Lexcuk 07.03.2012 15:12

redefy, статью уже читал, но что-то не получается
Код AS3:

package {
 
        import away3d.cameras.*;
        import away3d.containers.*;
        import away3d.controllers.*;
        import away3d.debug.*;
        import away3d.entities.*;
        import away3d.extrusions.*;
        import away3d.lights.*;
        import away3d.materials.*;
        import away3d.materials.lightpickers.*;
        import away3d.materials.methods.*;
        import away3d.primitives.*;
        import away3d.textures.*;
 
        //import com.bit101.components.Label;
 
        import flash.display.*;
        import flash.events.*;
        import flash.filters.*;
        import flash.geom.*;
        import flash.net.*;
        import flash.ui.*;
        import flash.utils.*;
 
        import flash.display.*;
        import flash.events.*;
 
        /**
        * Alternativa3D "Hello world!" application.
        * Создание простейшего трёхмерного приложения.
        */

        public class HelloAlternativa3DtoAway3d extends Sprite {
                //private var rootContainer:Object3D = new Object3D();//Alternativa
 
                private var rootContainer:ObjectContainer3D = new ObjectContainer3D();//Away3d
 
                private var camera:Camera3D;//Away3d Alternativa
 
                private var stage3D:Stage3D;//Alternativa
 
                //private var box:Box;//Alternativa
 
                private var box:Mesh;//Away3d
 
                private var view:View3D//Away3d
 
                public function HelloAlternativa3DtoAway3d() {
                        // Ресурсы
 
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
 
                        stage3D = stage.stage3Ds[0];
                        stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
                        stage3D.requestContext3D();
                }
 
                private function onContextCreate(e:Event):void {
                        //ресурсы
                        //нач альтернатива
                        //var grass_diffuse:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFF0000));
                        //var grass_normal:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0x7F7FFF));
                        //var box_normal:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFFFFFF));
                        //кон альтернатива
 
                        //нач авей
                        var grass_diffuse:BitmapTexture = new BitmapTexture(new BitmapData(2, 2, false, 0xFF0000));
                        var grass_normal:BitmapTexture = new BitmapTexture(new BitmapData(2, 2, false, 0x7F7FFF));
                        var box_normal:BitmapTexture = new BitmapTexture(new BitmapData(2, 2, false, 0xFFFFFF));
                        //кон авей
 
 
 
                        //нач альтернатива
                        //grass_diffuse.upload(stage3D.context3D);
                        //grass_normal.upload(stage3D.context3D);
                        //box_normal.upload(stage3D.context3D);
                        //кон альтернатива
 
                        //нач авей
                        //хто-то знает
                        //кон авей
 
                        // Camera and view
                        // Создание камеры и вьюпорта
 
                        //нач алт
                        //camera = new Camera3D(0.1, 10000);
                        //camera.view = new View(stage.stageWidth, stage.stageHeight, false, 0, 0, 4);
                        //addChild(camera.view);
                        //addChild(camera.diagram);
                        //кон алт
 
                        //нач аве
                        var scene:Scene3D = new Scene3D();
                        //setup camera for optimal shadow rendering
                        camera = new Camera3D();
                        camera.lens.far = 2100;
                        view = new View3D();
                        view.scene = scene;
                        view.camera = camera;
                        //setup controller to be used on the camera
                        //cameraController = new HoverController(camera, null, 45, 20, 1000, 10);
                        //setup parser to be used on loader3D
                        //Parsers.enableAllBundled();
                        //view.addSourceURL("srcview/index.html");
                        addChild(view);
                        //кон аве
 
 
                        // Initial position
                        // Установка положения камеры
                        //нач аль
                        //camera.rotationX = -120*Math.PI/180;
                        //camera.y = -800;
                        //camera.z = 400;
                        //rootContainer.addChild(camera);
                        //кон аль
 
                        //нач аве
                        camera.rotationX = -120*Math.PI/180;
                        camera.z = -800;
                        camera.y = 400;
                        rootContainer.addChild(camera);
                        //кон аве
 
                        // Light sources
                        // Источники света
                        /*
                        var ambientLight:AmbientLight = new AmbientLight(0x333333);
                        ambientLight.intensity = 3;
                        rootContainer.addChild(ambientLight);
                        */

 
                        //нач аль
                        //var directionalLight:DirectionalLight = new DirectionalLight(0xFFFF99);
                        //directionalLight.z = 20000;
                        //directionalLight.y = -20000;
                        //directionalLight.x = 20000;
                        //directionalLight.intensity = 1;
                        //directionalLight.lookAt(2000, 0, 0);
                        //кон аль
 
                        //нач аве
                        var directionalLight:DirectionalLight = new DirectionalLight(-1, -1, 1);
                        directionalLight.y = 20000;
                        directionalLight.z = -20000;
                        directionalLight.x = 20000;
                        //directionalLight.intensity = 1;//кто-то знает
                        directionalLight.lookAt(new Vector3D(2000, 0, 0));
                        //кон аве
 
                        //rootContainer.addChild(directionalLight);//строка - тень появляется, но куб становится чёрным
 
                        // Primitive box
                        // Создание примитива
                        //нач альт
                        //box = new Box(250, 250, 250, 1, 1, 1, true);
                        //box.z = 200;
                        //var material:StandardMaterial = new StandardMaterial(box_normal, box_normal);
                        ///box.setMaterialToAllSurfaces(material);
                        //rootContainer.addChild(box);
 
 
                        //var plane:Plane = new Plane(1000, 1000);
                        //var planeMaterial:StandardMaterial = new StandardMaterial(grass_diffuse, grass_normal);
                        //plane.setMaterialToAllSurfaces(planeMaterial);
 
                        //rootContainer.addChild(plane);
                        //кон альт
 
                        //нач аве
                        var boxG:CubeGeometry = new CubeGeometry(250, 250, 250, 1, 1, 1);
                        box = new Mesh(boxG);
 
                        box.y = 200;
                        var material:TextureMaterial = new TextureMaterial(box_normal);// , box_normal);
                        box.material = material;
                        rootContainer.addChild(box);
 
 
                        var plane:Mesh = new Mesh(new PlaneGeometry(1000, 1000));
                        var planeMaterial:TextureMaterial = new TextureMaterial(grass_diffuse);// , grass_normal);
                        plane.material = planeMaterial;
 
                        rootContainer.addChild(plane);
                        //кон аве
 
                        // Shadow
                        // Тень
                        //нач аль
                        //var shadow:DirectionalLightShadow = new DirectionalLightShadow(1000, 1000, -500, 500, 512, 2);
                        //shadow.biasMultiplier = 0.97;
                        //shadow.addCaster(plane);
                        //shadow.addCaster(box);
                        //directionalLight.shadow = shadow;
                        //кон аль
 
                        //нач аве
                        //кто-то знает
                        //кон аве
 
                        //нач аль
                        //for each (var resource:Resource in rootContainer.getResources(true)) {
                        //        resource.upload(stage3D.context3D);
                        //}
                        //кон аль
 
                        //нач аве
                        //кто-то знает
                        //кон аве
 
                        // Listeners
                        // Подписка на события
                        stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);//Away3d Alternativa
                }
 
                private function onEnterFrame(e:Event):void {
                        //нач аль
                        // Width and height of view
                        // Установка ширины и высоты вьюпорта
                        //camera.view.width = stage.stageWidth;
                        //camera.view.height = stage.stageHeight;
                        // Rotation
                        // Вращение примитива
                        //box.rotationZ -= 0.01;
                        // Render
                        // Отрисовка
                        //camera.render(stage3D);
                        //кон аль
 
                        //нач авей
                        box.rotationY -= 0.01;
                        view.render();
                        //кон авей
                }
 
        }
}

Работа выполнена на 90%
Перевод на авей +
Куб +
План +
Камера +
Нифига на видно -
Теней от куба нет -

redefy 07.03.2012 16:18

1) Запрашивать контекст вручную не надо.
2) Контейнер не добавлен на сцену.
3) Чтоб добавить тени, нужно указать какие источники света будет использоваться для расчета теней, какой метод будет использоваться для расчета теней.
Код AS3:

var lightPicker:StaticLightPicker = new StaticLightPicker([sunLight, skyLight]);
var filteredShadowMapMethod:FilteredShadowMapMethod = new FilteredShadowMapMethod(sunLight);
var material:TextureMaterial = new TextureMaterial(new BitmapTexture((new Texture01()).bitmapData), true, true, true);
material.lightPicker = lightPicker;
material.shadowMethod = filteredShadowMapMethod;
material.ambient = 0.5;


Alex Lexcuk 07.03.2012 19:55

redefy, круто что-то появилось на экране
Код AS3:

package {
 
        import away3d.cameras.*;import away3d.containers.*;import away3d.controllers.*;import away3d.debug.*;
        import away3d.entities.*;import away3d.extrusions.*;import away3d.lights.*;import away3d.materials.*;
        import away3d.materials.lightpickers.*;import away3d.materials.methods.*;import away3d.primitives.*;
        import away3d.textures.*;
        //import com.bit101.components.Label;
 
        import flash.display.*;import flash.events.*;import flash.filters.*;import flash.geom.*;
        import flash.net.*;import flash.ui.*;import flash.utils.*;import flash.events.*;
 
        /**
        * HelloAlternativa3DtoAway3d "Hello world!" application.
        * Создание простейшего трёхмерного приложения.
        */

        public class HelloAlternativa3DtoAway3d extends Sprite {
                private var rootContainer:ObjectContainer3D = new ObjectContainer3D();
                private var camera:Camera3D;
                private var stage3D:Stage3D;
                private var box:Mesh;
                private var view:View3D;
 
                public function HelloAlternativa3DtoAway3d() {
                        // Ресурсы
 
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
                        stage3D = stage.stage3Ds[0];
                        stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
                        stage3D.requestContext3D();
                }
 
                private function onContextCreate(e:Event):void {
                        var scene:Scene3D = new Scene3D();
                        //setup camera for optimal shadow rendering
                        camera = new Camera3D();
                        camera.lens.far = 2100;
                        view = new View3D();
                        view.scene = scene;
                        view.camera = camera;
                        addChild(view);
 
                        camera.rotationX = -120*Math.PI/180;
                        camera.z = -800;
                        camera.y = 400;
                        rootContainer.addChild(camera);
 
                        var directionalLight:DirectionalLight = new DirectionalLight(-1, -1, 1);
                        directionalLight.y = 20000;
                        directionalLight.z = -20000;
                        directionalLight.x = 20000;
                        //directionalLight.intensity = 1;//кто-то знает
                        directionalLight.lookAt(new Vector3D(2000, 0, 0));
 
                        //нач свет и тени
                        var sunLight:DirectionalLight = directionalLight;
                        var lightPicker:StaticLightPicker = new StaticLightPicker([sunLight]);//[sunLight, skyLight]);
                        var filteredShadowMapMethod:FilteredShadowMapMethod = new FilteredShadowMapMethod(sunLight);
                        var material:TextureMaterial = new TextureMaterial(new BitmapTexture(new BitmapData(2, 2, false, 0xFF0000)));// , true));
                        material.lightPicker = lightPicker;
                        material.shadowMethod = filteredShadowMapMethod;
                        material.ambient = 0.5;
                        //кон свет и тени
 
                        var boxG:CubeGeometry = new CubeGeometry(250, 250, 250, 1, 1, 1);
                        box = new Mesh(boxG);
                        box.y = 200;
                        box.material = material;
 
                        rootContainer.addChild(box);
                        var plane:Mesh = new Mesh(new PlaneGeometry(1000, 1000));
                        plane.material = material;
 
                        rootContainer.addChild(plane);
                        scene.addChild(rootContainer);
 
                        stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);//Away3d Alternativa
                }
 
                private function onEnterFrame(e:Event):void {
                        box.rotationY -= 1; //в градусах
                        view.render();
                }
 
        }
}

http://murmadillo.tut.su/m/ne-cub.jpg

Не понятно, что за фигура, явно не куб, но крутится, теней по прежнему нет, по поводу, что не надо запрашивать контекст - не понял, как сделать "не_надо".

redefy 07.03.2012 20:25

Вот так:
Код AS3:

package test {
        import away3d.cameras.*;
        import away3d.containers.*;
        import away3d.entities.*;
        import away3d.lights.*;
        import away3d.materials.*;
        import away3d.materials.lightpickers.*;
        import away3d.materials.methods.*;
        import away3d.primitives.*;
        import away3d.textures.*;
 
        import flash.display.*;
        import flash.events.*;
 
        /**
        * HelloAlternativa3DtoAway3d "Hello world!" application.
        * Создание простейшего трёхмерного приложения.
        */

        public class HelloAlternativa3DtoAway3d extends Sprite {
                private var container:ObjectContainer3D;
                private var box:Mesh;
                private var plane:Mesh;
                private var view:View3D;
                private var controller:SimpleObjectController;
 
                public function HelloAlternativa3DtoAway3d() {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
                        init();
                }
 
                private function init():void {
                        view = new View3D();
                        view.camera.lens.far = 10000;
                        view.camera.moveTo( -170, 1361, -1221);
                        view.camera.rotateTo(45, 2, 0);
                        addChild(view);
 
                        container = new ObjectContainer3D();
                        view.scene.addChild(container);
 
                        var sunLight:DirectionalLight = new DirectionalLight(-1, -0.4, 1);
                        sunLight.color = 0xFFFFFF;
                        sunLight.castsShadows = true;
                        sunLight.ambient = 1;
                        sunLight.diffuse = 1;
                        sunLight.specular = 1;
                        container.addChild(sunLight);
 
                        var lightPicker:StaticLightPicker = new StaticLightPicker([sunLight]);
                        var filteredShadowMapMethod:SoftShadowMapMethod = new SoftShadowMapMethod(sunLight);
                        filteredShadowMapMethod.epsilon = 0.005;
 
                        var material:TextureMaterial = new TextureMaterial(new BitmapTexture(new BitmapData(2, 2, false, 0xFF0000)), true, true);
                        material.lightPicker = lightPicker;
                        material.shadowMethod = filteredShadowMapMethod;
                        material.ambient = 0.5;
                        container.addChild(box = new Mesh(new CubeGeometry(250, 250, 250, 1, 1, 1), material));
 
                        material = new TextureMaterial(new BitmapTexture(new BitmapData(2, 2, false, 0x00FF00)), true, true);
                        material.lightPicker = lightPicker;
                        material.shadowMethod = filteredShadowMapMethod;
                        material.ambient = 0.5;
                        container.addChild(plane = new Mesh(new PlaneGeometry(3000, 3000), material)).y = -125;
 
                        stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        box.rotationY -= 1; //в градусах
                        view.render();
                }
        }
}


Alex Lexcuk 07.03.2012 20:35

redefy СУПЕР!!! тень афигенная и свет на кубике отлично смотрится. Спасибо.


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

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