package elte.java2_utikalauz5.java3d;
import java.awt.*;
import javax.vecmath.*;
import javax.media.j3d.*;
/**
3D kocka megjelenítése egy ablakban.

@link.forrásfájl {@docRoot}/../data/java3d/src HelloJava3D.java
@link.letöltés {@docRoot}/../data/java3d HelloJava3D.jar
@since Java 2 Útikalauz programozóknak 5.0
*/
class HelloJava3D extends Frame {
/** Verziószám */
private final static long serialVersionUID = 15L;
public static void main(String[] args) {
new HelloJava3D();
}
public HelloJava3D() {
super("HelloJava3D");
enableEvents(java.awt.AWTEvent.WINDOW_EVENT_MASK);
GraphicsConfiguration config = getPreferredConfiguration();
Canvas3D c = new Canvas3D(config); // 1: Canvas3D elkészítése
add("Center", c);
SimpleUniverse u = new SimpleUniverse(c); // 2: univerzum a nezeti ággal
BranchGroup sceneBranch = createSceneBranch(); // 3: a szintér ág
u.addBranchGraph(sceneBranch); // 4: hozzáadjuk az univerzumhoz
setSize(400, 300);
setVisible(true);
}
//elkészíti a színtér-gráfnak azt az ágát, amely a 3D kockát tartalmazza.
public BranchGroup createSceneBranch() {
BranchGroup branchGroup = new BranchGroup();
TransformGroup transformGroup = new TransformGroup();
transformGroup.addChild(new ColorCube().getShape3D());
branchGroup.addChild(transformGroup);
return branchGroup;
}
/**
Ablakesemény feldolgozása, bezáráskor kilépés.
@param esemény A fellépett esemény
*/
@Override
protected void processWindowEvent(java.awt.event.WindowEvent esemény) {
if (esemény.getID() == esemény.WINDOW_CLOSING) System.exit(0);
super.processWindowEvent( esemény );
}
//Az osztály felépít egy színtér-gráfot, amely csak a
//View BranchGroup ágat tartalmazza.
class SimpleUniverse {
Locale locale;
public SimpleUniverse(Canvas3D c) {
//keszitsuk el a ViewPlatform transzformacios matrixat
Transform3D t = new Transform3D();
Transform3D t2 = new Transform3D();
//az avatar fejének dőlésszögei az X, Y, Z tengelyekre vonatkozóan
t2.setEuler(new Vector3d(-35.0 * (Math.PI / 180.0), 45.0 * (Math.PI / 180.0), 0.0));
//az avatar pozíciója: 4.0, 4.0, 4.0
t.set(4,new Vector3d(4.0, 4.0, 4.0));
t.mul(t, t2);
//épitsuk fel az univerzumot
VirtualUniverse universe = new VirtualUniverse();
locale = new Locale(universe);
//és a View ágat a gráfnak
PhysicalBody body = new PhysicalBody();
PhysicalEnvironment environment = new PhysicalEnvironment();
BranchGroup viewPlatformBranchGroup = new BranchGroup();
TransformGroup viewPlatformTransformGroup = new TransformGroup(t);
ViewPlatform viewPlatform = new ViewPlatform();
View view = new View();
view.addCanvas3D(c);
view.setPhysicalBody(body);
view.setPhysicalEnvironment(environment);
view.attachViewPlatform(viewPlatform);
viewPlatformTransformGroup.addChild(viewPlatform);
viewPlatformBranchGroup.addChild(viewPlatformTransformGroup);
locale.addBranchGraph(viewPlatformBranchGroup);
}
void addBranchGraph(BranchGroup bg) {
locale.addBranchGraph(bg);
}
}
public static java.awt.GraphicsConfiguration getPreferredConfiguration() {
// kerjük le a grafikus eszközt
GraphicsDevice gDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
// adjuk vissza a legjobb konfigurációt
return gDevice.getBestConfiguration(new GraphicsConfigTemplate3D());
}
//Egy színes kockát valósít meg az objektum, a getShape3D() metódussal
//lehet visszakapni a Java3D Shape3D csomópontját, amely
//már beszúrható egy TransformGroup csomópontba
class ColorCube extends Shape3D {
//A csúcsok koordinátákkal adott definíciója.
//Egy poligon 4 csúcspontjának megadásakor fontos a sorrend.
//A számított normálvektor akkor mutat a kockából kifelé, ha kívülről
//a kockára tekintve a csúcspontok felsorolási sorrendje az óra járásával
//ellentétes körüljárást mutat. Rossz sorrend esetén rossz normálvektor
//számolódik, és a poligon nem jelenik meg.
double verts[] = {
1.0, -1.0, 1.0, 1.0, 1.0, 1.0, //előlap
-1.0, 1.0, 1.0, -1.0, -1.0, 1.0,
-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, //hátlap
1.0, 1.0, -1.0, 1.0, -1.0, -1.0,
1.0, -1.0, -1.0, 1.0, 1.0, -1.0, //jobb oldallap
1.0, 1.0, 1.0, 1.0, -1.0, 1.0,
-1.0, -1.0, 1.0, -1.0, 1.0, 1.0, //bal oldallap
-1.0, 1.0, -1.0, -1.0, -1.0, -1.0,
1.0, 1.0, 1.0, 1.0, 1.0, -1.0, //fedőlap
-1.0, 1.0, -1.0, -1.0, 1.0, 1.0,
-1.0, -1.0, 1.0, -1.0, -1.0, -1.0, //alaplap
1.0, -1.0, -1.0, 1.0, -1.0, 1.0
};
//A poligon csúcsaihoz azonos színt definiálunk. Lehet különböző
//is, ekkor attraktív lineáris színátmenetet látunk a csúcsok között.
float[] colors = {
1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, //előlap (piros)
1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, //hátlap (zöld)
0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, //jobb oldallap (kék)
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, //bal oldallap (sárga)
1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, //fedőlap (magenta)
1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, //alaplap (cián)
0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f
};
public ColorCube() {
QuadArray cube = new QuadArray(24, QuadArray.COORDINATES |
QuadArray.COLOR_3);
cube.setCoordinates(0, verts);
cube.setColors(0, colors);
this.setGeometry(cube); // a Shape3D metódusa
}
public Shape3D getShape3D() {
return this;
}
}
}