Away3D基础教程(六):支持双面交互的PlaneGeometry

看了老外的一篇文章,现在将文章中的实例转过来与大家分享,此例中巧妙的运用两个Mesh对象创建了支持双面交互的PlaneGeometry,其实原理就是将PlaneGeometry放到两个Mesh里去,做反面的那个Mesh设置back.rotationY = 180即可,文章里将这种支持双面交互的PlaneGeometry封装成了DoubleSidedPlane3D类,使用起来也非常简单。大家也可以自己扩展这个类来实现更多的动能,比如点击正面的时候和点击反面的时候做出不同的处理。效果如下:

 

 
 
Main.as  代码
 
package {

    import flash.display.Sprite;
    import flash.display.StageScaleMode;
    import flash.display.StageAlign;
    import flash.events.MouseEvent;
    import flash.system.System;
    import flash.events.Event;
    import flash.geom.Vector3D;
    import flash.display.BitmapData;
    import flash.text.TextField;
    import flash.ui.Mouse;
    import flash.ui.MouseCursor;
    import away3d.Away3D;
    import away3d.containers.View3D;
    import away3d.containers.Scene3D;
    import away3d.cameras.Camera3D;
    import away3d.containers.ObjectContainer3D;
    import away3d.materials.TextureMaterial;
    import away3d.textures.BitmapTexture;
    import away3d.materials.ColorMaterial;
    import away3d.utils.Cast;
    import away3d.events.MouseEvent3D;
    import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.tweens.ITween;
    import org.libspark.betweenas3.events.TweenEvent;
    import org.libspark.betweenas3.easing.*;
    import DoubleSidedPlane3D;
    import flash.text.TextFieldAutoSize;

    [SWF(backgroundColor="#FFFFFF", width="512", height="512", frameRate="60")]

    public class Main extends Sprite {
        [Embed(source="assets/back.jpg")]
        private var Background:Class;
        [Embed(source="assets/image0.jpg")]
        private var Image0:Class;
        [Embed(source="assets/image1.jpg")]
        private var Image1:Class;
        [Embed(source="assets/image2.jpg")]
        private var Image2:Class;
        [Embed(source="assets/image3.jpg")]
        private var Image3:Class;
        [Embed(source="assets/image4.jpg")]
        private var Image4:Class;
        
        private var view:View3D;
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var container:ObjectContainer3D;
        private static var cameraDepth:uint = 1000;
        private static var cameraHeight:int = 0;
        private static var max:uint = 5;
        private var planes:Array;
        private static var pwidth:uint = 256;
        private static var pheight:uint = 128;
        private var angle:Number = 0;
        private static var center:Vector3D = new Vector3D();
        private var htmlText:TextField;

        public function Main() {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            System.pauseForGCIfCollectionImminent(1);
            init();
        }

        private function init():void {
            
            view = new View3D();
            scene = view.scene;
            camera = view.camera;
            addChild(view);
            setup();
            initialize();
            
            htmlText = new TextField();
            htmlText.autoSize = TextFieldAutoSize.LEFT;
            htmlText.selectable = false;
            htmlText.textColor = 0xa3a3a3;
            htmlText.htmlText = '交流QQ:781444988\n交流地址:<a href="http://www.cnblogs.com/njflash/" target="_blank">http://www.cnblogs.com/njflash/ </a>';
            addChild(htmlText);
            htmlText.x = 10;
            htmlText.y = 30;
            
            addEventListener(Event.ENTER_FRAME, render, false, 0, true);
        }
        private function setup():void {
            view.backgroundColor = 0xFFFFFF;
            view.antiAlias = 4;
            view.width = 512;
            view.height = 512;
            view.background = Cast.bitmapTexture(Background);
            camera.x = 0;
            camera.y = cameraHeight;
            camera.z = - cameraDepth;
        }
        private function initialize():void {
            container = new ObjectContainer3D();
            scene.addChild(container);
            var Images:Array = [Image0, Image1, Image2, Image3, Image4];
            var colors:Array = [0xF5F5F5, 0x3366CC, 0x339900, 0xFF9900, 0xCC0066];
            planes = new Array();
            for (var n:uint = 0; n < max; n++) {
                var bitmapData:BitmapData = Cast.bitmapData(Images[n]);
                var texture:BitmapTexture = new BitmapTexture(bitmapData);
                var frontmaterial:TextureMaterial = new TextureMaterial(texture);
                var backmaterial:ColorMaterial = new ColorMaterial(colors[n]);
                var plane:DoubleSidedPlane3D = new DoubleSidedPlane3D(frontmaterial, backmaterial, pwidth, pheight, 10, 4, false);
                plane.x = 0;
                plane.y = 140*(n - 2);
                plane.z = 0;
                plane.extra = {id: n};
                container.addChild(plane);
                plane.front.mouseEnabled = true;
                plane.front.addEventListener(MouseEvent3D.CLICK, click, false, 0, true);
                plane.front.addEventListener(MouseEvent3D.MOUSE_OVER, rollOver, false, 0, true);
                plane.front.addEventListener(MouseEvent3D.MOUSE_OUT, rollOut, false, 0, true);
                plane.back.mouseEnabled = true;
                plane.back.addEventListener(MouseEvent3D.CLICK, click, false, 0, true);
                plane.back.addEventListener(MouseEvent3D.MOUSE_OVER, rollOver, false, 0, true);
                plane.back.addEventListener(MouseEvent3D.MOUSE_OUT, rollOut, false, 0, true);
                planes.push(plane);
            }
        }
        private function render(evt:Event):void {
            angle += 0.5;
            container.rotationY = angle;
            camera.lookAt(center);
            view.render();
        }
        private function click(evt:MouseEvent3D):void {
            enable(false);
            var plane:DoubleSidedPlane3D = DoubleSidedPlane3D(evt.target.parent);
            transit(plane.extra.id);
        }
        private function rollOver(vet:MouseEvent3D):void {
            Mouse.cursor = MouseCursor.BUTTON;
        }
        private function rollOut(vet:MouseEvent3D):void {
            Mouse.cursor = MouseCursor.AUTO;
        }
        private function transit(id:uint):void {
            var fadeouttweens:Array = new Array();
            var fadeintweens:Array = new Array();
            var offset:int = 2 - Math.abs(2 - id);
            for (var n:uint = 0; n < max; n++) {
                var direction:int = (n == id) ? 0 : (n < id) ? - 1 : 1;
                var plane:DoubleSidedPlane3D = planes[n];
                var fadeout:ITween = BetweenAS3.delay(BetweenAS3.parallel(
                    BetweenAS3.to(plane, {y: 140*(n - 2) + 120*direction}, 1, Quad.easeIn), 
                    BetweenAS3.to(plane, {rotationY: 180}, 1, Quad.easeIn), 
                    BetweenAS3.delay(BetweenAS3.to(plane, {alpha: 0, visible: 0}, 0.4, Linear.easeNone), 0.6)
                ), 0.2*(4 - Math.abs(n - id) - offset));
                fadeouttweens.push(fadeout);
                var fadein:ITween = BetweenAS3.delay(BetweenAS3.parallel(
                    BetweenAS3.to(plane, {alpha: 1, visible: 1}, 0.4, Linear.easeNone), 
                    BetweenAS3.to(plane, {y: 140*(n - 2)}, 1, Quad.easeOut), 
                    BetweenAS3.tween(plane, {rotationY: 0}, {rotationY: -180}, 1, Quad.easeOut)
                ), 0.2*Math.abs(n - id));
                fadeintweens.push(fadein);
            }
            var itween:ITween = BetweenAS3.serial(
                BetweenAS3.parallelTweens(fadeouttweens), 
                BetweenAS3.delay(BetweenAS3.parallelTweens(fadeintweens), 0.4)
            );
            itween.addEventListener(TweenEvent.COMPLETE, complete, false, 0, true);
            itween.play();
        }
        
        private function complete(evt:TweenEvent):void {
            evt.target.removeEventListener(TweenEvent.COMPLETE, complete);
            enable(true);
        }
        
        private function enable(useful:Boolean):void {
            for (var n:uint = 0; n < max; n++) {
                var plane:DoubleSidedPlane3D = planes[n];
                plane.front.mouseEnabled = useful;
                plane.back.mouseEnabled = useful;
            }
        }

    }

}

 

DoubleSidedPlane3D.as  代码

package{

    import away3d.containers.ObjectContainer3D;
    import away3d.entities.Mesh;
    import away3d.primitives.PlaneGeometry;
    import away3d.materials.TextureMaterial;
    import away3d.materials.ColorMaterial;

    public class DoubleSidedPlane3D extends ObjectContainer3D {
        
        public var front:Mesh;
        public var back:Mesh;
        private var _geometry:PlaneGeometry;
        private var _frontmaterial:TextureMaterial;
        private var _backmaterial:ColorMaterial;
        private var _alpha:Number = 1;

        
        public function DoubleSidedPlane3D(frontmaterial:TextureMaterial, backmaterial:ColorMaterial, width:Number = 100, height:Number = 100, segmentsW:uint = 1, segmentsH:uint = 1, yUp:Boolean = true) {
            _geometry = new PlaneGeometry(width, height, segmentsW, segmentsH, yUp, false);
            _frontmaterial = frontmaterial;
            _backmaterial = backmaterial;
            init();
        }

        
        private function init():void {
            front = new Mesh(_geometry, _frontmaterial);
            back = new Mesh(_geometry, _backmaterial);
            addChild(front);
            addChild(back);
            back.rotationY = 180;
        }
        public function get alpha():Number {
            return _alpha;
        }
        public function set alpha(value:Number):void {
            _alpha = value;
            _frontmaterial.alpha = _alpha;
            _backmaterial.alpha = _alpha;
        }

    }

}

 

posted @ 2013-02-23 12:22  leo_as南京  阅读(1089)  评论(0编辑  收藏  举报