Created
April 16, 2010 04:41
-
-
Save lamberta/368013 to your computer and use it in GitHub Desktop.
Better-Bend-than-Break pv3d demo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* VectorVision + AS3Dmod example, by Billy Lamberta <www.lamberta.org>. | |
**/ | |
package { | |
import com.as3dmod.ModifierStack; | |
import com.as3dmod.modifiers.Bend; | |
import com.as3dmod.plugins.pv3d.LibraryPv3d; | |
import com.as3dmod.util.ModConstant; | |
import com.as3dmod.util.Phase; | |
import com.zavoo.svg.SvgPathsPapervision; | |
import flash.display.Sprite; | |
import flash.display.StageQuality; | |
import flash.display.StageScaleMode; | |
import flash.events.Event; | |
import flash.net.URLLoader; | |
import flash.net.URLRequest; | |
import org.papervision3d.cameras.Camera3D; | |
import org.papervision3d.materials.ColorMaterial; | |
import org.papervision3d.materials.WireframeMaterial; | |
import org.papervision3d.materials.special.VectorShapeMaterial; | |
import org.papervision3d.objects.DisplayObject3D; | |
import org.papervision3d.objects.primitives.Sphere; | |
import org.papervision3d.objects.special.VectorShape3D; | |
import org.papervision3d.render.BasicRenderEngine; | |
import org.papervision3d.scenes.Scene3D; | |
import org.papervision3d.view.Viewport3D; | |
[SWF(backgroundColor="0xFFFFFF", framerate="30")] | |
public class VectorBend extends Sprite { | |
private var viewport:Viewport3D; | |
private var scene:Scene3D; | |
private var renderer:BasicRenderEngine; | |
private var camera:Camera3D; | |
private var stageWidth:Number; | |
private var stageHeight:Number; | |
private var vectorShape:VectorShape3D; | |
private var containerObj:DisplayObject3D; | |
//as3dmod | |
private var modifierStack:ModifierStack; | |
private var bend:Bend; | |
private var bendPhase:Phase; | |
public function VectorBend() { | |
stageSetup(); | |
init3D(); | |
loadSVG(); | |
} | |
private function stageSetup():void { | |
stageWidth = stage.stageWidth; | |
stageHeight = stage.stageHeight; | |
stage.quality = StageQuality.MEDIUM; | |
stage.scaleMode = StageScaleMode.NO_SCALE; | |
} | |
private function init3D():void { | |
viewport = new Viewport3D(stageWidth, stageHeight, true); | |
addChild(viewport); | |
renderer = new BasicRenderEngine(); | |
scene = new Scene3D(); | |
camera = new Camera3D(); | |
camera.z = -1500; | |
addEventListener(Event.ENTER_FRAME, onEnterFrame); | |
} | |
private function loadSVG():void { | |
var loader:URLLoader = new URLLoader(); | |
var request:URLRequest = new URLRequest("assets/images/betterBend.svg"); | |
loader.load(request); | |
loader.addEventListener(Event.COMPLETE, onSVGLoadComplete); | |
} | |
private function onSVGLoadComplete(event:Event):void { | |
var loader:URLLoader = URLLoader(event.target); | |
var paths:SvgPathsPapervision = new SvgPathsPapervision(loader.data); | |
var m:VectorShapeMaterial = new VectorShapeMaterial(); | |
vectorShape = new VectorShape3D(m); | |
paths.drawToVectorShape(vectorShape.graphics, 5, 10, 10); | |
//registration point is always a pain | |
vectorShape.rotationX = 180; | |
vectorShape.x = -500; | |
vectorShape.y = 50; | |
vectorShape.z = -200; | |
//moving this around is easier once vectorshape is positioned | |
containerObj = new DisplayObject3D(); | |
containerObj.addChild(vectorShape); | |
containerObj.scale = 3; | |
scene.addChild(containerObj); | |
addBendModifier(); | |
} | |
private function addBendModifier():void { | |
//using as3dmod | |
modifierStack = new ModifierStack(new LibraryPv3d(), vectorShape); | |
bend = new Bend(1.85); //takes force and offset | |
//sets where the bend occurs | |
bend.bendAxis = ModConstant.X; | |
bendPhase = new Phase(); | |
modifierStack.addModifier(bend); | |
modifierStack.apply(); | |
} | |
private function onEnterFrame(event:Event):void { | |
//takes a second to load, make sure it's there | |
if(bend){ | |
//as3dmod enterframe calls | |
bendPhase.value += 0.05; | |
bend.force = bendPhase.phasedValue * 2; | |
modifierStack.apply(); | |
} | |
//rotate the object | |
containerObj.yaw(0.5); | |
containerObj.roll(0.5); | |
//camera hovering | |
camera.x -= (camera.x - viewport.containerSprite.mouseX * 5) / 100; | |
camera.y -= (camera.y - viewport.containerSprite.mouseY * 5) / 100; | |
renderer.renderScene(scene, camera, viewport); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment