pv3d mouse controlled rotation

by yonatan
♥0 | Line 56 | Modified 2009-04-22 19:20:35 | MIT License
play

ActionScript3 source code

/**
 * Copyright yonatan ( http://wonderfl.net/user/yonatan )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ykON
 */

// forked from mash's papervision3d light and a flatshadedcube
// forked from mash's papervision3d simple example (cube)
package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.Point;

    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.core.math.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;

    public class PV3D_01 extends Sprite {
        private var camera    :Camera3D;
        private var scene     :Scene3D;
        private var viewport  :Viewport3D;
        private var renderer  :BasicRenderEngine;

        private var cube      :Cube;

        public function PV3D_01() {
            camera   = new Camera3D();
            camera.x = 0;
            camera.y = 0;
            camera.z = -1000;
            
            scene    = new Scene3D();
            viewport = new Viewport3D( stage.stageWidth, stage.stageHeight );
            renderer = new BasicRenderEngine();
            addChild( viewport );

            var light:PointLight3D = new PointLight3D(false);
            light.x = 0;
            light.y = 0;
            light.z = -1000;

            var materials :MaterialsList = new MaterialsList( { all : new FlatShadeMaterial(light, 0xD7261C ) } );
            cube = new Cube( materials );
            cube.x = 0;
            cube.y = 0;
            cube.z = 0;
            scene.addChild( cube );

            addEventListener( Event.ENTER_FRAME, onEnterFrame );
        }

        private static const SPEED:Number = 1/4000;

        public function onEnterFrame(e:Event): void {
            var mp:Point = new Point(
                stage.width/2  - mouseX,
                stage.height/2 - mouseY );
            
            var angle:Number = -mp.length * SPEED;
            mp.normalize( 1 );
            
            // swap x and y to get rotation axis
            cube.transform.calculateMultiply(
                Matrix3D.rotationMatrix( mp.y, mp.x, 0, angle ),
                cube.transform );
            
            renderer.renderScene( scene, camera, viewport );
        }
    }
}