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();
        }
    }
   
}

 

 

 

 

Gtech Yazılım Çözümleri , DuyurularGtech Yazılım çözümleri hakkında bu alanda detaylı bilgi ve haber bulabilirsiniz.
İçeriği Göster
İlaç Takip Sistemi 1 Temmuzda BaşlıyorSahte ilaçların önlenmesi amacıyla her ilaca bir kimlik numarası verilmesi yoluyla ''İlaç Takip Sistemi'' kurulmasına öngören uygulamanın yürürlük tarihi 1 ay ertelendi. Sistem 1 Haziran yerine 1 Temmuzda hayata geçecek.
İçeriği Göster
KAREKOD Nedir?KAREKOD Nedir?
İçeriği Göster
Karekod İle İlgili SorularKarekod İle İlgili Sorular
İçeriği Göster
Karekod içerisinde ne kadar bilgi saklayabilirim?Karekod içerisinde ne kadar bilgi saklayabilirim?
İçeriği Göster
Neden KAREKOD ( Datamatris Barkod ) İlaç Takip sistemi için seçildi ?Neden KAREKOD ( Datamatris Barkod ) İlaç Takip sistemi için seçildi ?
İçeriği Göster
Barkod Neden Gereklidir?Barkod Neden Gereklidir?
İçeriği Göster
Küpür kalkıyor mu?Küpür kalkıyor mu?
İçeriği Göster
Karekod imalat esnasında mı basılmalıdır?Karekod imalat esnasında mı basılmalıdır?
İçeriği Göster
Ambalaj değişiklikleri varyasyon kapsamında mı değerlendirilecektir?Ambalaj değişiklikleri varyasyon kapsamında mı değerlendirilecektir?
İçeriği Göster