Loading:

Promocja Helion.pl

Kostka 6 boczna obracana w trójwymiarze 3D [ ActionScript 3 ]

Skrypt tworzy obracająca się kostkę 3D, złożoną z 6 różnokolorowych boków. Kostka się obraca się proporcjonalnie do wychylenia najechanego kursora myszki.

 

Efekt trój wymiaru dla kilku kostki 3D, zbudowanej z trójkątów.

 

Wersja On-Line:

 



Napisz Artykuł

Listing

//KOD DLA KLASY Kostka3D.as

package {
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;

        public class Kostak3D extends Sprite
        {
                private var punkty:Array;
                private var trojkaty:Array;
                private var fl:Number = 250;
                private var vpX:Number = stage.stageWidth / 2;
                private var vpY:Number = stage.stageHeight / 2;
               
                public function Kostka3D()
                {
                        init();
                }
               
                private function init():void
                {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                       
                        punkty = new Array();
                        // front four corners
                        punkty[0] = new Point3D(-100, -100, -100);
                        punkty[1] = new Point3D( 100, -100, -100);
                        punkty[2] = new Point3D( 100,  100, -100);
                        punkty[3] = new Point3D(-100,  100, -100);
                        // back four corners
                        punkty[4] = new Point3D(-100, -100,  100);
                        punkty[5] = new Point3D( 100, -100,  100);
                        punkty[6] = new Point3D( 100,  100,  100);
                        punkty[7] = new Point3D(-100,  100,  100);
                        for(var i:uint = 0; i < punkty.length; i++)
                        {
                                punkty[i].setVanishingPoint(vpX, vpY);
                                punkty[i].setCenter(0, 0, 200);
                        }
                       
                        trojkaty = new Array();
                        // front
                        trojkaty[0] = new Triangle(punkty[0], punkty[1], punkty[2], 0x6666cc);
                        trojkaty[1] = new Triangle(punkty[0], punkty[2], punkty[3], 0x6666cc);
                        // top
                        trojkaty[2] = new Triangle(punkty[0], punkty[5], punkty[1], 0x66cc66);
                        trojkaty[3] = new Triangle(punkty[0], punkty[4], punkty[5], 0x66cc66);
                        //back
                        trojkaty[4] = new Triangle(punkty[4], punkty[6], punkty[5], 0xcc6666);
                        trojkaty[5] = new Triangle(punkty[4], punkty[7], punkty[6], 0xcc6666);
                        // bottom
                        trojkaty[6] = new Triangle(punkty[3], punkty[2], punkty[6], 0xcc66cc);
                        trojkaty[7] = new Triangle(punkty[3], punkty[6], punkty[7], 0xcc66cc);
                        // right
                        trojkaty[8] = new Triangle(punkty[1], punkty[5], punkty[6], 0x66cccc);
                        trojkaty[9] = new Triangle(punkty[1], punkty[6], punkty[2], 0x66cccc);
                        // left
                        trojkaty[10] = new Triangle(punkty[4], punkty[0], punkty[3], 0xcccc66);
                        trojkaty[11] = new Triangle(punkty[4], punkty[3], punkty[7], 0xcccc66);
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
               
                private function onEnterFrame(event:Event):void
                {
                        var angleX:Number = (mouseY - vpY) * .001;
                        var angleY:Number = (mouseX - vpX) * .001;
                        for(var i:uint = 0; i < punkty.length; i++)
                        {
                                var punkt:Point3D = punkty[i];
                                punkt.rotateX(angleX);
                                punkt.rotateY(angleY);
                        }
                       
                        graphics.clear();
                        for(i = 0; i < trojkaty.length; i++)
                        {
                                trojkaty[i].draw(graphics);
                        }
                }
        }
}



//KOD DLA KLASY Point3D.as

package
{
        public class Point3D
        {
                public var fl:Number = 250;
                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;
                public var x:Number = 0;
                public var y:Number = 0;
                public 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 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;
                }
               
                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;
                }
        }
}


Ten wpis posiada swój wątek na forum

Wszystkie pytania prosimy kierować właśnie tam ponieważ komentarze to miejsce na poprawki do kodu lub alternatywne rozwiązania i pytania nie będą publikowane

http://forum.funkcje.net/forum/viewtopic.php?f=12&t=5283

Dane do logowania na forum są takie same jak na funkcje.net



Dodano przez: divix
Ranga: Administrator serwisu Punktów: 38323
Komentarze użytkowników
    • Treść komentarza
      Kod do komentarza (opcjonalnie)
      PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
      Autor
      Token
      token

       

       








funkcje.net
Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-17 v.1.5 | design: diviXdesign & rainbowcolors