Skip to content

Instantly share code, notes, and snippets.

@lamberta
Created April 16, 2010 04:41
Show Gist options
  • Save lamberta/368013 to your computer and use it in GitHub Desktop.
Save lamberta/368013 to your computer and use it in GitHub Desktop.
Better-Bend-than-Break pv3d demo
/**
* 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