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;init metodissa vain hiiren klikkauksen tapahtumakäsittelijä:
import org.papervision3d.core.math.Number2D;
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:
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
- Target camera
- Free camera
- Debug camera
- Spring camera
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();
}
}
}