Dersler RSS Ders : 3D

Profili Göster

Papervision: 3D küp ve kaplamalar

Tuncay Özbal Tarih: 13/09/2008 Yorum: 12 adet

Okunma : 701 Tutanlar: Bu yazıyı 3 kişi tuttu.

Bu derste 3D bir kübü yapılandıracağız.Ve farklı materyallerle kaplıyacağız. Kamera ve renderer-lardan bahsedeceğiz.

Bu çalışmamız sadece konuya giriş niteliğinde olduğundan class yazmadan sadece FLA ya kod yazarak çalışacağız.Öncelikle Papervision u çalıştırabilmeniz için Class dosyalarına sahip olmanız gerekir.Buradan indirebilirsiniz. Yeni bir Flash(AS3) dosyası açıp indirdiğimiz dosyanın içinde org klasörüyle aynı dizine kaydediyoruz. MMİstanbul Herşey tamamsa kod yazmaya gecebiliriz.


import org.papervision3d.view.Viewport3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.MovieAssetMaterial;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.utils.MaterialsList;

Bu kod bloğunda kullanacağımız sınıfları import ettik.Daha kolay yoldanda bunu yapabilirdik. Örneğin:


import org.papervision3d.materials.*;

demiş olsaydık tüm materyalleri tek satırda import ederdik.Ancak kullanmadığımız sınıfları import etmek bize performans kaybettirecektir.Bunun için her bir sınıfı ayrı ayrı import edeceğiz.Ancak bu sandığınız kadar zahmetli bir iş değil.Çok kolay bir yöntemi var ancak bu yöntemi diğer yazılarda anlatacağım.Şimdilik kendiniz yazmanız yararınızadır. Sınıfın yapısını incelemiş olursunuz.

Import aşamasını geçtiğimzie göre sahnemizi ve kameralarımızı yapılandıralım:


var viewport:Viewport3D
var sahne:Scene3D
var kamera:Camera3D
var renderer:BasicRenderEngine

En temel ekipmanlarımız bunlar ve ilerde bir Base class yazıp bunlarıda sürekli tanımlamaktan kurtulacağız.Yoksa her çalışmada yeniden yeniden tanımlamak bize zaman kaybettirir.Objelerimizi tanıyalım:

Viewport:Bakış açısıdır.Movieclip tipindedir.Aynı zamanda sahnemizi taşır.Gerekirse görüntüsü kaplama olarak bile kullanılabilir.Bir çok viewport çeşidi ve her birinin ayrı işlevi vardır.Biz en çok Viewport3D yi kullanacağız.

Sahne:3D objeleri taşır.Obje ekleyip çıkartabiliriz.Başka sahne çeşitleride vardır. Ama biz hep Scene3D yi kullanacağız.

Kamera:Sahneye bakabilmemizi sağlar."org\papervision3d\cameras" dizininde başka kameralarda vardır.Genelde Camera3D yi kullanacağız.

Renderer:Hesaplayıcı.Sahneyi hesaplayıp koda çevirir."org\papervision3d\render" dizinde tanımlıdırlar.BasicRenderEngine-i her uygulamamızda kullanacağız.

Şimdide sırada tanımladığımız objeleri yapılandırmaya geldi:


viewport=new Viewport3D(800,600);
//800*600 sahne boyunu temsil etmektedir.Başka parametreleride vardır ancak bunlara 3DEventlarla birlikte değineceğiz.
sahne=new Scene3D();
//Parametresi yoktur
kamera=new Camera3D();,
//Parametresi vardır.Ancak giriş zorunluluğu yoktur.
renderer=new BasicRenderEngine();
//Parametresi yoktur.

this.addChild(viewport);
//Viewportu sahneye(Flash sahnesi) eklemezsek görüntüyü alamayız.

Basit olarak sahnemizide oluşturduk.Şimdi 2 eksiğimiz var.Birincisi sahnemizde hiç bir obje yok.İkincisi sahnemiz render edilmiyor. Öncelikle ilk aşamayı yapalım:


var cizgi_kaplama:WireframeMaterial=new WireframeMaterial(0xFF00FF,1,1);
//Bir tane WireFrameMaterial tanımladık.Bu kaplama malzemesi tel kafes şeklinde kaplama //yapacaktır.İlk parametre kaplamanın rengini belirler.İkinci parametre çizginin alpha //değerini belirtir.Üçüncü parametre çizginin kalınlık değeridir.

var renk_kaplama:ColorMaterial = new ColorMaterial(0xFF00FF, 1);
//ilk parametre renk, ikinci parametre alpha
var resim_kaplama:BitmapFileMaterial=new BitmapFileMaterial("1.jpg");
resim_kaplama.precise=true
//Bu kaplamada resim dosyasının yolunu yazıyoruz
//precise özelliği varsayılan olarak false tur.Bunu true yaparak resmin içeri doğru çökmesini engelliyoruz.

var mc_kaplama:MovieAssetMaterial=new MovieAssetMaterial("library_mc",true,true);
//Bir MovieClibi de kaplama olarak kullanabiliriz.Bunun farklı bir çok yolu var.Bu örnekte Bir mc oluşturup linkagesini
//library_mc olarak değiştirelim.
//İkini parametre mc nin transparan özelliğini
//Üçüncü parametre animasyon olup olmayacağını belirler

var liste:MaterialsList = new MaterialsList( {   front:cizgi_kaplama,   back:renk_kaplama,   top:mc_kaplama,   bottom:mc_kaplama,   left:resim_kaplama,   right:resim_kaplama});
//Küp özel bir format olduğundan her yüzeyine ayrı kaplama malzemesi kullanabiliriz.
//Hepsine aynı malzemeyide kullanabiliriz.Bunun için MaterialsList i kullanıyoruz.
//Tüm yüzeyler aynı olacaksa all diyerek tümünü değiştirebiliriz
//MaterialsList sadece küplerde değil bdiğer bazı özel 3D objelerdede kullanılabilir

var kup:Cube = new Cube(liste, 500, 500, 500);
//ilk parametre kaplamanın malzemesi
//ikinci parametre genişlik
//üçüncü  parametre derinlik
//dördüncü  parametre yükseklik

sahne.addChild(kup);
//ve kübümüzü sahneye ekledik.


//sıra geldi render almaya.
//Sürekli render alacağımızdan bir event oluşturup içerisinde
//sahneyi sürekli hesaplıyacağız.
this.addEventListener(Event.ENTER_FRAME,render);
function render(e:Event):void {
    renderer.renderScene(sahne, kamera, viewport);
    var uzaklikX:Number = mouseX - stage.stageWidth * 0.5;//mouseX in sahnedeki konumu
    var uzaklikY:Number = mouseY - stage.stageHeight * 0.5;//mouseY nin sahnedeki konumu
    kup.rotationY += uzaklikX * 0.05;//Bu konuma göre küp Y rotasyonunda dönecektir.
    kup.rotationX += -uzaklikY * 0.05;
    //Sahne sürekli render edildiğinden kup mouse a duyarlı olacaktır.

}

kup.swf

İlerde tüm objeleri dahada detaylı olarak inceliyeceğiz.Örneğin kübün tel kafes yüzeyinde neden sadece 2 tane yüzey olduğunu mouse ile hangi yüzeye tıklandığını nasıl bulacağımızı bir sonraki yazıda inceliyeceğiz. Fla dosyası: kup.zip

Kaynak(güncel)

İyi çalışmalar.

aç-kapa İçeriğin rss beslemesi kullanımda değil Yorumlar

Profili Göster
Mehmet KARACA 13/09/2008

süpersin eline salık

event vertex ve faces deformans yonları golge ve ışık ayarlarını da bekliyoruz..

kolay gelsin..<<

Profili Göster
Tuncay Özbal 13/09/2008

Eğer yazabilirsem bundan 2 ders sonra bahsettiğin konulara giriş yapmayı deniyeceğim. Işık,gölge,modifier ve 3DsMax ile en kolay etkileşim.

Profili Göster
Ertuğrul Erkan 14/09/2008

bende bununla ilgili çalışıyorum fakat plane diye bir methodun olmadığını söylüyor :)

Profili Göster
Tuncay Özbal 14/09/2008
//öncelikle Plane sınıfını import etmelisin
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.ColorMaterial;

//sonrada bi plane tanımlayıp sahneye eklemelisin 
var zemin:Plane = new Plane(new ColorMaterial(0xFF00FF, 1), 1000, 1000, 10, 10);
sahne.addChild(zemin);

.

Profili Göster
Ertuğrul Erkan 14/09/2008

yardım için teşekkürler yanlız problem bundan değilmiş. ben bu dosyaları yanlış bir yere koymuşumda ondan tanımıyormuş.

Profili Göster
Tuncay Özbal 14/09/2008

Ertuğrul:

halettiğine sevindim.

Mehmet:

Biraz az önce basit bi Mouse3D örneği hazırladım. Örnekte vertexşer iç içe geçiyor.Bunun engellemenin yolları var ancak bu örnekte buna gerek duymadım.

Önizleme Kaynak

Profili Göster
Mehmet KARACA 14/09/2008

merhaba Tuncay

bende bir ornek hazırladım. örnek

seninkinide simdi inceleyecegim umarıne 3d event felan vardır :)

tesekkürler kolaygelsin..<<

Profili Göster
Mehmet KARACA 14/09/2008

merhaba

örneginede kodlara baktım istedigim gibi mouse3D örneklemissin tesekkürler

ama TBase dosyasını verir sen çalıstırayım onu unutmussun.

kolaygelsin..<<

Profili Göster
Tuncay Özbal 14/09/2008

Güzel çalışma olmuş Mehmet.eline sağlık

sanırım face3D yi kullanmışsın :)

bende yaşlılıktan hep yanlış dosya eklemişim sanırım:

GreatWhite Mouse3D Kaynak

Profili Göster
Mehmet KARACA 15/09/2008

merhaba

aslında faces kullanamadım yani direk faces i yönetmenin yolunu bulamadım kenisinde displayObject3D de olan kontrol yapısı yok sanırım.

"faces material ile kaplana bildigine göre Sprite yada MovieClip olmalı eger öle ise en azından x,y si ile oynaya bilmeliyiz."

faces i hareket ettirmeyi kafama koydugum dan bende faces i hareket ettirmek için faces e baglı 3 vertex i hareketlendirdim.

benim suan asıl çözmeye çalıstıgım konu

displayObject.buttonMode olayı

vievport a buttonMode = true verdigimiz de primitives lere event eledigimiz de buttonMode ler çalısıyor ancak MovieMaterial içindeki butonların buttonMode leri aktif deil bu sorunu nasıl asabiliriz.

yani bi haber mdulu yaptım diyelim içinde buton scroll vs.. var bunu material olarak kullandım butonlar çalısıyor ama buttonMode leri aktif degil :S

tesekkürler kolaygelsin..<<

Profili Göster
Tuncay Özbal 17/09/2008

sanırım buu konudada yaptığım bir örnek vardı. bulursam eklerim. iyi çalışamalar.

Profili Göster
Mehmet KARACA 18/09/2008

ne yaptıysam MovieMaterial içindeki butonlara movieClip lere buttonMode veremedim :S

tesekkürler..<<

aç-kapa Yazarın Diğer Yazıları

Makale

İlişkili makale bulunamadı.

yeni bir tane ekleyin

Haber

İlişkili haber bulunamadı.

yeni bir tane ekleyin

yeni üyelik | şifremi unuttum

aç-kapa Toplantı Kahraman ve need4code.com Projesi Connect Toplantısı

Kahraman ve need4code.com Projesi Connect Toplantısı

Selam arkadaslar, Programlama ile uğraşanların hayatlarını kolaylaştıracak desktop ve web tabanlı ortak iki proje ile ilgili 3. toplantımızı 3Aralık...
Kategori: Toplantı