[Actionscript][Away3D]三维图片展示Demo
作者:勤卓 日期:2009-03-03
这个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;
}
}
}
要掌握动画展示的效果,关键在于理解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
文章来自: 本站原创
Tags: Actionscript Away3D TweenLite/Max 评论: 0 | 引用: 0 | 查看次数: 928
发表评论
上一篇
下一篇



