Pemrograman grafis 3D di Java, Bagian 1: Java 3D

Untuk membangun platform Java yang sebenarnya, Sun menyadari sejak awal bahwa ia perlu mengisi gambaran API di luar fungsionalitas terbatas yang tersedia di platform inti Java 1.0. Sun telah mengembangkan intinya secara signifikan dengan rilis 1.1 dan 1.2 yang akan datang, tetapi masih ada beberapa bagian yang hilang dari teka-teki Java.

Sun dan mitranya mengembangkan Java Media and Communication API untuk menyediakan bagian pemrograman multimedia yang hilang. Dua bagian terbesar, grafik 2D dan 3D, masing-masing ditargetkan dengan Java 2D dan 3D API. Java 2D adalah API platform inti yang dimulai dengan Java 1.2, sedangkan Java 3D akan dirilis sebagai API Ekstensi segera setelah platform 1.2 tersedia. Kami baru saja menyelesaikan serangkaian kolom di Java 2D; sekarang kita mengalihkan perhatian kita ke Java 3D.

Java 3D dimaksudkan untuk memberi pengembang Java kemampuan untuk menulis applet dan aplikasi yang menyediakan konten interaktif tiga dimensi kepada pengguna. Sun memiliki beberapa persaingan ketat dari teknologi grafis 3D lainnya di arena ini, dan Java 3D memiliki perjuangan berat di depannya jika harus mengalahkan standar grafis lama, OpenGL.

Permintaan komentar pembaca tentang API grafik 3D untuk Java menunjukkan minat yang serius pada binding Java 3D dan Java OpenGL, jadi saya memutuskan untuk memusatkan upaya saya pada teknologi ini dalam beberapa bulan mendatang.

Jumlah minat yang lebih terbatas diungkapkan dalam VRML. Akibatnya, saya akan menangani VRML dengan mendemonstrasikan penggunaannya di Java 3D dengan pemuat konten VRML97 dan browser Java 3D VRML97 dari Sun. Direct3D menerima sangat sedikit minat, jadi saya telah memutuskan untuk tidak mengikuti jalur ini, kecuali untuk menyebutkan di mana salah satu teknologi lain dapat mendukung atau beroperasi dengannya.

Pro dan kontra dari Java 3D

Bulan ini kami memulai tur API grafik 3D untuk Java dengan menjelajahi Java 3D. Kami akan mulai dengan membahas beberapa kekuatan dan kelemahan utama API. Grafik 3D terkadang tampak agak tumpul dan, karenanya, sulit untuk dijelaskan. Jika Anda masih memiliki kebingungan tentang contoh atau penjelasan saya, silakan tulis pertanyaan atau komentar Anda kepada saya, dan saya akan melakukan yang terbaik untuk mengatasinya.

Nilai jual untuk Java 3D:

  • Ini memberikan tampilan grafik 3D tingkat tinggi dan berorientasi objek. Java 3D menyelesaikan ini sebagian dengan menggunakan model grafis 3D berbasis grafik pemandangan . (Kami akan membahas konsep ini lebih rinci nanti di artikel.) Pendekatan ini dimaksudkan untuk membantu pemrogram yang tidak memiliki banyak pengalaman pemrograman grafis atau multimedia menggunakan 3D dalam aplikasi mereka. Berbeda sekali dengan API 3D prosedural tingkat rendah seperti OpenGL, yang dirancang untuk mengoptimalkan kecepatan terbaik dan memberi pemrogram kendali terbesar yang mungkin atas proses rendering, Java 3D dimaksudkan agar cukup mudah bagi programmer Java yang berpengalaman untuk belajar.

  • Jika Anda tidak memerlukan akses tingkat rendah untuk operasi rendering, Java 3D mungkin bisa menjadi pilihan. Akses rendering dibatasi untuk permintaan melalui atribut dan bit kemampuan, yang bentuk dan fungsinya mirip dengan petunjuk rendering 2D Java. (Lihat Sumber untuk link ke seri saya sebelumnya tentang Java 2D, yang termasuk diskusi dan contoh petunjuk rendering 2D).

  • Java 3D dioptimalkan untuk kecepatan jika memungkinkan. Runtime menggunakan bit kemampuan rendering, pada kenyataannya, untuk mengoptimalkan grafik adegan untuk rendering secepat mungkin. Pendekatan ini membuat Java 3D lebih dapat diterapkan pada lingkungan grafis interaktif (game, simulasi, situasi latensi rendah) daripada aplikasi grafis offline berkualitas tinggi (seperti render farm).

  • Banyak pemuat 3D yang terus bertambah tersedia untuk mengimpor konten ke runtime 3D Java. Sun telah membuat pemuat file dan browser Java 3D VRML97 tersedia secara gratis dengan kode. Cari kolom Pemrograman Media bulan depan untuk menjelajahi loader 3D Java secara lebih detail.

  • Java 3D membutuhkan kemampuan matematika vektor yang tidak tersedia di tempat lain di platform Java. Operasi matematika ini saat ini berada di dalam javax.vecmathpaket dan dapat dipindahkan ke platform inti di masa mendatang.

  • Java 3D mendukung sejumlah perangkat eksotis (tongkat, sarung tangan data, dan headset, misalnya). The com.sun.j3d.utils.trackerspaket disertakan dengan pelaksanaan Sun menyediakan kelas untuk perangkat Fakespace, Logitech, dan Polhemus. Namun perangkat ini tidak banyak digunakan, jadi saya tidak akan membahasnya secara mendetail. Jika Anda tertarik untuk mengetahui lebih lanjut tentang dukungan perangkat, silakan merujuk ke situs Sun Java 3D dan arsip milis Java 3D (keduanya tersedia dari URL utama Sun Java 3D yang disertakan dalam Sumberdaya di bawah).

Java 3D memiliki banyak kelebihan, tapi bagaimana dengan kekurangannya? Mereka termasuk:

  • Java 3D adalah API ekstensi standar. Penerima lisensi platform Java diberi opsi untuk mengimplementasikan API jika mereka mau, tetapi mereka tidak diharuskan untuk mengimplementasikannya. Penempatan Java 3D sebagai ekstensi standar berisiko mengurangi portabilitas kode Java 3D di seluruh platform - sebagian besar vendor harus berjuang untuk mengikuti perubahan dan penambahan pada platform inti saja.

  • Java 3D memiliki kendala ketersediaan yang parah. Ini adalah hasil dari status Java 3D sebagai API ekstensi. Satu-satunya vendor besar yang saat ini menyediakan implementasi Java 3D adalah Sun, dengan implementasinya untuk Solaris dan Win32. Dibandingkan dengan OpenGL, yang tersedia untuk setiap varian Unix, Windows, dan banyak sistem operasi lainnya, portabilitas lintas platform kode Java 3D tampak dipertanyakan.

  • Seiring dengan masalah ketersediaan perangkat lunak, muncul pula defisit dokumentasi. Sun melakukan upaya yang berani untuk memberikan pelatihan dan dukungan pengembang untuk Java 3D, tetapi upaya tersebut masih gagal dibandingkan dengan upaya industri lainnya dalam mendokumentasikan OpenGL dan penggunaannya. Situs Web Konsorsium OpenGL jauh lebih dalam dan lebih luas daripada apa pun yang telah berhasil disatukan Sun untuk Java 3D sejauh ini. Ini bukan poin kecil: kompleksitas relatif dari API grafik 3D membuat dokumentasi yang baik menjadi suatu kebutuhan.

  • Java 3D menyembunyikan detail pipeline rendering dari pengembang. Karena Java 3D adalah API tingkat tinggi, itu sengaja menyembunyikan detail pipeline rendering dari pengembang, yang membuatnya tidak cocok untuk sejumlah besar masalah yang memerlukan detail seperti itu. (Kita akan membahas model level bawah OpenGL dan akses ke pipeline rendering nanti dalam seri 3D ini.)

  • Komponen Java 3D sangat berat. Artinya, mereka memiliki rekan native (non-Java) yang benar-benar melakukan rendering. Ini dapat mempersulit pengembangan GUI Anda jika Anda menggunakan Java Swing dan semua komponen Java, atau ringannya. Ada beberapa solusi khusus, tetapi secara umum, komponen ringan dan berat tidak dapat bercampur dengan baik dalam objek kontainer dan jendela yang sama. Informasi lebih lanjut tentang masalah komponen ringan-berat tersedia dari Sumber daya di akhir artikel ini.

Menginstal Java 3D

Sekarang setelah kita memahami fitur dan batasan utama Java 3D, mari bersiap untuk mencoba beberapa contoh kode.

Java 3D tersedia dalam versi beta untuk Win32 dan Solaris. Implementasi Java 3D yang lebih matang dibangun di atas OpenGL. Implementasi Direct3D kualitas alfa juga tersedia untuk Win32. Semua memerlukan Java 1.2, dengan Java 3D beta terbaru yang sesuai dengan Java 1.2 Beta 4. Sun telah berjanji untuk merilis implementasi Java 3D tidak lama setelah merilis Java 1.2, yang saat ini dijadwalkan pada Desember 1998.

Sedikit membingungkan: Sun merilis implementasi Java 3D 1.0 alpha, yang sesuai dengan Java 3D 1.0 API, tapi tidak pernah merilis apapun selain alpha untuk 1.0 API. Sun kemudian memodifikasi API, merilis versi yang dimodifikasi sebagai Java 3D 1.1 API. Versi ini diikuti dengan rilis yang disebut implementasi beta 1.1, sejauh ini dua. Sun telah berjanji untuk merilis API final dan implementasi segera setelah rilis final dari platform Java 1.2. Mudah-mudahan, API telah stabil dan tidak akan diperbarui lagi, dengan dunia masih menunggu rilis akhir yang bonafide dari sebuah implementasi.

Karena kita akan membahas binding Java OpenGL di kolom mendatang, saya telah memutuskan untuk menghemat dan menggunakan versi OpenGL dari Java 3D dalam petunjuk penginstalan ini juga. Jika Anda menginstal versi OpenGL untuk digunakan dengan contoh Java 3D ini, Anda akan memiliki pustaka rendering yang Anda perlukan untuk contoh Java-OpenGL yang akan datang nanti.

Komponen perangkat lunak yang Anda perlukan untuk menggunakan Java 3D adalah:

  • Runtime Java 3D, tersedia dari Sun (diperlukan login Java Developer Connection gratis). Pastikan untuk memilih versi OpenGL Java 3D untuk platform Anda (saya menggunakan Win32). Saat ini, Win32 Java 3D untuk OpenGL terbaru adalah 1.1 Beta 2, di java3d11-beta2-win32-opengl.exe, dan beratnya sekitar 1,7 MB.

  • OpenGL 1.1, dipaketkan dengan Windows NT 4.0 dan Windows 95 OSR 2. Namun, jika Anda memiliki OSR 1 rilis Windows 95, Anda dapat mengunduh dukungan OpenGL. Implementasi Windows 95-OpenGL 1.1 terbaru tersedia dari Microsoft sebagai opengl95.exe, dan berukuran sekitar 0,5 MB.

  • Java 1.2, tersedia dari Sun. (Perhatikan bahwa saat saya menulis ini, Sun telah merilis Java 1.2 baru - Kandidat Rilis 1. Contoh akan diperbarui untuk rilis terbaru secepat mungkin.) Java 3D digabungkan ke dalam platform 1.2, dan Sun telah menyatakannya di milis minat java3d yang tidak tertarik memisahkan API dan mencoba membuatnya tersedia dengan rilis platform sebelumnya.

Secara opsional, Anda mungkin juga ingin mengunduh dokumentasi 3D Java dan kode contoh. Keduanya tersedia dari link yang sama dengan runtime 3D Java.

Harap dicatat bahwa Anda tidak lagi diharuskan menyetel variabel lingkungan CLASSPATH agar java atau appletviewer Anda dapat dieksekusi untuk menemukan pustaka ekstensi. Dengan Java 1.2, Sun akhirnya membuat direktori ekstensi standar. Direktori ini terletak di / jre / lib / ext / dalam direktori instalasi JDK Anda. Misalnya, di sistem saya, Java 1.2 Beta 4 diinstal di:

C:\jdk1.2beta4\

dan direktori ekstensi standar ada di:

C:\jdk1.2beta4\jre\lib\ext\

Semua pustaka ekstensi harus menempatkan arsip jar mereka ke dalam direktori ekstensi ini pada saat penginstalan, dan semua alat JDK standar tahu untuk mencari di sini untuk file kelas yang diperlukan.

Untuk Java 3D Sun, arsip ini mencakup kelas publik (didokumentasikan dalam spesifikasi Java 3D API) dan privat (khusus implementasi Sun). Arsip kelas publik meliputi:

  • j3dcore.jar- Berisi file kelas untuk paket 3D Java publik javax.media.j3d.

  • vecmath.jar- Berisi kelas untuk javax.vecmath.

Arsip pribadi meliputi:

  • j3daudio.jar- Mengarsipkan com.sun.j3d.audiokelas, yang membangun dukungan untuk audio spasial di atas salinan kustom bagian Java dari Java Sound, mesin audio berbasis Headspace, yang memulai debutnya di Java 1.2.

  • j3dutils.jar- Mengemas berbagai kelas utilitas Sun dalam total 16 paket dan sub-paket di bawahnya com.sun.j3d. Saya akan menggali lebih dalam paket-paket ini di bulan depan kelanjutan diskusi Java 3D kami.

  • j3dutilscontrib.jar- Arsip utilitas yang berguna disumbangkan oleh orang lain untuk upaya Sun. Ada tujuh paket di bawah com.sun.j3dhierarki, termasuk com.sun.j3d.utils.trackerskode yang disebutkan di atas. Sekali lagi, kolom bulan depan akan memberikan informasi lebih lanjut tentang paket-paket di toples ini.

Harap dicatat bahwa dalam teori Anda dapat membuat instance dan memanggil metode pada salah satu kelas yang disediakan dalam paket tidak standar seperti com.sun, tetapi peringatan emptor : Tidak ada jaminan mereka akan tersedia di platform tempat kode Anda dijalankan. Dalam praktik saat ini, Java 3D hanya tersedia dari Sun, jadi banyak pengembang, pada kenyataannya, menggunakan kelas dalam arsip pribadi Sun. Anda harus menyadari potensi trade-off portabilitas yang diperlukan dalam memilih untuk melakukannya.

Tidak ada keajaiban dalam cara antarmuka kelas 3D Java publik dan pribadi dengan sumber daya sistem. Sun menginstal pustaka asli di dalam J3D.dlldan di j3daudio.dllbawah /jre/bin/direktori. Kelas Java 3D menggunakan metode asli untuk memanggil DLL ini dan antarmuka dengan platform Win32 dan pustaka rendering OpenGL. (Pustaka serupa ada untuk implementasi Solaris.)

Satu catatan terakhir tentang penginstalan: Pipeline rendering OpenGL dirancang untuk memanfaatkan perangkat keras akselerasi OpenGL untuk mempercepat aplikasi grafis Anda. Untuk keperluan kolom ini, Anda harus dapat bereksperimen dengan contoh tanpa perangkat keras khusus. (Faktanya, saya mengembangkan semua contoh pada laptop Pentium 150-MHz MMX tanpa perangkat keras akselerasi OpenGL.) Jika Anda tertarik dengan kartu akselerasi, Anda harus merujuk ke situs Web OpenGL atau milis Java 3D ( lihat Sumber) untuk informasi lebih lanjut. Saya berencana untuk memasukkan lebih banyak informasi di kolom Java 3D bulan depan tentang perangkat keras akselerasi juga.

Membangun cabang tampilan pemandangan

Seperti yang saya catat sebelumnya, salah satu kekuatan terbesar dari model grafik grafik pemandangan adalah memungkinkan pemrogram grafik yang tidak berpengalaman untuk menambahkan 3D ke aplikasi mereka. Secara tradisional, pemrogram 3D harus menentukan di mana dan bagaimana garis individu atau grafik primitif lainnya akan digambar. Namun, dengan menggunakan grafik pemandangan, programmer hanya membuat struktur seperti pohon yang berisi node yang mewakili objek yang akan dirender serta instruksi rendering (seperti di mana sudut pandang yang ditampilkan ke monitor berada, geometri fisik dunia 3D programmer menciptakan, dan jarak relatif antar benda).