[Actionscript][Away3D]三维图片展示Demo

这个Demo是为了熟悉Away3d和TweenLite而写的,是一个三维图片展示的雏形,不排除继续写一个完整三维相册的可能。

要掌握动画展示的效果,关键在于理解Away3D里物体的运动和摄像头运动。

另外写了一个很简单的Loader外壳,用来载入外部SWF。

演示:
http://www.kxbd.com/mylab_as/090220TweenAnd3D/

动画文档类:
程序代码 程序代码

package  {
    /**
     * author: Aken li (http://www.kxbd.com)
     * date: 2009-03-02
     * dependencies: Away3d 2.3, TweenLite 10
     */
    import away3d.cameras.*;
    import away3d.containers.*;
    import away3d.core.base.*;
    import away3d.core.math.*;
    import away3d.core.utils.*;
    import away3d.events.MouseEvent3D;
    import away3d.primitives.*;
    import away3d.materials.*;
    import away3d.core.render.Renderer;
    
    import gs.TweenLite;
    import gs.easing.*
    import gs.OverwriteManager;
    
    import flash.display.*;
    import flash.events.*;
    
    public class Num08 extends Sprite {
        private var view:View3D;
        private var objArr:Array = [];
        private var objNum:uint = 4;
        private var objContainer:ObjectContainer3D;
        private var cam:Camera3D;
        private var moveContainer:Boolean = true;
        private var isLarge:Boolean = false;
        private var isLookAt:uint;
        private var isActive:Boolean = false;
        
        public function Num08() {
            init();
        }
        
        private function init() {
            OverwriteManager.init(OverwriteManager.AUTO);
                
            view = new View3D( { x:400, y:300 } );
            addChild(view);
            view.renderer = Renderer.INTERSECTING_OBJECTS;
            
            cam = new Camera3D( { x:0, y:0, z:-1000 } );
            cam.lookAt(new Number3D(0, 0, 0));
            view.camera = cam;
            
            objContainer = new ObjectContainer3D();
            for (var i = 0; i < objNum; i++) {
                var obj:Plane = makePlane(i);
                obj.useHandCursor = true;
                objArr.push(obj);
                objContainer.addChild(obj);
            }
            view.scene.addChild(objContainer);

            for (i = 0; i < objNum; i++) {
                var _mobj = objArr[i];
                TweenLite.to(_mobj, (5 - i) * 0.5,
                              { y:150 * i - 225, delay:i * 0.5, ease:Elastic.easeOut,
                                onComplete:comFunc, onCompleteParams:[i, _mobj] } );
            }
            TweenLite.to(objContainer, 3, { rotationX:360, rotationY:360, rotationZ:360, onComplete:addOverFx } );
            
            addEventListener(Event.ENTER_FRAME, render);
            addEventListener(Event.ADDED_TO_STAGE,function(){
                stage.addEventListener(MouseEvent.CLICK, clickScene);
            });
        }
        
        private function comFunc(i:uint, mObj:Plane) {
            moveContainer = false;
            mObj.z = 0
            mObj.addOnMouseDown(clickObj);
        }
        
        private function addOverFx() {
            for (var i = 0; i < objNum; i++) {
                objArr[i].addOnMouseOver(moveUpObj);
                objArr[i].addOnMouseOut(moveDownObj);
            }
        }
        
        private function removeOverFx() {
            for (var i = 0; i < objNum; i++) {
                objArr[i].removeOnMouseOver(moveUpObj);
                objArr[i].removeOnMouseOut(moveDownObj);
            }
        }
        
        private function moveUpObj(e:MouseEvent3D) {
            isActive = true;
            TweenLite.to(e.object, 0.5 , { z: -50 } );
        }
        
        private function moveDownObj(e:MouseEvent3D) {
            TweenLite.to(e.object, 0.5 , { z: 0 } );
        }
        
        private function clickObj(e:MouseEvent3D) {
            var _obj = e.object;
            var _clicked = objArr.indexOf(_obj);
            if(!isLarge){
                removeOverFx();
                enlargePic(_obj);
                isLarge = true;
            }else if(_clicked==isLookAt) {
                addOverFx();
                diminishPic(_obj);
                isLarge = false;
            }else {
                diminishPic(objArr[isLookAt]);
                enlargePic(_obj);
                isLarge = true;
            }
        }
        
        private function clickScene(e:MouseEvent) {
            if(e.target==stage&&isLarge){
                addOverFx();
                diminishPic(objArr[isLookAt]);
                isLarge = false;
            }
        }
        
        private function enlargePic(obj) {
            isLookAt = objArr.indexOf(obj);
            TweenLite.to(objContainer, 1, {  z: -650 } );
            TweenLite.to(cam, 1, { y:obj.y } );
            TweenLite.to(obj, 1, { z: -50 } );
            obj.material = new BitmapMaterial(Cast.bitmap("imgB0"+(isLookAt+1)));
        }
        
        private function diminishPic(obj) {
            TweenLite.to(objContainer, 1, { z: 0 } );
            TweenLite.to(cam, 1, { y:0 } );
            TweenLite.to(obj, 1, { z:0 } );
            obj.material = new BitmapMaterial(Cast.bitmap("img0"+(isLookAt+1)));
        }
        
        private function render(e:Event) {
            view.render();
            if(isActive){
                objContainer.rotationX = -view.mouseY * 0.1;
                objContainer.rotationY = view.mouseX * 0.1;
            }
        }
        
        private function makePlane(i:uint):Plane {
            var obj = new Plane( { material:"blue#white", width: 200, height: 150, segmentsW:6, segmentsH: 4 } );
            obj.bothsides = true;
            obj.material = new BitmapMaterial(Cast.bitmap("img0"+(i+1)));
            obj.back = new BitmapMaterial(Cast.bitmap("img05"));
            obj.yUp = false;
            obj.x = 0;
            obj.y = 650;
            obj.z = i;
            obj.name = i + 1;
            return obj;
        }
        
    }
    
}


Loader文档类:
程序代码 程序代码

package {
    /**
     * author: Aken li (http://www.kxbd.com)
     * date: 2009-03-03
     */
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLRequest;
    import flash.text.*;
    
    public class loader extends Sprite {
        private var loadingText:TextField;
        private var loadingUrl:String = 'Num08.swf';
        private var myLoader:Loader;
        
        public function loader() {
            makeText();
            makeLoader();
        }
        
        private function makeLoader() {
            myLoader = new Loader();
            myLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadingProcess);
            myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
            myLoader.load(new URLRequest(loadingUrl));
            addChild(myLoader);
        }
        
        private function loadingProcess(e:ProgressEvent) {
            var loadedPercent = Math.round(100 * e.bytesLoaded / e.bytesTotal);
            loadingText.text = 'loaded ' + loadedPercent + '%';
        }
        
        private function loaded(e:Event) {
            removeChild(loadingText);
            loadingText = null;
            myLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, loadingProcess);
            myLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loaded);
        }
        
        private function makeText() {
            var textFormat:TextFormat = new TextFormat();
            textFormat.color = 0xFFFFFF;
            loadingText = new TextField();
            loadingText.x = stage.stageWidth/2-20;
            loadingText.y = 10;
            addChild(loadingText);
            loadingText.defaultTextFormat = textFormat;
        }
    }
    
}



[本日志由 勤卓 于 2009-03-16 12:13 AM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Actionscript Away3D TweenLite/Max
评论: 0 | 引用: 0 | 查看次数: 928
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭