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