[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