forked from: Flashで作る3Dのお勉強9

by fukt
Flashで作る3Dのお勉強9
プレートを敷き詰めてみた。z軸が同じ時、回転した状態の重なり順はどうやって表現するのだろうか?
たぶん僕には無理。
♥0 | Line 183 | Modified 2010-10-02 08:52:44 | MIT License
play

ActionScript3 source code

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

// forked from ta6b's Flashで作る3Dのお勉強9
//Flashで作る3Dのお勉強9
//プレートを敷き詰めてみた。z軸が同じ時、回転した状態の重なり順はどうやって表現するのだろうか?
//たぶん僕には無理。
package 
{
    import flash.display.*;
    import flash.events.Event;
    import flash.events.MouseEvent;
        [SWF(backgroundColor=0x333333, frameRate=6)]
    public class Main extends Sprite
    {
        private var vpX:Number = stage.stageWidth / 2;
        private var vpY:Number = stage.stageHeight / 2
        private var squares:Array;
        private var numSquares:Number = 25;
        function Main() {
            init();
        }
        
        private function init():void {
            squares = new Array();
            for (var i:int = 0; i < numSquares; i++){
                var square:Lines3D2 = new Lines3D2(vpX, vpY);
                addChild(square);
                squares.push(square);
                if(i<5){
                    square.y = -200;
                    square.x = -200 + i * 100;
                }else if (i >= 5 && i < 10) {
                    square.y = -100;
                    square.x = -200 + (i-5) * 100;
                }else if (i >= 10 && i < 15) {
                    square.y = 0;
                    square.x = -200 + (i-10) * 100;
                }else if (i >= 15 && i < 20) {
                    square.y = 100;
                    square.x = -200 + (i-15) * 100;
                }else if (i >= 20 && i < 25) {
                    square.y = 200;
                    square.x = -200 + (i-20) * 100;
                }
                square.zpos = i;
                square.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
            }
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
        
        private function mouseOverHandler(e:MouseEvent):void {
            e.currentTarget.zpos = numSquares;
        }
        
        private function enterFrameHandler(e:Event):void {
            sortZ();
        }
        
        private function sortZ():void {
            squares.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
            for (var i:int = 0; i < numSquares; i++) {
                var square:Lines3D2 = squares[i];
                setChildIndex(square, i);
            }
        }
    }
}
import flash.display.Sprite;
import flash.events.*;
    
    class Lines3D2 extends Sprite 
    {
        private var points:Array;
        private var numPoints:int = 4;
        private var fl:Number = 250;
        private var vpX:Number;
        private var vpY:Number;
        public var zpos:Number;
        
        public function Lines3D2(vpX:Number, vpY:Number) {
            this.vpX = vpX;
            this.vpY = vpY;
            init();
        }
        
        private function init():void {
            points = new Array();
            points[0] = new Point3D( -90, -90, 0);
            points[1] = new Point3D(  90, -90, 0);
            points[2] = new Point3D(  90,  90, 0);
            points[3] = new Point3D( -90,  90, 0);
            for (var i:int = 0; i < numPoints; i++) {
                points[i].setVanishingPoint(vpX, vpY);
                points[i].setCenter(0, 0, 200);
            }
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
        }
        
        private function enterFrameHandler(e:Event):void {
            graphics.clear();
            graphics.lineStyle(0);
            graphics.beginFill(0xff0000);
            graphics.moveTo(points[0].screenX, points[0].screenY);
            for (var i:int = 1; i < numPoints; i++) {
                graphics.lineTo(points[i].screenX, points[i].screenY);
            }
            graphics.lineTo(points[0].screenX, points[0].screenY);
            graphics.endFill();
        }
        
        private function mouseOverHandler(e:MouseEvent):void {
            addEventListener(Event.ENTER_FRAME, rotateY1);
        }
        
        private function rotateY1(e:Event):void {
            var angleY:Number = 5*Math.PI/180;
            for (var i:int = 0; i < numPoints; i++) {
                var point:Point3D = points[i];
                point.rotateY(angleY);
            }
            if (point.rotationY > Math.PI-angleY) {
                var sabun:Number = point.rotationY - Math.PI;
                for (i = 0; i < numPoints; i++) {
                    point = points[i];
                    point.rotateY(sabun);
                }
                removeEventListener(Event.ENTER_FRAME, rotateY1);
                point.rotationY = 0;
                return;
            }
            //trace(point.rotationY);
        }
    }
class Point3D 
    {
        public var fl:Number = 250;
        public var _rotationY:Number = 0;
        private var vpX:Number = 0;
        private var vpY:Number = 0;
        private var cX:Number = 0;
        private var cY:Number = 0;
        private var cZ:Number = 0;
        private var x:Number = 0;
        private var y:Number = 0;
        private var z:Number = 0;
        
        public function Point3D(x:Number = 0, y:Number = 0, z:Number = 0) {
            this.x = x;
            this.y = y;
            this.z = z;
        }
        
        public function setVanishingPoint(vpX:Number, vpY:Number):void {
            this.vpX = vpX;
            this.vpY = vpY;
        }
        
        public function setCenter(cX:Number, cY:Number, cZ:Number = 0):void {
            this.cX = cX;
            this.cY = cY;
            this.cZ = cZ;
        }
        
        public function get screenX():Number {
            var scale:Number = fl / (fl + z + cZ);
            return vpX + cX + x * scale;
        }
        
        public function get screenY():Number {
            var scale:Number = fl / (fl + z + cZ);
            return vpY + cY + y * scale;
        }
        
        public function get rotationY():Number {
            return _rotationY;
        }
        
        public function set rotationY(angleY:Number):void {
            _rotationY = angleY;
        }
        
        public function rotateX(angleX:Number):void {
            var cosX:Number = Math.cos(angleX);
            var sinX:Number = Math.sin(angleX);
            
            var y1:Number = y * cosX - z * sinX;
            var z1:Number = z * cosX + y * sinX;
            
            y = y1;
            z = z1;
        }
        
        public function rotateY(angleY:Number):void {
            var cosY:Number = Math.cos(angleY);
            var sinY:Number = Math.sin(angleY);
            
            var x1:Number = x * cosY - z * sinY;
            var z1:Number = z * cosY + x * sinY;
            
            x = x1;
            z = z1;
            _rotationY += angleY;
        }
        
        public function rotateZ(angleZ:Number):void {
            var cosZ:Number = Math.cos(angleZ);
            var sinZ:Number = Math.sin(angleZ);
            
            var x1:Number = x * cosZ - y * sinZ;
            var y1:Number = y * cosZ + x * sinZ;
            
            x = x1;
            y = y1;
        }
    }