Math and (Quasi) Physics in Action Script 3

PaperVision 3D - Testing bump mapping

Bump mapping is a 3D graphics technique to make a rendered surface look more realistic by modeling a bumpy surface based on the pattern on a bitmap image.

In this example, an abstract pattern created using Perlin noise is used as a map. Green pixels are allocated to high bumps while blue pixels epresent low surfaces so that the result looks like lands on the sea, and the pattern of the noise is altered in every frame to make the continent drift.

Main.as


package {
  import flash.display.*;
  import flash.events.*;
  import flash.geom.*;
  import flash.filters.*;
  import org.papervision3d.cameras.*;
  import org.papervision3d.materials.shaders.*;
  import org.papervision3d.materials.*;
  //import org.papervision3d.materials.utils.*;
  import org.papervision3d.objects.*;
  import org.papervision3d.objects.primitives.*;
  import org.papervision3d.render.*;
  import org.papervision3d.scenes.*;
  import org.papervision3d.view.*;
  import org.papervision3d.lights.*;

  public class Main extends Sprite {
    private var scene:Scene3D;
    private var camera:Camera3D;
    private var viewport:Viewport3D;
    private var renderer:BasicRenderEngine;
    private var obj:DisplayObject3D;
    private var light:PointLight3D;
    private var offset:Number = 0;

    public function Main() {
      
      //bg
      graphics.beginFill(0x000000);
      graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
      scene = new Scene3D();
      //camera
      camera = new Camera3D();
      camera.x = camera.y = 0;
      camera.z = -1000;
      camera.focus = 100;
      camera.zoom = 10;
      //vieport
      viewport = new Viewport3D(stage.stageWidth,stage.stageHeight);
      addChild(viewport);

      //renderer
      renderer = new BasicRenderEngine();

      //light
      light = new PointLight3D();
      scene.addChild(light);
      
      obj = new Sphere(getMaterial(),100,32,32); 
      scene.addChild(obj);
      
      stage.addEventListener(Event.ENTER_FRAME, drawPapervision3d);
    }
    
    private function drawPapervision3d(e:Event):void {
      obj.material = getMaterial();
      obj.rotationY += 1;
      light.z = Math.cos(obj.rotationY / 180 * Math.PI) * 100;
      light.x = Math.sin(obj.rotationY / 180 * Math.PI) * 100;
      renderer.renderScene(scene, camera, viewport);
    }
    
    private function getMaterial():ShadedMaterial {
      offset += 1;
      var texBmp:BitmapData = new BitmapData(400,200);
      texBmp.perlinNoise(30,30,3,1,true,true,6,false,[new Point(-offset, -offset / 2)]);
      var bump:BitmapData = texBmp.clone()  ;
      var filter:ColorMatrixFilter = new ColorMatrixFilter([0,1.5,-1.5,0,0, 0,1.5,-1.5,0,0, 0,1.5,-1.5,0,0, 0,0,0,1,0]);
      bump.applyFilter(bump, new Rectangle(0,0,texBmp.width, texBmp.height), new Point(0,0), filter);
      var phong:PhongShader=new PhongShader(light,0xFFFFFF, 0x221133 , 10 ,bump,bump);  
      var texture:BitmapMaterial=new BitmapMaterial(texBmp);  
      var material:ShadedMaterial = new ShadedMaterial(texture,phong); 
      return material;
    }
    
  }
}