Hello Java3D

Repost dari artikel saya di PC Mild 01/2011

Java 3D API adalah sebuah hirarki class yang menyediakan interface untuk sistem render grafis dan suara tiga dimensi yang kompleks. Sehingga dengan demikian programmer dapat bekerja pada konstruk level tinggi tanpa perlu mengetahui bagaimana proses berjalannya. API ini menyediakan lebih dari 100 class yang akan diproses sedemikian rupa oleh engine 3D tersebut.

Karena merupakan library eksternal, Java 3D API tidak tersedia secara default dalam JDK standart edition. Bahkan saat ini Java 3D sudah menjadi project komunitas open source. Jadi Anda harus mendownload-nya terlebih dahulu di website resmi project-nya, https://java3d.dev.java.net/ (juga tersedia dalam CD). Versi terbarunya saat artikel ini ditulis adalah 1.5.2.

  1. Download installer Java 3D sesuai sistem operasi yang Anda gunakan. Setelah proses download selesai, Anda harus melakukan instalasi terlebih dahulu, yang caranya berbeda-beda tergantung sistem operasi yang Anda gunakan. Untuk sistem operasi Windows cukup mudah, cukup jalankan file installer berekstensi exe. Sedangkan untuk sistem operasi linux, Anda perlu menjalankan perintah berikut dalam terminal. Anda mungkin harus melakukannya sebagai super user atau root.
    # ganti path sesuai lokasi JRE Anda. 
    cd /path-to-jre/jdk1.5.0_06/jre 
    # jika sebagai root dalam ubuntu, tambahkan "sudo" di bagian depan 
    sh /path-to-download-files/file-name.bin
    
  2. Setelah selesai, package yang terinstall siap digunakan dalam program. Namun sebelum itu, alangkah baiknya Anda mengerti bagaimana konsep atau resep untuk membuat program Java 3D. Secara umum, proses tersebut dapat disingkat sebagai berikut.
    • Membuat object Canvas3D.
    • Membuat object VirtualUniverse.
      1. Membuat object Locale, kemudian memasukkannya dalam Virtual Universe.
      2. Membuat cabang graph tampilan.
      3. Membuat object View.
      4. Membuat object ViewPlatform.
      5. Membuat object PhysicalBody.
      6. Membuat object PhysicalEnvironment.
      7. Memasukkan object ViewPlatform, PhysicalBody, PhysicalEnvironment, dan Canvas3D ke dalam object View.
    • Mengkonstruksi content branch graph.
    • Meng-compile branch graph.
    • Memasukkan subgraph ke dalam Locale.
  3. Resep tersebut bisa lebih sederhana untuk pemula, menggunakan class SimpleUniverse. Class ini cukup bagus untuk pemula yang ingin mempelajari pemrograman Java 3D. Sayangnya, jika menggunakan cara ini maka tidak memungkinkan untuk mempunyai banyak view dalam virtual universe. Class ini terletak dalam package com.sun.j3d.utils.universe. Hasil resep sederhana dengan penggunaan SimpleUniverse adalah:
    • Membuat sebuah object Canvas3D.
    • Membuat object SimpleUniverse yang mereferensi object Canvas3D.
    • Mengatur object SimpleUniverse sesuai kebutuhan.
    • Membuat content branch.
    • Meng-compile content branch graph.
    • Memasukkan content branch graph ke dalam Locale dari SimpleUniverse

    Jika Anda masih bingung, Anda dapat melihat ilustrasi konsep penggambaran pada layar.

  4. Tampilan branch graph termasuk juga layar gambar (image plate) di dalamnya. Image plate adalah sebuah kotak datar di mana content diproyeksikan untuk membentuk sebuah gambar render 2 dimensi. Secara default, image plate akan menangkap area tengah (titik origin). Ilustrasi hubungan antara image plate, posisi mata, dan virtual universe bisa Anda lihat pada gambar.

    Ilustrasi viewport

  5. Untuk langkah awal, buatlah sebuah class untuk Hello3D ini, seperti pada kode di bawah ini.
    import com.sun.j3d.utils.geometry.ColorCube; 
    import com.sun.j3d.utils.universe.SimpleUniverse; 
    import java.awt.BorderLayout; 
    import java.awt.Dimension; 
    import java.awt.GraphicsConfiguration; 
    import javax.media.j3d.BranchGroup; 
    import javax.media.j3d.Canvas3D; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    
    public class Demo3D extends JPanel { 
      public Demo3D() { 
        setPreferredSize(new Dimension(500, 500)); 
        setLayout(new BorderLayout()); 
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); 
        Canvas3D canvas3D = new Canvas3D(config); 
        add(BorderLayout.CENTER, canvas3D); 
    
        BranchGroup scene = createSceneGraph(); 
        scene.compile(); 
    
        // membuat simple universe dengan parameter canvas 
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D); 
    
        // mendapatkan view platform 
        // object dalam scene bisa dilihat 
        simpleU.getViewingPlatform().setNominalViewingTransform(); 
    
        simpleU.addBranchGraph(scene); 
      } 
    
      public BranchGroup createSceneGraph() { 
        // membuat root scene graph 
        BranchGroup objRoot = new BranchGroup(); 
    
        // membuat simple shape, kemudian menambahkannya dalam graph 
        // sebuah color cube 
        objRoot.addChild(new ColorCube(0.4)); 
    
        return objRoot; 
      } 
    
      public static void main(String[] args) { 
        // jframe untuk menampilkan 
        JFrame f = new JFrame("Demo 3D"); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        // menambahkan class demo3D 
        f.add(new Demo3D()); 
        // memampatkan ukuran sesuai object 
        f.pack(); 
        // meletakkan di tengah 
        f.setLocationRelativeTo(null); 
        // menampilkan 
        f.setVisible(true); 
      } 
    }
    
  6. Compile dan jalankan kode tersebut. Maka yang akan tampil pada sebuah jendela adalah sebuah kotak seperti pada gambar. Meskipun hanya terlihat bidang datar, sebenarnya itu adalah object tiga dimensi, hanya saja terlihat dari depan.

    Tampilan satu sisi dari kubus 3D

  7. Untuk melakukan rotasi, Anda bisa menggunakan class Transform3D. Ubah method createSceneGraph() menjadi seperti di bawah ini. Method mul() akan menggabungkan kedua transformasi yang ada.
      public BranchGroup createSceneGraph() { 
        // membuat root scene graph 
        BranchGroup objRoot = new BranchGroup(); 
    
        // rotasi 
        Transform3D rotate = new Transform3D(); 
        Transform3D tempRot = new Transform3D(); 
    
        rotate.rotX(Math.PI/4.0d); 
        tempRot.rotY(Math.PI/4.0d); 
        rotate.mul(tempRot); 
    
        TransformGroup objRotate = new TransformGroup(rotate); 
        objRotate.addChild(new ColorCube(0.4)); 
        objRoot.addChild(objRotate); 
    
        return objRoot; 
      }
    
  8. Jalankan program tersebut kembali. Maka tampilan yang Anda lihat adalah kubus tersebut akan terotasi sumbu X dan Y seperti pada gambar.

    Hasil rotasi kubus 3D

Selamat mencoba.

Download source code secara keseluruhanArtikel ini telah dipublikasikan di media cetak tabloid PC Mild edisi 01 tahun 2011 lalu.

2 Comments

  1. kok g mau tampil ea gambar nya??? yang ada muncul kesalahan seperti ini :

    Exception in thread “AWT-EventQueue-0” java.lang.NoClassDefFoundError: sun/awt/DrawingSurface
    at javax.media.j3d.DrawingSurfaceObjectDSI.getDrawingSurfaceObjectInfo(DrawingSurfaceObjectDSI.java:85)
    at javax.media.j3d.Canvas3D.paint(Canvas3D.java:1026)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
    at sun.awt.RepaintArea.paint(RepaintArea.java:224)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:310)
    at java.awt.Component.dispatchEventImpl(Component.java:4706)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    Caused by: java.lang.ClassNotFoundException: sun.awt.DrawingSurface
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    … 14 more
    Exception in thread “AWT-EventQueue-0” java.lang.NoClassDefFoundError: sun/awt/DrawingSurface
    at javax.media.j3d.DrawingSurfaceObjectDSI.getDrawingSurfaceObjectInfo(DrawingSurfaceObjectDSI.java:85)
    at javax.media.j3d.Canvas3D.paint(Canvas3D.java:1026)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
    at sun.awt.RepaintArea.paint(RepaintArea.java:224)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:310)
    at java.awt.Component.dispatchEventImpl(Component.java:4706)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

    Reply

Leave a Comment.