Papervision3D tutorial 3

 


 

PaperExplosionTweenTest

 

package {
	import flash.events.Event;
	import flash.events.MouseEvent;

	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.view.BasicView;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.materials.ColorMaterial;//

	import caurina.transitions.Tweener;

	public class PaperExplosionTweenTest extends BasicView {

		private var plane:Plane;
		private var partikkelienLukumaara:uint=25;
		var pivotP:DisplayObject3D;
		var paperitArray=[];

		public function PaperExplosionTweenTest() {
			init();
			startRendering();
		}

		private function init():void {
			viewport.interactive=true;
			stage.addEventListener(MouseEvent.CLICK, clikkaus);
			pivotP = new DisplayObject3D();
			for (var i:uint = 0; i < partikkelienLukumaara; i++) {
				var vari:Number=Math.random()*0xFFFFFF;// satunnainen väri syntyy tästä
				var material:ColorMaterial=new ColorMaterial(vari);
				plane=new Plane(material,80,80,1,1);
				material.interactive=true;
				Tweener.addTween(plane,{
				x:Math.random()*700-250,
				y:Math.random()*700-250,
				z:Math.random()*700-250,
				localRotationX:Math.random()*360,
				localRotationY:Math.random()*360,
				localRotationZ:Math.random()*360,
				time:2, transition:"easeOutSine"
				});

				pivotP.addChild(plane);
				plane.material.doubleSided=true;
				paperitArray.push(plane);


			}
			scene.addChild(pivotP);
		}


		function clikkaus(e:MouseEvent):void {
			trace("klikkaus");


		}

		override protected function onRenderTick(e:Event=null):void {
			pivotP.localRotationY++;
			super.onRenderTick();
		}
	}
}

 

palaset klikkauksen taakse:

lisää edelliseen seuraavat luokat package osioon:

 

 import org.papervision3d.core.math.Number3D;
import org.papervision3d.core.math.Number2D;

init metodissa vain hiiren klikkauksen tapahtumakäsittelijä:
   private function init():void {
			//viewport.interactive=true;
			stage.addEventListener(MouseEvent.CLICK, clikkaus);

		}

uusi metodi luoPalaset funktiossa se mitä aikaisemmin init funktiossa:

lisätään funktiokutsuun parametrit_x ja _y sekä annetaan ne arvot pivotP kordinaateiksi

        private function luoPalaset(_x:Number =0,_y:Number = 0):void {


			pivotP = new DisplayObject3D();
			pivotP.x=_x;
			pivotP.y=_y;
			for (var i:uint = 0; i < partikkelienLukumaara; i++) {
				var vari:Number=Math.random()*0xFFFFFF;// satunnainen väri syntyy tästä
				var material:ColorMaterial=new ColorMaterial(vari);
				plane=new Plane(material,80,80,1,1);
				material.interactive=true;
				Tweener.addTween(plane,{
				x:Math.random()*700-250,
				y:Math.random()*700-250,
				z:Math.random()*700-250,
				localRotationX:Math.random()*360,
				localRotationY:Math.random()*360,
				localRotationZ:Math.random()*360,
				time:2, transition:"easeOutSine"
				});

				pivotP.addChild(plane);
				plane.material.doubleSided=true;
				paperitArray.push(plane);


			}
			scene.addChild(pivotP);
		}

klikkaus metodissa haetaan kordinaatit

CoordinateUtil luokkaa käyttäen, joka löytyy blogi tekstin kommenteista:

http://blog.zupko.info/?p=143

tallenna CoordinateUtil luokka samaan kansioon

        		function clikkaus(e:MouseEvent):void {
			//trace("klikkaus");

			var position3D:Number3D=CoordinateUtil.d3PositionBasedScreenCoordinate(this.cameraAsCamera3D,new Number2D(viewport.containerSprite.mouseX,viewport.containerSprite.mouseY),CoordinateUtil.XY_PLANE);
			luoPalaset(position3D.x,position3D.y);

		}
pivotP.localRotationY poiskommentoidaan

 

    		override protected function onRenderTick(e:Event=null):void {
			//pivotP.localRotationY++;
			super.onRenderTick();
		}

 

 

 

Kamerat

 

 

edelliseen debug kamera:

 import org.papervision3d.cameras.CameraType;

konstruktoriin kutsu BasicView konstruktoriin:

		
public function PaperExplosionTweenTest() {
			super(stage.stageWidth,stage.stageHeight,true,false,CameraType.DEBUG);
			init();
			startRendering();
		}

init metodiin: ks. http://blog.tartiflop.com/2008/08/understanding-zoom-focus-and-field-of-view-in-papervision3d/

 camera.z=-1000;
camera.focus=20;
camera.far=2000;


Värien nappailu taustakuvasta:

   package {

	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
/*	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;*/
	import flash.net.URLRequest;


	public class CopyPixelsTest2 extends Sprite {


var kuvaBitMap:BitmapData;

		public function CopyPixelsTest2() {
			loadImage("puu.jpg");
		}

 
		private function loadImage(imagePath:String):void {
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
			loader.load(new URLRequest(imagePath));
		}

	 
		private function onImageLoaded(event:Event):void {
			var loaderInfo:LoaderInfo = event.target as LoaderInfo;
			var bitmap:Bitmap = loaderInfo.content as Bitmap;
		

kuvaBitMap = bitmap.bitmapData;
			addChild(bitmap);

			stage.addEventListener(MouseEvent.CLICK, onStageClick);
		}

		private function onStageClick(event:MouseEvent):void {
			var x:Number = event.localX;
			var y:Number = event.localY;
			// grabs color from screenshot
			var color:uint = kuvaBitMap.getPixel(x, y);
			// colors whole background
			graphics.clear();
			graphics.beginFill(color);
			graphics.drawRect(400, 0, 100, 100);
			graphics.endFill();
		}

	}

}

 


 

Target Camera testaus: muuta tutorial 01 sivulla oleva 5.14. ===== ryhmittelyhierarkiat PivotPointRyhmittely luokassa onRenderTick metodia seuraavasti

		override protected function onRenderTick(e:Event=null):void {

			var xDist:Number=mouseX-stage.stageWidth*0.5;
			var yDist:Number=mouseY-stage.stageHeight*0.5;
			camera.x=xDist*4;
			camera.y=- yDist*4;
			//pivotDO3D.localRotationY++;
			super.onRenderTick();
		}
        

 

aseta kameran target: lisää edelliseen seuraava rivi init metodin loppuun:

camera.target = cylinder4;

 

Free camera testaus: muuta edellinen rivi :

camera.target = null;

camera orbit metodi

lisää edelliseen:

 
import org.papervision3d.cameras.CameraType;
import flash.events.MouseEvent;

muuttujat class lohkoon

        private var camPitch:Number = 90;
        private var camYaw:Number = 270;
        
        private var isOrbiting:Boolean;
        private var previousMouseX:Number;
        private var previousMouseY:Number;

        

 

init metodiin mouse tapahtumankäsittelijät

 

   		stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
          	stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
          	stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            

 

ja niiden metodit:

 

   	
	private function onMouseDown(e:MouseEvent):void
        {
            isOrbiting = true;
            previousMouseX = e.stageX;
            previousMouseY = e.stageY;
        }
  
        private function onMouseUp(e:MouseEvent):void
        {
             isOrbiting = false;
        }
		
		       private function onMouseMove(e:MouseEvent):void
        {
             var differenceX:Number = e.stageX - previousMouseX;
             var differenceY:Number = e.stageY - previousMouseY;
  			
             if(isOrbiting){
                camPitch += differenceY;
                camYaw += differenceX;
  			
  				//clamp pitch
  				if(camPitch < 5) camPitch = 5;
  				if(camPitch > 175) camPitch = 175;
            
             	//clamp yaw
             	//if(camYaw > 355) camYaw = 355;
  				//if(camYaw < 185) camYaw = 185;
               
                previousMouseX = e.stageX;
                previousMouseY = e.stageY;
             }
        }
rendertick metodi:
		override protected function onRenderTick(e:Event=null):void {

			camera.orbit(camPitch, camYaw);

			super.onRenderTick();
		}

 


 

Spring camera Demo

ks myös: Spring Camera with Arrow Control 

Papervision3D Air Ship with SpringCamera3D

 

        package {
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.cameras.SpringCamera3D;
	import org.papervision3d.core.math.Number3D;
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.materials.special.CompositeMaterial;
	import org.papervision3d.objects.primitives.*;
	import org.papervision3d.view.BasicView;
	
	public class SpringCameraExample extends BasicView
	{
		//private var earthSphere:Sphere;
 		private var paperPlane:PaperPlane;
		private var springCamera:SpringCamera3D;
 
		private var keyRight:Boolean;
		private var keyLeft:Boolean;
		private var keyForward:Boolean;
		private var keyBackward:Boolean;
 
		public function SpringCameraExample()
		{
			super(stage.stageWidth,stage.stageHeight,true,false,CameraType.SPRING);

			init();
			startRendering();
		}
 
		private function init():void
		{	
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
			
			var camera:SpringCamera3D = SpringCamera3D(camera);
			camera.mass = 20;
			camera.damping = 10;
			camera.stiffness = 1;
			camera.positionOffset = new Number3D(0, 150, -500); 
			camera.lookOffset = new Number3D(0, 0, 100);
			
 
			

			
			for(var i:uint = 0;i <  15; i++)
			{ 
				var cylinder:Cylinder = new Cylinder(new ColorMaterial(Math.random() * 0xFFFFFF) , 40,500,5, 1,-1,false,true);
				
				cylinder.material.doubleSided = true;
				scene.addChild(cylinder);
				cylinder.x = Math.random()*8000 - 4000;
				//cylinder.y = Math.random()*1500 - 750;
				cylinder.z = Math.random()*8000 -4000;
				//cylinder.localRotationY = Math.random() * 180 - 90;
			}
			
			//create paperPlane material
			var planeMaterial:CompositeMaterial = new CompositeMaterial();
			planeMaterial.addMaterial(new ColorMaterial(0xFFFFFF));
			planeMaterial.addMaterial(new WireframeMaterial(0x484848));
			planeMaterial.doubleSided = true;
			//create paperPlane
			paperPlane = new PaperPlane(planeMaterial);
			scene.addChild(paperPlane);
			paperPlane.z= -1000;
			paperPlane.y = 150;
			
			camera.z = -2000;
			camera.focus = 20;
			camera.far = 20000;
			
			//set target for camera
			camera.target = paperPlane;
		}
		
 		private function keyDownHandler(e:KeyboardEvent):void
		{	
			switch( e.keyCode )
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					keyForward = true;
					break;
 
				case "S".charCodeAt():
				case Keyboard.DOWN:
					keyBackward = true;
					break;
 
				case "A".charCodeAt():
				case Keyboard.LEFT:
					keyLeft = true;
					break;
 
				case "D".charCodeAt():
				case Keyboard.RIGHT:
					keyRight = true;
					break;
			}
		}
 
		private function keyUpHandler(e:KeyboardEvent):void
		{
			switch(e.keyCode)
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					keyForward = false;
					break;
 
				case "S".charCodeAt():
				case Keyboard.DOWN:
					keyBackward = false;
					break;
 
				case "A".charCodeAt():
				case Keyboard.LEFT:
					keyLeft = false;
					break;
 
				case "D".charCodeAt():
				case Keyboard.RIGHT:
					keyRight = false;
					break;
			}
		}
		
		private function moveObject():void
		{
			// move
			if(keyForward)
			{
				paperPlane.moveForward(30);
			}
			else if(keyBackward)
			{
				paperPlane.moveBackward(30);
			}
			
			// rotate
			if(keyRight)
			{
				paperPlane.localRotationY -=2;
			}
			else if(keyLeft)
			{
				paperPlane.localRotationY +=2;
			}
		}
		
		override protected function onRenderTick(e:Event=null):void
		{	
			//earthSphere.localRotationY += 0.2;
			moveObject();
			
			super.onRenderTick();
		}
	}
}

 


 

Collada Dae mallin tuominen sceneen:

ks myös: Tutorial: How to properly export a 3D Collada model from Blender to use in Papervision3D

 

package {

	import flash.events.Event;
	import org.papervision3d.events.FileLoadEvent;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.parsers.DAE;
	import org.papervision3d.view.BasicView;

	public class ColladaDaeMalliTesti extends BasicView {
		private var daemodel:DisplayObject3D;
		private var rotaatioXkerroin:Number=0.5;
		private var rotaatioYkerroin:Number=0.5;
		private var camPitch:Number=90;
		private var camYaw:Number=270;
		private var easeOut:Number=0.1;

		public function ColladaDaeMalliTesti() {
			init();
			startRendering();
		}

		private function init():void {

			daemodel = new DAE();
			// aseta tarvittava skaalaus:
			daemodel.scaleX=daemodel.scaleY=daemodel.scaleZ=60;			
			daemodel.addEventListener(FileLoadEvent.LOAD_COMPLETE,modelLoaded);

			//DAE(daemodel).load("assets/joku3dmalli.dae");
// testi malli: obeliski2.dae downloadaa samaan kansioon kuin as luokka
DAE(daemodel).load("obeliski2.dae"); //ja sen tekstuurikuva: Place_de_la_Concorde_obelisk_tex.jpg
 
		}

		private function modelLoaded(e:FileLoadEvent):void {
			scene.addChild(daemodel);
		}

		override protected function onRenderTick(e:Event=null):void {
			var hiirenXkeskipisteesta:Number=mouseX-stage.stageWidth*0.5;
			var hiirenYkeskipisteesta:Number=mouseY-stage.stageHeight*0.5;

			camPitch += ((hiirenYkeskipisteesta * rotaatioXkerroin) - camPitch + 90) * easeOut;
			camYaw += ((hiirenXkeskipisteesta * rotaatioYkerroin) - camYaw + 270) * easeOut;
			if (camPitch > 170)  camPitch= 170;
			if (camPitch < 5)  camPitch= 5;
			 
			camera.orbit(camPitch, camYaw);

			super.onRenderTick();
		}

	}
}