[Papervision3D] Open Source 3D Wall
Mikenku
livelym1 at nku.edu
Fri Jun 27 09:20:34 PDT 2008
Yes, our group has buillt one that we are getting ready to release. It is
pretty easy, just three carousels stacked on top of each other. We are
putting a video player in today (with a switch case selector) so when you
click on an image a video plays. In addition, we put caringorm on it so all
the components talk to it other. Note: We added extra2 to the
DisplayObject3D class to get more interaction out of the buttons.
It still needs easing and the reflection class added. Below is the (Flex
version) code in its present state
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
applicationComplete="myLecData.send()" backgroundGradientColors="[#AEE8F4,
#131617]" backgroundGradientAlphas="[1.0, 1.0]">
<mx:HTTPService id="myLecData" url="XML/myXML.xml"
result="resultHandler(event)" />
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import org.papervision3d.core.proto.CameraObject3D;
import flash.filters.DropShadowFilter;
//Import for Reflection
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.filters.BlurFilter;
//Gradient Bevel Filter
import flash.filters.BitmapFilterQuality;
import flash.filters.GradientBevelFilter;
//Import Papervision Classes
import org.papervision3d.scenes.*;
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.lights.*;
import org.papervision3d.render.*;
import org.papervision3d.view.*;
import org.papervision3d.events.*;
import org.papervision3d.core.*;
import org.papervision3d.lights.PointLight3D;
import flash.filters.DropShadowFilter;
import flash.events.KeyboardEvent;
import mx.controls.HSlider;
import caurina.transitions.*;
//Add Cairngorm
import
net.davidtucker.ContactManager.model.SampleModelLocator;
[Bindable] private var modelLocator:SampleModelLocator =
SampleModelLocator.getInstance();
private var numOfItems:int = 15;
private var radius:Number = 300;
private var anglePer:Number = (Math.PI*2) / numOfItems;
// Apply the drop shadow and gradientDevel filter to the
box.
private var dropShadowFilter:DropShadowFilter;
private var gradientBevel:GradientBevelFilter;
private var gradientBevel2:DropShadowFilter;
//Click Variables
private var firstClick:Boolean=false;
private var youClickedMe:Object;
//private var dsf:DropShadowFilter = new
DropShadowFilter(10, 45, 0x000000, 0.3, 6, 6, 1, 3);
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.events.EffectEvent;
import mx.core.UIComponent;
public var angleX:Number = anglePer;
public var dest:Number = 1;
private var theLight:PointLight3D;
//Papervision Engine
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera: FreeCamera3D;
private var renderer:BasicRenderEngine;
private var planeArray:Array = new Array();
[Bindable]
public var object:Object;
private var arrayPlane:Object;
private var p1:Plane;
private var p2:Plane;
private var p3:Plane;
private var p4:Plane;
//Parameters for Keyboard and Cylinders
private var speed:Number=10; //Forward Back
private var rotspeed:Number=0;
//Rotation
private var highspeed:Number=30; //Flying
//Declare Buttons and Boolen Values Set to false to not execute in
the renderer
private var leftArrow:Boolean = false;
private var rightArrow:Boolean = false;
private var upArrow:Boolean = false;
private var downArrow:Boolean = false;
private var pageUp:Boolean = false;
private var pageDown:Boolean = false;
//Array Collection
[Bindable]
private var allMyData:ArrayCollection;
private function resultHandler(event:ResultEvent):void{
allMyData=event.result.myData.myLecture;
init();
}
//Initiation function
private function init():void
{
viewport = new Viewport3D(pv3dCanvas.width, pv3dCanvas.height,
false, true);
pv3dCanvas.rawChildren.addChild(viewport);
viewport.buttonMode=true;
renderer = new BasicRenderEngine();
scene = new Scene3D();
camera = new FreeCamera3D();
camera.zoom = 5;
camera.z = 0;
createObjects();
addEventListeners();
//dropShadowFilter = new DropShadowFilter(distance, angle, color,
alpha, x blur, y blur, strength, quality, inner shadow boolean, knockout
boolean, hide object boolean);
dropShadowFilter = new DropShadowFilter(10, 45, 0x000000, .5, 5, 5,
1, 1);
//viewport.filters = [filter1 to apply, filter2 to apply];
pv3dCanvas.filters = [dropShadowFilter];
}
//Create Objects function
private function createObjects():void{
for(var i:uint=0; i<allMyData.length; i++)
{
/* var shadow:DropShadowFilter = new DropShadowFilter();
shadow.distance = 10;
shadow.angle = 25; */
var bam1:BitmapFileMaterial = new
BitmapFileMaterial("images/"+allMyData[14-i].myLinks);
bam1.oneSide = false;
bam1.smooth = true;
bam1.interactive = true;
var bam2:BitmapFileMaterial = new
BitmapFileMaterial("images/"+allMyData[14-i].myVideo);
bam2.oneSide = false;
bam2.smooth = true;
bam2.interactive = true;
var bam3:BitmapFileMaterial = new
BitmapFileMaterial("images/"+allMyData[14-i].myLec);
bam3.oneSide = false;
bam3.smooth = true;
bam3.interactive = true;
p1 = new Plane(bam1, 120, 90, 1, 1);
p1.x = Math.cos(i*anglePer) * radius;
p1.z = Math.sin(i*anglePer) * radius;
p1.y = -100;
p1.rotationY = (-i*anglePer) * (180/Math.PI) + 90;
p2 = new Plane(bam2, 120, 90, 1, 1);
p2.x = Math.cos(i*anglePer) * radius;
p2.z = Math.sin(i*anglePer) * radius;
p2.y = 0;
p2.rotationY = (-i*anglePer) * (180/Math.PI) + 90;
p3 = new Plane(bam3, 120, 90, 1, 1);
p3.x = Math.cos(i*anglePer) * radius;
p3.z = Math.sin(i*anglePer) * radius;
p3.y = 100;
p3.rotationY = (-i*anglePer) * (180/Math.PI) + 90;
scene.addChild(p1);
scene.addChild(p2);
scene.addChild(p3);
//scene.addChild(p4);
p1.extra={pIdent:"in"};
p1.extra2={myIdent:3*(allMyData.length-i)-1};
p1.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
toggler);
p2.extra={pIdent:"in"};
p2.extra2={myIdent:3*(allMyData.length-i)-2};
p2.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
toggler);
p3.extra={pIdent:"in"};
p3.extra2={myIdent:3*(allMyData.length-i)-3};
p3.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
toggler);
}
}
private function toggler(event:InteractiveScene3DEvent):void
{
// if the cube's position is "in", move it out else
move it back
if (event.target.extra.pIdent == "in")
{
if(firstClick==true){
moveBack(youClickedMe);
}
trace(event.target.extra2.myIdent);
moveOut(event.target);
}
else
{
moveBack(event.target);
}
firstClick=true;
}
private function moveOut(object:Object):void
{
youClickedMe = object;
trace(object +" my object");
var str:String = object.valueOf();
var re:RegExp = /:/;
var results:Array = str.split(re);
trace (results[0]+" myNumber");
// for each cube that was not selected, remove the
click event listener
for each (var arrayPlane:Object in planeArray)
{
if (arrayPlane != object)
{
arrayPlane.removeEventListener(InteractiveScene3DEvent.OBJECT_PRESS,
toggler);
}
}
//right.enabled=false;
//left.enabled=false;
// move the selected cube out 1000 and rotate 90
degrees once it has finished moving out
Tweener.addTween(object, {scaleX:1.2, time:0.5,
transition:"easeInOutSine", onComplete:rotateCube,
onCompleteParams:[object]});
Tweener.addTween(object, {scaleY:1.2, time:0.5,
transition:"easeInOutSine", onComplete:rotateCube,
onCompleteParams:[object]});
// set the cube's position to "out"
object.extra = {pIdent:"out"};
// move the camera out 1000 and move it the to same
y coordinate as the selected cube
//Tweener.addTween(camera, {x:1000, y:object.y,
rotationX:0, time:0.5, transition:"easeInOutSine"});
}
private function moveBack(object:Object):void
{
// for each cube that was not selected, add the
click event listener back
for each (var arrayPlane:Object in planeArray)
{
if (arrayPlane != object)
{
arrayPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, toggler);
}
}
// move the selected cube back to 0 and rotate 90
degrees once it has finished moving back
Tweener.addTween(object, {scaleX:1, time:0.5,
transition:"easeInOutSine", onComplete:rotateCube,
onCompleteParams:[object]});
Tweener.addTween(object, {scaleY:1, time:0.5,
transition:"easeInOutSine", onComplete:rotateCube,
onCompleteParams:[object]});
// set the cube's position to "in"
object.extra = {pIdent:"in"};
// move the camera back to its original position
//Tweener.addTween(camera, {x:0, y:1000,
rotationX:-30, time:0.5, transition:"easeInOutSine"});
//right.enabled=true;
//left.enabled=true;
}
private function goBack():void
{
// for each cube that was not selected, add the
click event listener back
for each (var arrayPlane:Object in planeArray)
{
if (arrayPlane != object)
{
arrayPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, toggler);
}
}
}
private function rotateCube(object:Object):void
{
//object.rotationX = 0;
//Tweener.addTween(object, {rotationZ:0, time:0.5,
transition:"easeOutSine"});
}
private function addEventListeners():void{
this.addEventListener(Event.ENTER_FRAME, render);
}
//Enter Frame Listener function
private function render(e:Event):void{
renderer.renderScene(scene, camera, viewport);
camera.rotationY =myHSlider.value+114;
if(upArrow){
camera.z += speed*Math.cos(camera.rotationY*Math.PI/180);
camera.x += speed*Math.sin(camera.rotationY*Math.PI/180);
}
if(downArrow){
camera.z -= speed*Math.cos(camera.rotationY*Math.PI/180);
camera.x -= speed*Math.sin(camera.rotationY*Math.PI/180);
}
//Move Camera Up and Down
if(pageUp){
camera.x += highspeed;
}
if(pageDown){
camera.x -= highspeed;
}
}
private function moveRight():void
{
dest++;
Tweener.addTween(this, {angleX:dest*anglePer, time:0.5});
//goBack();
}
private function moveLeft():void
{
dest--;
Tweener.addTween(this, {angleX:dest*anglePer, time:0.5});
//goBack();
}
]]>
</mx:Script>
<mx:Canvas width="1014" height="691">
<mx:Canvas id="pv3dCanvas" x="0" y="0" width="1004" height="621"
borderColor="#110101" backgroundColor="#000000" alpha="1.0"
backgroundAlpha="1.0" themeColor="#000000" color="#020202">
</mx:Canvas>
<mx:HSlider id="myHSlider" x="145" y="649" width="725"
tickInterval="5" snapInterval="1" minimum="0" maximum="336" value="-180"
liveDragging="true"/>
</mx:Canvas>
</mx:Application>
Will post here when we release it.
Cheers,
Mike
Neckromancer wrote:
>
> Does anyone know of an open-source version of something similar to
> http://www.flashloaded.com/flashcomponents/3dwall/?
>
>
--
View this message in context: http://www.nabble.com/Open-Source-3D-Wall-tp17989860p18158753.html
Sent from the Papervision3D mailing list archive at Nabble.com.
More information about the Papervision3D
mailing list