Papervision3D tutorial 4
BoxesExploosio väri materiaalilla:
package {
import flash.events.Event;
import flash.events.MouseEvent;
import org.papervision3d.materials.utils.MaterialsList;
//import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.view.BasicView;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.materials.ColorMaterial;//
import caurina.transitions.Tweener;
public class BoxesExploosio extends BasicView {
private var plane:Cube;
private var partikkelienLukumaara:uint=15;
var pivotP:DisplayObject3D;
var paperitArray=[];
private var angle:Number=0;
public function BoxesExploosio() {
init();
startRendering();
}
private function init():void {
viewport.interactive=true;
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);
var materialsList:MaterialsList = new MaterialsList();
materialsList.addMaterial( material,"all");
plane=new Cube(materialsList,80,80,80,2,2,2);
//material.interactive = true;
Tweener.addTween(plane,{
x:Math.random()*1000-500,
y:Math.random()*1000-500,
z:Math.random()*1000-500,
localRotationX:Math.random()*360,
localRotationY:Math.random()*360,
localRotationZ:Math.random()*360,
time:2, transition:"easeOutSine"
});
//plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
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();
}
}
}
lisätään FlatShader edelliseen
// shaderin käyttämät luokat import org.papervision3d.lights.PointLight3D; // import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.materials.shaders.FlatShader; import org.papervision3d.materials.shaders.ShadedMaterial;luokka lohkoon:
private var light:PointLight3D;init metodiin määritellään valon ominaisuuksia:
light=new PointLight3D(true); light.z=-1100; light.y=700; light.x=700; scene.addChild(light);vaihdetaan materiali silmukassa
var shadeMaterial:FlatShadeMaterial = new FlatShadeMaterial(light,0xFFFFFF,vari,100);
materialsList.addMaterial( shadeMaterial,"all");
PlaneGridPyoritys
package {
import flash.events.Event;
// modified from Jeff Winder, Paul Tondeur: Papervision3D Essentials book MouseInteractionExample class
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
public class PlaneGridPyoritys extends BasicView {
private var grid:DisplayObject3D;
private var easeOut:Number=0.3;//higher is faster ease-out
private var reachX:Number=0.1;//higher is smaller reach
private var reachY:Number=0.1;//higher is smaller reach
private var reachZ:Number=0.5;//higher is smaller reach
private var rotX:Number=0.5;//higher is more rotation of the grid in over x axis examples 3 and 4
private var rotY:Number=0.5;//higher is more rotation of the grid over y axis in examples 3 and 4
var planeArray:Array=[];
var numberOfColumns:int=9;
var numberOfRows:int=5;
public function PlaneGridPyoritys() {
init();
startRendering();
}
private function init():void {
grid = new DisplayObject3D();
scene.addChild(grid);
var planeSize:int=110;
//spacing is the size of the plane plus the spacing in between them, should be higher than planeSize
//if you don't want planes to overlap
var planeSpacing:Number=116;
//offset from center of viewport, to center grid position
var centerOffsetX:Number=numberOfColumns*planeSpacing*0.5-planeSpacing*0.5;
var centerOffsetY:Number=numberOfRows*planeSpacing*0.5-planeSpacing*0.5;
for (var i:uint = 0; i < numberOfColumns; i++) {
for (var j:uint = 0; j < numberOfRows; j++) {
var plane:Plane=new Plane(new ColorMaterial(Math.random()*0xFFFFFF),planeSize,planeSize);
plane.material.doubleSided=true;
plane.x=i*planeSpacing-centerOffsetX;
plane.y=j*planeSpacing-centerOffsetY;
grid.addChild(plane);
planeArray.push(plane);
}
}
}
override protected function onRenderTick(e:Event=null):void {
//define how far the x mouse and y mouse positions are from the center of the stage
var xDist:Number=mouseX-stage.stageWidth*0.5;
var yDist:Number=mouseY-stage.stageHeight*0.5;
// pyöritä yksittäisiä elementtejä:
for (var i:uint = 0; i < numberOfColumns*numberOfRows; i++) {
planeArray[i].rotationX=yDist*rotX;
planeArray[i].rotationY=xDist*rotY;
}
//grid.rotationX += (yDist * rotX - grid.rotationX) * easeOut;
//grid.rotationY += (xDist * rotY - grid.rotationY) * easeOut;
//EXAMPLE 4: ROTATE OBJECT WITH EASING
//grid.rotationX += (yDist * rotX - grid.rotationX) * easeOut;
//grid.rotationY += (xDist * rotY - grid.rotationY) * easeOut;
super.onRenderTick();
}
}
}
tekstuuri slicet edelliseen
package {
import flash.events.Event;
// modified from Jeff Winder, Paul Tondeur: Papervision3D Essentials book MouseInteractionExample class
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
import org.papervision3d.materials.BitmapMaterial;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;
public class PlaneGridSliceTextures extends BasicView {
private var grid:DisplayObject3D;
private var rotX:Number=1.5;//higher is more rotation of the grid in over x axis examples 3 and 4
private var rotY:Number=1.5;//higher is more rotation of the grid over y axis in examples 3 and 4
var planeArray:Array=[];
var numberOfColumns:int=8; // plane elementtien määrä horisontaalisesti
var numberOfRows:int=6; // plane elementtien määrä vertikaalisesti
var kuvaSliceArray:Array=[];
var kuvaBitMap:BitmapData;
public function PlaneGridSliceTextures() {
init();
startRendering();
}
private function init():void {
loadImage("puu.jpg");
}
private function luoGrid():void {
grid = new DisplayObject3D();
scene.addChild(grid);
var planeSize:int=150;
//spacing is the size of the plane plus the spacing in between them, should be higher than planeSize
//if you don't want planes to overlap
var planeSpacing:Number=150;
//offset from center of viewport, to center grid position
var centerOffsetX:Number=numberOfColumns*planeSpacing*0.5-planeSpacing*0.5;
var centerOffsetY:Number=numberOfRows*planeSpacing*0.5-planeSpacing*0.5;
//var material:BitmapMaterial=new BitmapMaterial(kuvaBitMap);
var inx:uint=0;
for (var i:uint = 0; i < numberOfColumns; i++) {
for (var j:uint = 0; j < numberOfRows; j++) {
var material:BitmapMaterial=new BitmapMaterial(kuvaSliceArray[inx]);
inx++;
var plane:Plane=new Plane(material,planeSize,planeSize);
plane.material.doubleSided=true;
plane.x=i*planeSpacing-centerOffsetX;
plane.y=j*planeSpacing-centerOffsetY;
grid.addChild(plane);
plane.scaleY=-1;
planeArray.push(plane);
}
}
}
private function loadImage(imagePath:String):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
loader.load(new URLRequest(imagePath));
}
private function paloitteleKuva(kuva:BitmapData):void {
//trace("rect : Rectangle height "+kuva.rect.height);
//trace("rect : Rectangle width "+kuva.rect.width);
var kuvankorkeus:Number=kuva.rect.height;
var kuvanleveys:Number=kuva.rect.width;
var sliceLeveys:int=kuvanleveys/numberOfColumns;
//trace("sliceLeveys "+sliceLeveys);
var sliceKorkeus:int=kuvanleveys/numberOfRows;
//trace("sliceKorkeus "+sliceKorkeus);
for (var i:uint = 0; i < numberOfColumns; i++) {
for (var j:uint = 0; j < numberOfRows; j++) {
var sliceKuva:BitmapData=new BitmapData(sliceLeveys,sliceKorkeus);
var rectangle:Rectangle=new Rectangle(i*sliceLeveys,j*sliceKorkeus,sliceLeveys,sliceKorkeus);
//var rectangle:Rectangle=new Rectangle(1,1,100, 100);
//trace("i*sliceLeveys "+i*sliceLeveys);
//trace("j*kuvankorkeus "+j*kuvankorkeus);
sliceKuva.copyPixels(kuva, rectangle, new Point());
kuvaSliceArray.push(sliceKuva);
}
}
}
private function onImageLoaded(event:Event):void {
var loaderInfo:LoaderInfo=event.target as LoaderInfo;
var bitmap:Bitmap=loaderInfo.content as Bitmap;
// kuva käännetään ylös alaisin:
//http://board.flashkit.com/board/showthread.php?t=657082
kuvaBitMap=bitmap.bitmapData;
var flippedBitmap:BitmapData=new BitmapData(kuvaBitMap.width,kuvaBitMap.height,false,0xFFCC00);
var flipVerticalMatrix:Matrix = new Matrix();
flipVerticalMatrix.scale(1,-1);
flipVerticalMatrix.translate(0,kuvaBitMap.height);
flippedBitmap.draw(kuvaBitMap,flipVerticalMatrix);
kuvaBitMap=flippedBitmap;
//addChild(bitmap);
//setChildIndex(bitmap, 0);
paloitteleKuva(kuvaBitMap);
luoGrid();// 3d planet luodaan vasta tässä
}
override protected function onRenderTick(e:Event=null):void {
//define how far the x mouse and y mouse positions are from the center of the stage
var xDist:Number=mouseX-stage.stageWidth*0.5;
var yDist:Number=mouseY-stage.stageHeight*0.5;
// pyöritä yksittäisiä elementtejä:
for (var i:uint = 0; i < numberOfColumns*numberOfRows; i++) {
planeArray[i].rotationX=yDist*rotX;
planeArray[i].rotationY=xDist*rotY;
}
super.onRenderTick();
}
}
}
Pick color kuvasta paper explo:
package {
import flash.events.Event;
import flash.events.MouseEvent;
//import flash.media.Sound; //äänet
//import flash.net.URLRequest; //äänet http://www.foundation-flash.com/tutorials/as3sound/
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 org.papervision3d.core.math.Number3D;
import org.papervision3d.core.math.Number2D;
import org.papervision3d.cameras.CameraType;
import caurina.transitions.Tweener;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
public class PaperExploPickColor extends BasicView {
private var plane:Plane;
private var partikkelienLukumaara:uint=25;
var pivotP:DisplayObject3D;
var paperitArray=[];
//var sound:Sound; //äänet
var kuvaBitMap:BitmapData;
public function PaperExploPickColor() {
init();
startRendering();
}
private function init():void {
//sound=new Sound(new URLRequest("http://juy.fi/kurssit/actionscript/pv/tutorial/explosion.mp3")); //äänet
//sound=new Sound(new URLRequest("explosion.mp3")); //äänet
//stage.addEventListener(MouseEvent.CLICK, clikkaus);
loadImage("puu.jpg");
}
private function luoPalaset(_x:Number =0,_y:Number = 0,_z:Number =0, vari:Number= 0xCCCCCC):void {
pivotP = new DisplayObject3D();
pivotP.x=_x;
pivotP.y=_y;
pivotP.z=_z;
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:1, transition:"easeOutSine"
});
pivotP.addChild(plane);
plane.material.doubleSided=true;
paperitArray.push(plane);
}
scene.addChild(pivotP);
}
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);
//position3D.z= camera.z+1000;
luoPalaset(position3D.x,position3D.y,position3D.z);
trace("position3D.z "+position3D.z);
//sound.play(); //äänet
}
override protected function onRenderTick(e:Event=null):void {
//pivotP.localRotationY++;
super.onRenderTick();
}
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);
setChildIndex(bitmap, 0);
stage.addEventListener(MouseEvent.CLICK, onStageClick);
}
private function onStageClick(event:MouseEvent):void {
var x:Number=event.localX;
var y:Number=event.localY;
// grabs color
var color:uint=kuvaBitMap.getPixel(x,y);
var position3D:Number3D=CoordinateUtil.d3PositionBasedScreenCoordinate(this.cameraAsCamera3D,new Number2D(viewport.containerSprite.mouseX,viewport.containerSprite.mouseY),CoordinateUtil.XY_PLANE);
//position3D.z= camera.z+1000;
luoPalaset(position3D.x,position3D.y,position3D.z,color);
//trace("position3D.z "+position3D.z);
}
}
}
Animoitu generoitu käytävä esimerkki kuutio primitiivillä
package {
import flash.events.Event;
import org.papervision3d.view.BasicView;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Cube;
import caurina.transitions.Tweener;
public class Kaytava extends BasicView {
private var cube:Cube;
var materialsList:MaterialsList;
public function Kaytava() {
init();
startRendering();
}
private function init():void {
var red:ColorMaterial=new ColorMaterial(0xFF0000);
var blue:ColorMaterial=new ColorMaterial(0x0000FF);
var green:ColorMaterial=new ColorMaterial(0x00FF00);
materialsList = new MaterialsList();
materialsList.addMaterial(red,"front");
materialsList.addMaterial(red,"back");
materialsList.addMaterial(blue,"left");
materialsList.addMaterial(blue,"right");
materialsList.addMaterial(green,"top");
materialsList.addMaterial(green,"bottom");
}
override protected function onRenderTick(e:Event=null):void {
cube=new Cube(materialsList,300,20,300,1,1,1,Cube.ALL,Cube.FRONT+Cube.BACK);
cube.z=2500;
cube.x=Math.random()*50-25;
scene.addChild(cube);
Tweener.addTween(cube,{
z:-1500,
time:5, transition:"linear"
});
super.onRenderTick();
}
}
}
Sama kuin edellä cylinder primitiivillä
package {
import flash.events.Event;
import org.papervision3d.view.BasicView;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Cylinder;
import caurina.transitions.Tweener;
public class PyoreaKaytava extends BasicView {
private var cube:Cube;
private var cylinder:Cylinder;
var materialsList:MaterialsList;
var colormaterial:ColorMaterial;
var frameCount:int;
public function PyoreaKaytava() {
init();
startRendering();
}
private function init():void {
colormaterial=new ColorMaterial(0x00CCCC);
}
override protected function onRenderTick(e:Event=null):void {
frameCount++;
if (frameCount%5==0) {
cylinder=new Cylinder(colormaterial,300,20,14,1,-1,false,false);
cylinder.material.doubleSided=true;
cylinder.localRotationX=-90;
cylinder.z=2500;
cylinder.x=Math.random()*50-25;
scene.addChild(cylinder);
Tweener.addTween(cylinder,{
z:-1500,
time:5, transition:"linear"
});
}
super.onRenderTick();
}
}
}