Skip to content

Instantly share code, notes, and snippets.

@lamberta
Created April 16, 2010 03:36
Show Gist options
  • Save lamberta/367973 to your computer and use it in GitHub Desktop.
Save lamberta/367973 to your computer and use it in GitHub Desktop.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="450" height="400"
backgroundGradientAlphas="[0.93, 0.69]"
backgroundGradientColors="[#FFFFFF, #DFDDDD]"
applicationComplete="initApp();">
<mx:Script>
<![CDATA[
//pv3d
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
private var viewport :Viewport3D;
private var scene :Scene3D;
private var camera :Camera3D;
private var renderer :BasicRenderEngine;
private var plane :Plane;
[Embed(source="assets/future01.jpg")]
private var futureJPG :Class;
private var myMat :BitmapMaterial;
private var size :int = 25; //triangle count
private function initApp():void {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.LOW;
initPapervision3D();
buildPlane();
//do a single render so we don't have a blank screen
camera.hover(0, 0, 50);
renderer.renderScene(scene, camera, viewport);
//only render when mouse is over stage to conserve gpu
stage.addEventListener(MouseEvent.MOUSE_OVER, mouseOverListener);
stage.addEventListener(MouseEvent.MOUSE_OUT, mouseOutListener);
}
private function mouseOverListener(event:MouseEvent):void {
addEventListener(Event.ENTER_FRAME, render);
}
private function mouseOutListener(event:MouseEvent):void {
removeEventListener(Event.ENTER_FRAME, render);
}
private function initPapervision3D():void{
viewport = new Viewport3D(pv3dCanvas.width, pv3dCanvas.height);
pv3dCanvas.rawChildren.addChild(viewport);
scene = new Scene3D();
camera = new Camera3D();
camera.zoom = 16;
renderer = new BasicRenderEngine();
}
private function buildPlane():void {
var imgObj:Bitmap = new futureJPG() as Bitmap;
myMat = new BitmapMaterial(imgObj.bitmapData);
myMat.smooth = true;
myMat.doubleSided = true;
plane = new Plane(myMat, 250, 250, size - 1, size - 1);
plane.y = 100;
plane.rotationX = -60;
scene.addChild(plane);
}
private function render(e:Event):void {
evalVerts();
camera.hover(0, viewport.containerSprite.mouseX/75, viewport.containerSprite.mouseY/75);
renderer.renderScene(scene, camera, viewport);
}
private function evalVerts():void {
var vs:Array = plane.geometry.vertices;
for(var i:int = 0; i < vs.length; i++) {
var px:int = i % size;
var py:int = i / size;
var v:Vertex3D = vs[i] as Vertex3D;
//sin(r)/r
px = px - size/2;
py = py - size/2;
var myR:Number = Math.sqrt(px*px*.16+py*py*.16+.2);
var vzPos:Number = 100 * Math.sin(2.5 * myR)/myR;
var mousePos:Number = (map(mouseX, 0, stage.width, -0.7, 0.7));
v.z = 128 - vzPos * mousePos;
}
}
/* these number functions are from bit-101:
http://www.bit-101.com/blog/?m=20080423 */
public function normalize(value:Number, minimum:Number, maximum:Number):Number {
return (value - minimum) / (maximum - minimum);
}
public function interpolate(normValue:Number, minimum:Number, maximum:Number):Number {
return minimum + (maximum - minimum) * normValue;
}
public function map(value:Number, min1:Number, max1:Number,
min2:Number, max2:Number):Number {
return interpolate( normalize(value, min1, max1), min2, max2);
}
]]>
</mx:Script>
<mx:Canvas id="pv3dCanvas" height="100%" width="100%" >
<mx:Label x="196" y="372" fontStyle="italic" color="#000000" fontSize="10"
text="“The Flying Sombrero”"/>
<mx:Label x="324" y="372" color="#000000" fontSize="9" text="(mouse-over to move)"/>
</mx:Canvas>
</mx:Application>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment