Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler JAVA 3D ÖRNEK 1 : Java 3D ile basit üç boyutlu bir küpün oluşturulması ve görüntülenmesi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 // Programın Adı : Kup.java // Programın Tarihi : Eylül 2000 // Kullanılan Yazılım : Jdk1.2 ve Java 3D 1.2 // Basit bir küp nesnesinin oluşturulmasını ve görüntülenmesini sağlayan // Java Programı import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; public class Kup extends Applet { public BranchGroup goruntuAgaciOlustur() { // Görüntü ağacının kökünün oluşturulması BranchGroup kokNesnesi = new BranchGroup(); // Birim dönüşüm grubu düğümü oluşturarak // kök nesnesine çocuk düğüm olarak ekler TransformGroup donusumGrubu = new TransformGroup(); kokNesnesi.addChild(donusumGrubu); // Basit bir Shape3D düğümü (küp) oluşturarak görüntü ağacına // ekler. donusumGrubu.addChild(new ColorCube(0.3)); // Oluşturulan görüntü ağacında optimizasyonların yapılmasını sağlar kokNesnesi.compile(); return kokNesnesi; } public Kup() { // Üç boyutlu bir görüntü uzayı oluşturur setLayout(new BorderLayout()); GraphicsConfiguration konfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(konfig); add("Center", c); // Üç boyutlu bir küp içeren // basit bir sahne oluşturarak sanal evrene bağlar // Sahnenin oluşturulması Y. Doç. Dr. Aybars UĞUR 1 Bilgisayar Destekli Tasarım (Bahar 2001-2002) 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 Java 3D Örnekler BranchGroup sahne = goruntuAgaciOlustur(); SimpleUniverse u = new SimpleUniverse(c); // Görüntü platformunu geriye çekerek sahnedeki nesnelerin // görüntülenebilmesini sağlar u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } // // Kup programının hem bir applet hem de bir application olarak // çalıştırılmasını sağlar // public static void main(String[] args) { new MainFrame(new Kup(), 320, 240); } } Bu program hem applet hem de uygulama (application) olarak çalışabilmektedir. Bu programın çalıştırılması sonucunda oluşan applet penceresinde bir küpün ön yüzeyi görünecektir (Şekil 1). Şekil 1 : Üç boyutlu bir küp nesnesinin ön yüzeyinin görüntülenmesi Programda sadece bir küp nesnesi oluşturularak ilk örnek olarak diğer nesneler, örüntüler ve ışıklar eklenmeyerek karmaşıklığın önüne geçilmiştir (Şekil 2). Sonraki örneklerde program adım adım ilerletilecek ve diğer özellikler üzerinde durulacaktır. Programda hazır sınıflardan yararlanılarak oluşturulan bir küp nesnesi bir dönüşüm grubuna bağlanmaktadır. Bu dönüşüm grubu da nesneler dalının kök düğümüne bağlanmaktadır. Y. Doç. Dr. Aybars UĞUR 2 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler Sanal Evren Kök Nesnesi Dönüşüm Nesnesi Şekil 2 : Programda oluşturulan görüntü ağacı JAVA 3D ÖRNEK 2 : Java 3D ile üzerinde fare yardımı ile dönüşüm işlemleri (döndürme, taşıma ve ölçeklendirme) gerçekleştirilebilen basit üç boyutlu interaktif bir küpün oluşturulması ve görüntülenmesi. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // Programın Adı : Interkup.java // Programın Tarihi : Eylül 2000 // Kullanılan Yazılım : Jdk1.2 ve Java 3D 1.2 // Basit bir küp nesnesinin oluşturulmasını ve görüntülenmesini sağlayan // Java Programı (Dönüşüm İşlemleri ekli) import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.behaviors.mouse.MouseRotate; import com.sun.j3d.utils.behaviors.mouse.MouseTranslate; import com.sun.j3d.utils.behaviors.mouse.MouseZoom; import javax.vecmath.*; import javax.media.j3d.*; public class Interkup extends Applet { public BranchGroup goruntuAgaciOlustur() { // Görüntü ağacının kökünün oluşturulması BranchGroup kokNesnesi = new BranchGroup(); // Birim dönüşüm grubu düğümü oluşturarak // kök nesnesine çocuk düğüm olarak ekler TransformGroup donusumGrubu = new TransformGroup(); // donusumGrubu.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); Y. Doç. Dr. Aybars UĞUR 3 Bilgisayar Destekli Tasarım (Bahar 2001-2002) 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 Java 3D Örnekler donusumGrubu.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); kokNesnesi.addChild(donusumGrubu); // Basit bir Shape3D düğümü (küp) oluşturarak görüntü ağacına // ekler. donusumGrubu.addChild(new ColorCube(0.3)); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); // Fare hareketi ile sol tuşa basık iken küpün // döndürülmesini sağlar MouseRotate hareket1 = new MouseRotate(); hareket1.setTransformGroup(donusumGrubu); donusumGrubu.addChild(hareket1); hareket1.setSchedulingBounds(bounds); MouseTranslate hareket2 = new MouseTranslate(); hareket2.setTransformGroup(donusumGrubu); donusumGrubu.addChild(hareket2); hareket2.setSchedulingBounds(bounds); MouseZoom hareket3 = new MouseZoom(); hareket3.setTransformGroup(donusumGrubu); donusumGrubu.addChild(hareket3); hareket3.setSchedulingBounds(bounds); // Oluşturulan görüntü ağacında optimizasyonların yapılmasını sağlar kokNesnesi.compile(); return kokNesnesi; } public Interkup() { // Üç boyutlu bir görüntü uzayı oluşturur setLayout(new BorderLayout()); GraphicsConfiguration konfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(konfig); add("Center", c); // Üç boyutlu bir küp içeren // basit bir sahne oluşturarak sanal evrene bağlar // Sahnenin oluşturulması BranchGroup sahne = goruntuAgaciOlustur(); Y. Doç. Dr. Aybars UĞUR 4 Bilgisayar Destekli Tasarım (Bahar 2001-2002) 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 Java 3D Örnekler SimpleUniverse u = new SimpleUniverse(c); // Görüntü platformunu geriye çekerek sahnedeki nesnelerin // görüntülenebilmesini sağlar u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } // // Interkup programının hem bir applet hem de bir application olarak // çalıştırılmasını sağlar // public static void main(String[] args) { new MainFrame(new Interkup(), 320, 240); } } Program çalıştırıldıktan sonra, farenin sol tuşuna basılarak fare dört yöne hareket ettirildiğinde küp merkezi etrafında döndürülmektedir (Şekil 3). Farenin sağ tuşuna basılı tutularak fare hareket ettirildiğinde ise küp uzayda farenin hareketine göre x, y eksenlerinde taşınmaktadır. Kullanıcı klavyede alt tuşu ve farenin sol tuşu basılı iken fareyi hareket ettirdiğinde ise küp uzayda z ekseninde hareket ederek yakınlaşır veya uzaklaşır. Fare aşağı doğru çekildiğinde küp yakınlaşır; yukarı doğru çekildiğinde ise uzaklaşır. Şekil 3 : Fare ile hareket ettirilebilen interaktif bir kup nesnesi Y. Doç. Dr. Aybars UĞUR 5 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler JAVA 3D ÖRNEK 3 : Java 3D ile bir koni oluşturularak görüntülenmesi (Şekil 4). Örnek 1 üzerinde aşağıda belirtilen değişiklikler yapılmalıdır. Koni nesnesini hazır olarak gelen komutlar yardımı ile oluşturabilmek için aşağıdaki sınıf kütüphanesi eklenmelidir : import com.sun.j3d.utils.geometry.Cone; donusumGrubu.addChild(new ColorCube(0.3)); komutu yerine, Appearance nitelik_koni = new Appearance(); donusumGrubu.addChild(new Cone(0.5f,0.5f,0,50,50,nitelik_koni)); konulmalıdır. Nitelikler için birim Appearance nesnesi oluşturulmuş ve sırayla yarıçapı ve yüksekliği belirtilen bir koni nesnesi sisteme eklenmiştir. Şekil 4 : Java 3D ile koni nesnesi çizdirilmesi JAVA 3D ÖRNEK 4 : Java 3D ile bir silindir oluşturularak görüntülenmesi (Şekil 5). Örnek 1 üzerinde aşağıda belirtilen değişiklikler yapılmalıdır. Silindir nesnesini hazır olarak gelen komutlar yardımı ile oluşturabilmek için aşağıdaki sınıf kütüphanesi eklenmelidir : import com.sun.j3d.utils.geometry.Cylinder; donusumGrubu.addChild(new ColorCube(0.3)); komutu yerine, Appearance nitelik_silindir = new Appearance(); donusumGrubu.addChild(new Cylinder(0.7f,0.4f, Cylinder.GENERATE_TEXTURE_COORDS,50,15, nitelik_silindir)); Y. Doç. Dr. Aybars UĞUR 6 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler konulmalıdır. Nitelikler için birim Appearance nesnesi oluşturulmuş ve sırayla yarıçapı ve yüksekliği belirtilen bir silindir nesnesi sisteme eklenmiştir. Şekil 5 : Java 3D ile silindir nesnesi çizdirilmesi JAVA 3D ÖRNEK 5 : Java 3D ile bir silindir oluşturularak görüntülenmesi (Şekil 6). Örnek 1 üzerinde aşağıda belirtilen değişiklikler yapılmalıdır. Küre nesnesini hazır olarak gelen komutlar yardımı ile oluşturabilmek için aşağıdaki sınıf kütüphanesi eklenmelidir : import com.sun.j3d.utils.geometry.Sphere; donusumGrubu.addChild(new ColorCube(0.3)); komutu yerine, Appearance nitelik_kure = new Appearance(); donusumGrubu.addChild(new Sphere(0.7f, Sphere.GENERATE_TEXTURE_COORDS,50,nitelik_kure)); konulmalıdır. Nitelikler için birim Appearance nesnesi oluşturulmuş ve yarıçapı belirtilen bir küre nesnesi sisteme eklenmiştir. Şekil 6 : Java 3D ile silindir nesnesi çizdirilmesi Y. Doç. Dr. Aybars UĞUR 7 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler JAVA 3D ÖRNEK 6 : Java 3D ile bir kutu (dikdörtgenler prizması) oluşturularak görüntülenmesi (Şekil 7). Örnek 1 üzerinde aşağıda belirtilen değişiklikler yapılmalıdır. Kutu nesnesini hazır olarak gelen komutlar yardımı ile oluşturabilmek için aşağıdaki sınıf kütüphanesi eklenmelidir : import com.sun.j3d.utils.geometry.Box; donusumGrubu.addChild(new ColorCube(0.3)); komutu yerine, Appearance nitelik_kutu = new Appearance(); donusumGrubu.addChild(new Box(0.7f,0.5f,0.5f,nitelik_kutu)); konulmalıdır. Nitelikler için birim Appearance nesnesi oluşturulmuş ve uzunluğu, genişliği, yüksekliği belirtilen bir kutu nesnesi sisteme eklenmiştir. Şekil 7 : Java 3D ile kutu nesnesi çizdirilmesi JAVA 3D ÖRNEK 7 : Java 3D ile zemin renginin verilmesi, üç boyutlu nesnelerin renk niteliklerinin ayarlanması ve nesneler üzerinde dönüşüm işlemlerinin gerçekleştirilmesinin gösterilmesi amacıyla uzayda taşınıp, döndürülüp, küçültülüp renklendirilen bir kutu renklendirilen bir zemin üzerine yerleştirilmiştir (Şekil 8). Örnek 7 de Örnek 1'den türetilmiştir. Örnek3, Örnek4, Örnek5 ve Örnek6'da oluşturulan nesneler orijinde yani koordinat sistemi başlangıç noktasında bulunmaktadır ve yüzeyleri renkli değildir. Bu örnekte bu tür nesneler üzerinde basit renklendirme işleminin setColor metodu ile nasıl yapıldığı gösterilecek, zeminin Background sınıfı yardımı ile siyah renk dışındaki bir renkle nasıl doldurulacağı gösterilecek ve nesnelerin uzayda değişik konumlara, açılara ve büyüklüklere setTranslation, setScale ve rotY gibi metotlarla nasıl getirileceği üzerinde durulacaktır. Vector3f gibi sınıflar kullanıldığından dolayı vecmath ve dikdörtgenler prizması kullanıldığından dolayı geometry.Box paketleri eklenmiştir. Zemin Renginin Ayarlanması // Zemin renginin ayarlanması Color3f zeminRengi = new Color3f(.905f, .905f, 0.95f); Background zeminDugumu = new Background(zeminRengi); zeminDugumu.setApplicationBounds(bounds); kokNesnesi.addChild(zeminDugumu); Y. Doç. Dr. Aybars UĞUR 8 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler Zemin renginin ayarlanması bölümünde r,g,b bileşenleri yani kırmızı, yeşil, mavi renklerin yoğunlukları 1'e yakın olan değerler seçilerek zemin renginin beyaza yakın bir renk olması sağlanmıştır. Oluşturduğum zemin rengini içeren bir zemin düğümü (zeminDugumu) oluşturulmuş ve kök düğüme eklenmiştir. Renkli bir küp nesnesinin sisteme eklenmesi // Renkli bir küp nesnesinin sisteme eklenmesi Appearance nitelik = new Appearance(); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(1.0f,0.0f,1.0f); ca.setShadeModel(ColoringAttributes.SHADE_GOURAUD); nitelik.setColoringAttributes(ca); donusumGrubu.addChild(new Box(0.6f,0.5f,0.4f,nitelik)); ca, renklendirme nitelikleri nesnesi olmak üzere, setColor metodu yardımı ile mor renge ayarlanmıştır. Nesnenin görünümünü belirleyen nitelik nesnesi bu renklendirme niteliklerine göre ayarlanmıştır. En son olarak da bu niteliklerde bir dikdörtgenler prizması (Box) nesnesi sisteme eklenmiştir. // Dönüşüm işlemlerinin gerçekleştirilmesi (taşıma, ölçeklendirme, döndürme) // Dönüşüm işlemlerinin gerçekleştirilmesi (taşıma, ölçeklendirme, döndürme) Transform3D donusum3b = new Transform3D(); donusum3b.setTranslation(new Vector3f(0.3f,0.3f,0.3f)); donusum3b.setScale(0.75); Transform3D t = new Transform3D(); t.rotY(Math.PI/4.0d); donusum3b.mul(t); donusumGrubu.setTransform(donusum3b); Nesnelerin orijinden başka yerlerde, değişik açı ve büyüklüklerde olması istendiğinde standart nesneler üzerinde dönüşüm işlemleri gerçekleştirilir. Başta yeni bir üç boyutlu dönüşüm nesnesi oluşturularak setTranslation metodu ile uzayda sırasıyla x,y ve z eksenlerinde 0.3 birim ileriye alınmıştır. Boyutu 75%'ine indirildikten sonra y ekseni etrafında 45 derece döndürülmüştür. Dönüşüm grubunun parametre değerleri üç boyutlu dönüşüm nesnesinin (donusum3d) değerlerine göre ayarlanmıştır. // Programın Adı : Renkekle.java // Programın Tarihi : Eylül 2000 // Kullanılan Yazılım : Jdk1.2 ve Java 3D 1.2 // Zemin renginin verilmesi, üç boyutlu nesnelerin renk niteliklerinin ayarlanması ve nesneler // üzerinde dönüşüm işlemlerinin (taşıma, ölçeklendirme, döndürme) gerçekleştirilmesi. import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; Y. Doç. Dr. Aybars UĞUR 9 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler import javax.vecmath.*; import com.sun.j3d.utils.geometry.Box; public class Renkekle extends Applet { public BranchGroup goruntuAgaciOlustur() { BranchGroup kokNesnesi = new BranchGroup(); TransformGroup donusumGrubu = new TransformGroup(); kokNesnesi.addChild(donusumGrubu); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); // Zemin renginin ayarlanması Color3f zeminRengi = new Color3f(.905f, .905f, 0.95f); Background zeminDugumu = new Background(zeminRengi); zeminDugumu.setApplicationBounds(bounds); kokNesnesi.addChild(zeminDugumu); // Renkli bir küp nesnesinin sisteme eklenmesi Appearance nitelik = new Appearance(); ColoringAttributes ca = new ColoringAttributes(); ca.setColor(1.0f,0.0f,1.0f); ca.setShadeModel(ColoringAttributes.SHADE_GOURAUD); nitelik.setColoringAttributes(ca); donusumGrubu.addChild(new Box(0.6f,0.5f,0.4f,nitelik)); // Dönüşüm işlemlerinin gerçekleştirilmesi (taşıma, ölçeklendirme, döndürme) Transform3D donusum3b = new Transform3D(); donusum3b.setTranslation(new Vector3f(0.3f,0.3f,0.3f)); donusum3b.setScale(0.75); Transform3D t = new Transform3D(); t.rotY(Math.PI/4.0d); donusum3b.mul(t); donusumGrubu.setTransform(donusum3b); kokNesnesi.compile(); return kokNesnesi; } public Renkekle() { setLayout(new BorderLayout()); GraphicsConfiguration konfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(konfig); add("Center", c); BranchGroup sahne = goruntuAgaciOlustur(); Y. Doç. Dr. Aybars UĞUR 10 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } BranchGroup sahne = goruntuAgaciOlustur(); SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } public static void main(String[] args) { new MainFrame(new Renkekle(), 320, 240); } } Şekil 8 : Java 3D ile renkli ve ölçeklendirilmiş bir kutunun çizdirilmesi JAVA 3D ÖRNEK 8 : Java 3D ile nesnelerin maddesel özelliklerinin verilmesi ve ışık kaynaklarının oluşturulması Appearance nitelik_kutu = new Appearance(); // Madde özelliklerinin verilmesi : Yansıtıcılık, parlaklık vs. Material mat = new Material(); mat.setAmbientColor(0.5f,0.5f,0.5f); mat.setDiffuseColor(1.0f,1.0f,1.0f); mat.setEmissiveColor(0.0f,0.0f,0.0f); mat.setSpecularColor(1.0f,1.0f,1.0f); mat.setShininess(80.0f); nitelik_kutu.setMaterial(mat); // Saydamlık özelliklerinin verilmesi TransparencyAttributes ta = new TransparencyAttributes(); ta.setTransparency(0.5f); ta.setTransparencyMode(TransparencyAttributes.BLENDED); nitelik_kutu.setTransparencyAttributes(ta); donusumGrubu.addChild(new Box(0.6f, 0.5f, 0.4f, nitelik_kutu)); Y. Doç. Dr. Aybars UĞUR 11 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler // Noktasal ışık kaynağı tanımlanması. Renginin verilmesi, ışık kaynağının konumunun // verilmesi PointLight light = new PointLight(); light.setEnable(true); light.setColor(new Color3f(1.0f,1.0f,1.0f)); light.setPosition(new Point3f(2.0f,2.0f,2.0f)); light.setInfluencingBounds(bounds); donusumGrubu.addChild(light); // Ortamın genel aydınlığının ayarlanması Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f); AmbientLight ambientLightNode = new AmbientLight(ambientColor); ambientLightNode.setInfluencingBounds(bounds); kokNesnesi.addChild(ambientLightNode); Şekil 9 : Nesnelerin maddesel özelliklerinin ayarlanması ve ışık kaynakları oluşturulması Java 3D ile noktasal ışık kaynağı dışında diğer tür ışık kaynakları tanımlayarak her türlü aydınlatma etkilerinin elde edilmesi mümkündür. Ayrıca değişik saydamlık ve maddesel özelliklerin verilmesi ile çok daha değişik nesneler elde edilebilir. Ayrıca küp, dikdörtgenler prizması (kutu), koni, silindir, küre gibi temel üç boyutlu şekiller dışında da, değişik üç boyutlu grafik formatlarından dosyaları okuyup görüntülemeyi ve üzerlerinde işlemler yapmayı sağlayan sınıflar da vardır. AutoCAD, LightWave, 3D Studio, Pov-Ray gibi grafik programları ile hazırlanmış üç boyutlu grafik dosyaları ve VRML gibi dosya biçimleri de dosya dönüştürücüler yardımı ile WaveFront .obj biçimine dönüştürülerek Java’da görüntülenip üzerlerinde işlemler yapılabilir. Böylece herhangi bir üç boyutlu nesne veya nesne grubunu oluşturup Java ile işlemek olası hale gelir. Y. Doç. Dr. Aybars UĞUR 12 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler ÖRNEK 9 : 3 boyutlu metin oluşturulması (Şekil 10). import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; import java.awt.*; public class Metin3d extends Applet { public BranchGroup goruntuAgaciOlustur() { BranchGroup kokNesnesi = new BranchGroup(); TransformGroup donusumGrubu = new TransformGroup(); // Üç boyutlu bir metnin oluşturulması // “Bilgisayar” yazısı Font3D f3d; f3d = new Font3D(new Font("TestFont",Font.PLAIN,2), new FontExtrusion()); Text3D txt = new Text3D(f3d,"Bilgisayar", new Point3f(0.0f,0.0f,0.0f)); Shape3D sh = new Shape3D(); sh.setGeometry(txt); donusumGrubu.addChild(sh); // Taşınıp 30% boyutuna düşürülerek y ekseninde 30 derece döndürülmesi Transform3D donusum3b = new Transform3D(); donusum3b.setTranslation(new Vector3f(-0.8f,-0.3f,-0.3f)); donusum3b.setScale(0.3); Transform3D t = new Transform3D(); t.rotY(Math.PI/6.0d); donusum3b.mul(t); donusumGrubu.setTransform(donusum3b); kokNesnesi.addChild(donusumGrubu); kokNesnesi.compile(); return kokNesnesi; } public Metin3d() { setLayout(new BorderLayout()); GraphicsConfiguration konfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(konfig); add("Center", c); Y. Doç. Dr. Aybars UĞUR 13 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler BranchGroup sahne = goruntuAgaciOlustur(); SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } public static void main(String[] args) { new MainFrame(new Metin3d(), 320, 240); } } Şekil 10 : 30 derece döndürülmüş üç boyutlu bir metnin oluşturulması. ÖRNEK 10 : Dönen üç boyutlu metin oluşturulması. Şekil 10’daki “Bilgisayar” yazısının B harfinin hizasında y ekseni etrafında sürekli dönen animasyonu oluşturulmaktadır. Şekil 11’de görüntü ağacı gösterilmektedir. Sanal Evren Şekil 11 : Görüntü ağacı Kök Nesnesi Dönüşüm Grubu Dönüşüm Grubu2 Nesnenin uygun yere taşınıp uygun boyuta ölçeklendirilmesi Nesnenin sürekli döndürülmesi “Bilgisayar” metni Y. Doç. Dr. Aybars UĞUR 14 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; import java.awt.*; public class Metiny extends Applet { public BranchGroup goruntuAgaciOlustur() { BranchGroup kokNesnesi = new BranchGroup(); Transform3D donusum3b = new Transform3D(); donusum3b.setTranslation(new Vector3f(-0.8f,-0.3f,-0.3f)); donusum3b.setScale(0.3); TransformGroup donusumGrubu = new TransformGroup(); donusumGrubu.setTransform(donusum3b); TransformGroup donusumGrubu2 = new TransformGroup(); donusumGrubu2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); // Bilgisayar yazısını 4 saniyede 1, kendi etrafında 360 derece döndüren deyimler Transform3D yAxis = new Transform3D(); Alpha rotationAlpha = new Alpha(-1, 4000); RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, donusumGrubu2, yAxis, 0.0f, (float) Math.PI*2.0f); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); rotator.setSchedulingBounds(bounds); donusumGrubu2.addChild(rotator); Font3D f3d; f3d = new Font3D(new Font("TestFont",Font.PLAIN,2), new FontExtrusion()); Text3D txt = new Text3D(f3d,"Bilgisayar", new Point3f(0.0f,0.0f,0.0f)); Shape3D sh = new Shape3D(); sh.setGeometry(txt); donusumGrubu2.addChild(sh); donusumGrubu.addChild(donusumGrubu2); kokNesnesi.addChild(donusumGrubu); Y. Doç. Dr. Aybars UĞUR 15 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler kokNesnesi.compile(); return kokNesnesi; } public Metiny() { setLayout(new BorderLayout()); GraphicsConfiguration konfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(konfig); add("Center", c); BranchGroup sahne = goruntuAgaciOlustur(); SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } public static void main(String[] args) { new MainFrame(new Metiny(), 320, 240); } } ÖRNEK 11 : Dünya haritasının bir silindir üzerine eşlenmesi (Şekil 12). Şekil 12 : Dünya resminin bir silindir üzerine eşlenmesi import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import com.sun.j3d.utils.applet.MainFrame; Y. Doç. Dr. Aybars UĞUR 16 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; // import javax.vecmath.*; // import java.awt.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.image.TextureLoader; public class Oruntu extends Applet { public BranchGroup goruntuAgaciOlustur() { BranchGroup kokNesnesi = new BranchGroup(); TransformGroup donusumGrubu = new TransformGroup(); Appearance nitelik = new Appearance(); // Dünya haritası resminin yüklenerek oluşturulan nitelikte bir silindirin // sisteme eklenmesi TextureLoader oruntu = new TextureLoader("earth.jpg","RGB",this); nitelik.setTexture(oruntu.getTexture()); TextureAttributes oruntuNitelik = new TextureAttributes(); oruntuNitelik.setTextureMode(TextureAttributes.MODULATE); nitelik.setTextureAttributes(oruntuNitelik); donusumGrubu.addChild(new Cylinder(0.5f, 0.5f, Cylinder.GENERATE_TEXTURE_COORDS | Cylinder.GENERATE_NORMALS, nitelik)); kokNesnesi.addChild(donusumGrubu); kokNesnesi.compile(); return kokNesnesi; } public Oruntu() { setLayout(new BorderLayout()); GraphicsConfiguration konfig = SimpleUniverse.getPreferredConfiguration(); Canvas3D c = new Canvas3D(konfig); add("Center", c); BranchGroup sahne = goruntuAgaciOlustur(); SimpleUniverse u = new SimpleUniverse(c); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(sahne); } public static void main(String[] args) { new MainFrame(new Oruntu(), 320, 240); } } Y. Doç. Dr. Aybars UĞUR 17 Bilgisayar Destekli Tasarım (Bahar 2001-2002) Java 3D Örnekler Load a texture on an *.obj model com.sun.j3d.loaders.objectfile.ObjectFile f = new com.sun.j3d.loaders.objectfile.ObjectFile(); Scene s = null; try { s = f.load(obj); } catch (Exception e) { System.err.println(e); System.exit(1); } //FIGUR TEXTURIEREN a = new Appearance(); TextureLoader loader = new TextureLoader( texture, null ); Texture2D texture = ( Texture2D ) loader.getTexture(); a.setTexture( texture ); BranchGroup bg = s.getSceneGroup(); Enumeration en = bg.getAllChildren(); traverse(en); protected void traverse (Enumeration e) { while(e.hasMoreElements()) { Object o = e.nextElement(); if (o instanceof Shape3D) { Shape3D shape = (Shape3D)o; shape.setAppearance(a); } if (o instanceof Group) { Group g = (Group) o; traverse(g.getAllChildren()); } } } http://forum.java.sun.com/thread.jspa?threadID=650363&messageID=3826884 Y. Doç. Dr. Aybars UĞUR 18