Camera & Model rotation Test

by zier
Camera & Model rotation Test

使い方は onKeyDown() を見てください
usage sees 'onKeyDown()'
Papervision3D 
tweener
♥0 | Line 89 | Modified 2010-08-17 23:04:45 | MIT License
play

ActionScript3 source code

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

package {
    // 使い方は onKeyDown() を見てください
    // usage sees 'onKeyDown()'
    
    import flash.display.Sprite;
    import flash.events.Event
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import org.papervision3d.core.math.Matrix3D;
    import org.papervision3d.core.math.Number3D;

    // Papervision3D 
    import org.papervision3d.view.BasicView
    import org.papervision3d.lights.*
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.shadematerials.*
    import org.papervision3d.objects.primitives.*

    // tweener
    import caurina.transitions.*

    [SWF(width="400", height="400", backgroundColor='0x4e616b', frameRate="60")]
    public class Main extends BasicView {
        private const DEGREE_TO_RADIAN: Number = Math.PI / 180
        private const DEFAULT_TIME: Number = 2.5
        private const DEFAULT_TRANSITION: String = "easeOutElastic" // "easeOutBack"
        
        private var model: Cube = null
        private var direction: Number3D = new Number3D()
        
        private var light:PointLight3D = new PointLight3D()
        private var white: FlatShadeMaterial = new FlatShadeMaterial(light, 0xFFFFFF, 0xFFFFFF)
        private var blue: FlatShadeMaterial = new FlatShadeMaterial(light, 0x0000FF, 0x0000FF)
        private var green: FlatShadeMaterial = new FlatShadeMaterial(light, 0x00FF00, 0x00FF00)
        private var red: FlatShadeMaterial = new FlatShadeMaterial(light, 0xFF0000, 0xFF0000)
        private var yellow: FlatShadeMaterial = new FlatShadeMaterial(light, 0xFFFF00, 0xFFFF00)
        private var orange: FlatShadeMaterial = new FlatShadeMaterial(light, 0xFF8000, 0xFF8000)
        private var black: FlatShadeMaterial = new FlatShadeMaterial(light, 0x000000, 0x000000)
        
        private function createCube(size: int): Cube {
            var list: MaterialsList = new MaterialsList()
            list.addMaterial(red, "front")
            list.addMaterial(white, "top")
            list.addMaterial(green, "right")
            list.addMaterial(yellow, "left")
            list.addMaterial(blue, "bottom")
            list.addMaterial(orange, "back")
            return new Cube(list, size, size, size, 1, 1, 1, 0, 0)
        }
        
        public function Main() {
            model = createCube(500)
            scene.addChild(model)
            
            startRendering()
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown)
            
            tweenCamera(-1, +1);
            tweenModel(4, 4, 0, 5);
        }
        
        private function tweenCamera(dx: int, dy: int, _t: Number = DEFAULT_TIME): void {
            var _r: Number = (180 + dx * 25) * DEGREE_TO_RADIAN
            var _y: Number = 400 * dy
            
            Tweener.addTween(camera, { x: 1000 * Math.sin(_r), time: _t, transition: DEFAULT_TRANSITION } );
            Tweener.addTween(camera, { z: 1000 * Math.cos(_r), time: _t, transition: DEFAULT_TRANSITION } );
            Tweener.addTween(camera, { y: _y, time: _t, transition: DEFAULT_TRANSITION } );
        }
        
        private function tweenModelMain(v: Number3D, _t: int): void {
            Tweener.addTween(model, { rotationX: v.x, time: _t, transition: DEFAULT_TRANSITION } );
            Tweener.addTween(model, { rotationY: v.y, time: _t, transition: DEFAULT_TRANSITION } );
            Tweener.addTween(model, { rotationZ: v.z, time: _t, transition: DEFAULT_TRANSITION } );
        }
        
        private function tweenModel(dx: int, dy: int, dz: int, _t: Number = DEFAULT_TIME): void {
            /* problem
             * 今はモデルの向きを考慮した方向転換ができていないため、この部分は課題である。
             * カメラから見えている面に対して直感的な方向転換操作ができれば良い
             */
            direction = new Number3D(direction.x + dx * 90, direction.y + dy * 90, direction.z + dz * 90)
            tweenModelMain(direction, _t)
        }
        
        private function reset(_t: Number = DEFAULT_TIME): void {
            direction = Number3D.ZERO
            tweenModelMain(direction, _t)
        }
        
        private function onKeyDown(e: KeyboardEvent): void {
            switch (e.keyCode) {
            // cursor
            case 37: break // left
            case 38: break // up
            case 39: break // right
            case 40: break // down
            
            // camera control
            case 32: tweenCamera(0, 0); break   // Space
            case 81: tweenCamera(+1, +1); break // Q 
            case 69: tweenCamera(-1, +1); break // E
            case 90: tweenCamera(+1, -1); break // Z
            case 67: tweenCamera(-1, -1); break // C
            
            // model control
            case 82: reset(); break              // R Reset
            case 87: tweenModel(-1, 0, 0); break // W X-
            case 65: tweenModel(0, -1, 0); break // A Y-
            case 83: tweenModel(0, -2, 0); break // S reverse
            case 68: tweenModel(0, +1, 0); break // D Y+
            case 88: tweenModel(+1, 0, 0); break // X X+
            case 70: tweenModel(0, 0, -1); break // F Z-
            case 71: tweenModel(0, 0, +1); break // G Z+
            }
        }
    }
}

Forked