Eskiden Flash animasyonları içerisinde 3 boyutlu görüntüler elde etmek için 2 li koordinat sistemi üzerinde bir çok matematiksel dönüşüm yapmamız gerekiyordu.  Papervision3D kütüphanesi bize Flash için kolay kullanılabilir ve güvenili3 3D motoru sunuyor.

Papervision3D nin en çok sevdiğim özelliği size de hareket alanı bırakması. Her sınıf nesne yönelimli programcılık mantığı ile yazılmış. Sınıfları genişleterek ( extend ) kütüphane özelliklerini arttırmanız mümkün.

Papervision3D temel yapılandırmasında : Kameralar ( Camera ), Görüntü Kapıları ( Viewports ), Sahne ( Scene ), ve Sahneleme Motorundan ( Renderer Engine ) oluşuyor. Bunun haricinde isterseniz benim yaptığım gibi Görüntü Kapısı Katmanlarını ( Viewport Layers ) kullanabilirsiniz. Bu katmanlar size katman bazında filtreleme seçeneği sunuyor.

Aşağıda gördüğünüz animasyonu yapmak sadece 15 dakikanızı alıyor. 4 adet yazıyı 3 boyutlu uzayda yerleştirdim. Herbir yazı için görüntü kapısı katmanı oluşturdum. Kameranın yazı ile olan mesafesine bakarak katman üzerinde Bulanıklık (blur) filtresi uyguladım. ( Bulanıklık için x2 formulü kullandım bu yüzden biraz keskin sonuçlar aldık. Daha yumuşak geçişler için farklı formüller kullanabilirsiniz. )

 

 

Aşağıdaki alanda animasyona ait 3D kodunu bulabilirsiniz.

package tr.semere.works.orkestra.uc
{
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.Sprite;   
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BlurFilter;
    import org.papervision3d.core.math.Number3D;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.view.layer.ViewportLayer;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.render.BasicRenderEngine;        
    import tr.semere.threed.fonts.gtech_font_orkestra;
    import tr.semere.threed.fonts.gtech_font_std3d;
    import org.papervision3d.typography.Font3D;
    import org.papervision3d.typography.Text3D;
    import tr.semere.util.Gtech3D_Util;
    import com.hydrotik.go.HydroSequence;
    import com.hydrotik.go.HydroTween;   
    /**
    $(CBI)* ...
    $(CBI)* @author Volkan Günaydın
    $(CBI)*/
    public class OrkestraUC_MainMovie extends MovieClip
    {
        public var viewport: Viewport3D;
        public var scene: Scene3D;
        public var camera: Camera3D;
        public var material: ColorMaterial;
        public var primitive: Plane;
        public var renderer: BasicRenderEngine;       
        public var stageWidth:Number;
        public var stageHeight:Number;
        public var autoScaleToStage:Boolean = true;
        public var isInteractive: Boolean = true;
        public var autoClipping : Boolean = false;
        public var autoCulling : Boolean = false;               
        public var orkestraYazisi:Text3D;
        public var orkestraLayer:ViewportLayer;
       
        public var text1:Text3D;
        public var layer1:ViewportLayer;
        public var text2:Text3D;
        public var layer2:ViewportLayer;               
        public var text3:Text3D;
        public var layer3:ViewportLayer;
        public var text4:Text3D;
        public var layer4:ViewportLayer;
       
        public var orkestraYaziDepth:Number = 0;
        public var tmpCounter:Number = 0;
        public var layerDepths = [];
       
        public var cameraTarget:DisplayObject3D;
        //public var cameraPositionVariable:Number3D = new Number3D(0,0,-500);
        public function OrkestraUC_MainMovie()
        {
            this.initSimple3D();
            this.simpleSetup();
            HydroTween.init3D(this.renderer, this.scene, this.camera, this.viewport);
            this.animationStart();
        }
        public function simpleSetup()
        {
            this.orkestraYazisi = Gtech3D_Util.create3DText("Orkestra", new gtech_font_orkestra(), "orkestra1", 0xFFFFFF, 1.0);
            this.orkestraYazisi.scale = 3;
            this.orkestraYazisi.material.doubleSided = true;
            this.scene.addChild(this.orkestraYazisi );
            this.orkestraLayer =   this.viewport.getChildLayer(this.orkestraYazisi, true, true);
           
           
            this.text1 = Gtech3D_Util.create3DText("Web Sitemiz", new gtech_font_std3d(), "text1", 0xFFFFFF, 1.0);
            this.text2 = Gtech3D_Util.create3DText("Yapım Aşamasındadır", new gtech_font_std3d(), "text2", 0xFFFFFF, 1.0);
            this.text1.material.doubleSided = true;
            this.text2.material.doubleSided = true;
            text1.x = 500;
            text1.y = 500;
            text1.z = 800;
            text2.x = 500;
            text2.y = 400;
            text2.z = 800;
            text1.rotationY = 130;
            text2.rotationY = 145;
           
            this.scene.addChild(text1);
            this.scene.addChild(text2);           
            this.layer1 =  this.viewport.getChildLayer(this.text1, true, true);
            this.layer2 =  this.viewport.getChildLayer(this.text2, true, true);
           
            this.text3 = Gtech3D_Util.create3DText("FLASH ile 3D", new gtech_font_std3d(), "text3", 0xFFFFFF, 1.0);
            this.text3.material.doubleSided = true;
            this.text3.position = new Number3D( -300, -300, -400);
            this.scene.addChild(text3);
            this.layer3 = this.viewport.getChildLayer(this.text3, true, true);
           
            this.text4 = Gtech3D_Util.create3DText("www.orkestra.com.tr", new gtech_font_std3d(), "text4", 0xFFFFFF, 1.0);
            this.text4.material.doubleSided = true;
            this.text4.position = new Number3D( -300, 300, 400);
            this.text4.rotationY = 45;
            this.scene.addChild(text4);
            this.layer4 = this.viewport.getChildLayer(this.text4, true, true);
           
           
            this.addEventListener(Event.ENTER_FRAME, this.onEnterFrameDefault);
            this.addEventListener(MouseEvent.MOUSE_OVER, this.onMouseOver);
           
            //this.camera.target = this.orkestraYazisi;
        }
        public function updateYaziDepth(s:String, d:Number, l:ViewportLayer) {                       
            var tmp = parseFloat(this.layerDepths[s]);
            if (d > 0 && tmp != d) {
                if (d > 10) { d = 10;  }
                l.filters = [new BlurFilter(d, d, 1)];
                this.layerDepths[s] = d;
            }           
        }   
        public function cameraUzakliginiKontrolEt(s:String,e:Number3D,l:ViewportLayer) {
            tmpCounter++;
            if (true) {
                tmpCounter = 0;
                var dx   = camera.x -e.x;
                var dy   = camera.y -e.y;
                var dz   = camera.z -e.z;
                var dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
                var blurVal = Math.round(dist*dist / 4000) / 100 - 1.0;
                this.updateYaziDepth( s, blurVal, l );               
            }
        }
        public function initSimple3D() {
            this.viewport = new Viewport3D(this.stageWidth, this.stageHeight, this.autoScaleToStage, this.isInteractive, this.autoClipping, this.autoCulling);           
            this.scene  = new Scene3D();
            this.camera = new Camera3D();
            this.renderer = new BasicRenderEngine();           
            this.addChild(this.viewport);
            this.cameraTarget = new DisplayObject3D();
            this.scene.addChild(this.cameraTarget);
            this.camera.target = this.cameraTarget;
        }       
        public function renderScene() {
            this.renderer.renderScene(this.scene,this.camera,this.viewport);
        }
        public function onEnterFrameDefault(e:Event):void {       
            cameraUzakliginiKontrolEt("orkestra", this.orkestraYazisi.position, this.orkestraLayer);
            cameraUzakliginiKontrolEt("text1", this.text1.position, this.layer1);
            cameraUzakliginiKontrolEt("text2", this.text2.position, this.layer2);
            cameraUzakliginiKontrolEt("text3", this.text3.position, this.layer3);
            cameraUzakliginiKontrolEt("text4",this.text4.position,this.layer4);
            this.renderScene();
        }           
        public function onMouseOver(e:MouseEvent):void {
        }
        public function startOver() {
            this.animationStart();
        }
        public function animationStart() {
            var fuse:HydroSequence = new HydroSequence();
           
            fuse.addItem( { target:camera, x:300, y:300, z: -1000, duration:5 } );
            fuse.addItem( { target:camera, x:2000, y:2000, z: -3000, duration:2 } );
            fuse.addItem( { target:camera, x:530, y:0, z: 2000, duration:4 } );           
            fuse.addItem( { target:this.cameraTarget, x:text3.x, y:text3.y, z:text3.z } );           
            fuse.addItem( { target:camera, x: -800, y: -300, z: -610, duration:5 } );
           
            fuse.addItem( { target:this.cameraTarget, x:text4.x, y:text4.y, z:text4.z, duration:1 } );
            fuse.addItem( { target:camera, x: -800, y: 300, z: -610, duration:1 } );
            fuse.addItem( { target:camera, x: -800, y: 300, z: -110, duration:5 } );
           
            fuse.addItem( { target:this.cameraTarget, x:0, y:0, z:0, duration:1 } );
            fuse.addItem( { target:camera, x:0, y:0, z: -1000, duration:5 },{func: startOver } );
            fuse.start();
        }
    }
   
}

 

 

 

 

Tasarı Web Sitesini Zorunlu Kılmakla Neyi Amaçlıyor? Hiç Web Sitesi Yaptırmayan ya da Yasaya Uygun Web Sitesi Yaptırmayan Sermaye Şirketleri Ne Olacak?Tasarı Web Sitesini Zorunlu Kılmakla Neyi Amaçlıyor?[Detay]
Hangi Şirketler Web Sitesi Yapmak Zorunda Kalacaklar? 1502 nolu madde, Anonim Şirketler, Limited Şirketler, Sermayesi Paylara Bölünmüş Komandit ŞirketlerHangi Şirketler Web Sitesi Yapmak Zorunda Kalacaklar?[Detay]
1502 Madde Sayılı Web Sitesi Yaptırma Zorunluluğu Hakkında Kanun ; 1502 Madde Sayılı Web Sitesi Yaptırma Zorunluluğu Hakkında Kanun ; [Detay]
Flash 3D uygulamalarıFlash 3D uygulamaları için papervision3d öneriyoruz.[Detay]
5651 Sayılı Kanun5651 Sayılı Kanun[Detay]
Web Sitesi ve Web Tasarım Nasıl Olmalıdır?Web Sitesi ve Web Tasarım Nasıl Olmalıdır?[Detay]
Flash 3D uygulamalarıFlash 3D uygulamaları için papervision3d öneriyoruz.[Detay]