JAVA 3D ÖRNEK 1 : Java 3D ile basit üç boyutlu

advertisement
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
Download