博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Away3D基础教程(六):支持双面交互的PlaneGeometry
阅读量:6086 次
发布时间:2019-06-20

本文共 9678 字,大约阅读时间需要 32 分钟。

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

 

<a href=\"http://www.adobe.com/go/getflash\"> <img src=\"http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif\" alt=\"\u83b7\u5f97 Adobe Flash Player\" /> </a>
 
 
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交流地址:http://www.cnblogs.com/njflash/ ';            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;        }    }}

 

转载于:https://www.cnblogs.com/njflash/archive/2013/02/23/2923341.html

你可能感兴趣的文章
终端 进程关系
查看>>
ios取证
查看>>
T-sql语句查询执行顺序
查看>>
[MODx] 5. WayFinder
查看>>
使用CSS3实现超炫的Loading(加载)动画效果
查看>>
servlet中 getRealPath deprecated(被废弃)
查看>>
自定义图片相册
查看>>
strusts annotation
查看>>
iPhone:动态获取UILabel的高度和宽度
查看>>
arcgis软件集合
查看>>
ZendStudio在kali下无法启动
查看>>
[转载]DBA的特质第一部分:技术
查看>>
c# 读取XML数据
查看>>
Android程序Crash时的异常上报
查看>>
poj 1328 Radar Installation
查看>>
[家里蹲大学数学杂志]第392期中山大学2015年泛函分析考博试题回忆版
查看>>
eclipse创建多模块maven工程小结
查看>>
一些常用的c++系统函数
查看>>
Codeforces Round #296 (Div. 1) B. Clique Problem 贪心
查看>>
奇怪吸引子---LorenaMod2
查看>>