Pengaturcaraan grafik 3D di Java, Bahagian 1: Java 3D

Untuk membangun platform Java yang sebenarnya, Sun menyadari sejak awal bahawa ia perlu mengisi gambar API di luar fungsi terhad yang tersedia di platform teras Java 1.0. Sun telah mengembangkan inti dengan pelepasan 1.1 dan 1.2 yang akan datang, tetapi masih ada beberapa potongan yang hilang dari teka-teki Java.

Sun dan rakan-rakannya mengembangkan API Media dan Komunikasi Java untuk menyediakan kepingan pengaturcaraan multimedia yang hilang. Dua bahagian terbesar, grafik 2D dan 3D, masing-masing disasarkan dengan API 2D dan 3D Java. Java 2D adalah API platform inti yang dimulai dengan Java 1.2, sementara Java 3D akan dirilis sebagai Extension API tidak lama setelah platform 1.2 tersedia. Kami baru-baru ini menyelesaikan siri lajur di Java 2D; sekarang kita mengalihkan perhatian kepada Java 3D.

Java 3D dimaksudkan untuk memberikan kemampuan kepada para pengembang Java untuk menulis applet dan aplikasi yang menyediakan konten interaktif tiga dimensi kepada pengguna. Sun memiliki persaingan sengit dari teknologi grafik 3D lain di arena ini, dan Java 3D memiliki pertarungan yang mendahului jika mengalahkan standard grafik penyedia, OpenGL.

Permintaan untuk komen pembaca mengenai API grafik 3D untuk Java menunjukkan minat serius terhadap pengikatan Java 3D dan Java OpenGL, jadi saya memutuskan untuk memusatkan usaha saya pada teknologi ini dalam beberapa bulan mendatang.

Jumlah minat yang lebih terhad dinyatakan dalam VRML. Oleh itu, saya akan menangani VRML dengan menunjukkan penggunaannya di Java 3D dengan pemuat kandungan VRML97 dan penyemak imbas Java Sun VavaL97 3D. Direct3D mendapat minat yang sangat sedikit, jadi saya memutuskan untuk tidak menempuh jalan ini, kecuali untuk menyebut di mana salah satu teknologi lain mungkin menyokong atau beroperasi dengannya.

Kebaikan dan keburukan Java 3D

Bulan ini kita memulakan lawatan API grafik 3D untuk Java dengan meneroka Java 3D. Kita akan mulakan dengan membincangkan beberapa kekuatan dan kelemahan utama API. Grafik 3D kadang-kadang kelihatan agak tidak jelas dan, dengan demikian, sukar untuk dijelaskan. Sekiranya anda mempunyai kekeliruan yang berlanjutan mengenai contoh atau penjelasan saya, sila tulis saya dengan soalan atau komen anda, dan saya akan berusaha sebaik mungkin untuk mengatasinya.

Tempat jualan untuk Java 3D:

  • Ia memberikan paparan grafik 3D tahap tinggi yang berorientasikan objek. Java 3D menyelesaikannya sebahagiannya dengan menggunakan model grafik 3D berdasarkan grafik pemandangan . (Kami akan membincangkan konsep ini dengan lebih terperinci nanti dalam artikel.) Pendekatan ini bertujuan untuk membantu pengaturcara tanpa banyak pengalaman pengaturcaraan grafik atau multimedia menggunakan 3D dalam aplikasinya. Berbeza dengan API 3D prosedural tingkat rendah seperti OpenGL, yang dirancang untuk mengoptimumkan kelajuan sebaik mungkin dan memberikan pengaturcara kontrol yang paling besar terhadap proses rendering, Java 3D dimaksudkan untuk cukup mudah bagi setiap programmer Java yang berpengalaman untuk belajar.

  • Sekiranya anda tidak memerlukan akses tingkat rendah ke operasi rendering, Java 3D mungkin menjadi pilihan. Akses rendering terbatas pada permintaan melalui atribut dan bit kemampuan, yang serupa dalam bentuk dan fungsi dengan petunjuk rendering Java 2D. (Lihat Sumber untuk pautan ke siri saya sebelumnya di Java 2D, yang merangkumi perbincangan dan contoh petunjuk rendering 2D).

  • Java 3D dioptimumkan untuk kelajuan di mana mungkin. Masa berjalan menggunakan bit kemampuan rendering, sebenarnya, untuk mengoptimumkan grafik pemandangan untuk rendering yang secepat mungkin. Pendekatan ini menjadikan Java 3D lebih sesuai untuk persekitaran grafik interaktif (permainan, simulasi, situasi latensi rendah) daripada aplikasi grafik berkualiti tinggi di luar talian (seperti ladang rendering).

  • Sejumlah besar pemuat 3D tersedia untuk mengimport kandungan ke dalam Java 3D runtime. Sun telah menyediakan pemuat dan penyemak imbas fail Java 3D VRML97 yang tersedia secara bebas dengan kod. Cari ruangan Pengaturcaraan Media bulan depan untuk meneroka pemuat 3D Java dengan lebih terperinci.

  • Java 3D memerlukan keupayaan matematik vektor yang tidak terdapat di tempat lain di platform Java. Operasi matematik ini kini terdapat dalam javax.vecmathpakej dan mungkin akan dipindahkan ke platform teras pada masa akan datang.

  • Java 3D menyokong sebilangan peranti eksotik (tongkat, sarung tangan data, dan alat dengar, misalnya). The com.sun.j3d.utils.trackerspakej termasuk dengan pelaksanaan Matahari menyediakan kelas untuk peranti Fakespace, Logitech, dan Polhemus. Peranti ini tidak banyak digunakan, jadi saya tidak akan membincangkannya dengan terperinci. Sekiranya anda berminat untuk mengetahui lebih lanjut mengenai sokongan peranti, lihat laman Sun 3D Java dan arkib senarai surat Java 3D (kedua-duanya tersedia dari URL 3D Sun Java utama yang termasuk dalam Sumber di bawah).

Java 3D mempunyai banyak kelebihan, tetapi bagaimana dengan kontra? Ia merangkumi:

  • Java 3D adalah API lanjutan standard. Pemegang lesen platform Java diberi pilihan untuk menerapkan API jika mereka suka, tetapi mereka tidak diharuskan untuk menerapkannya. Kedudukan Java 3D sebagai pelanjutan standard berisiko untuk mengurangkan kebolehkesanan kod 3D Java di seluruh platform - kebanyakan vendor harus berjuang untuk mengikuti perubahan dan penambahan pada platform teras sahaja.

  • Java 3D mempunyai kekangan ketersediaan yang teruk. Ini adalah hasil status Java 3D sebagai API pelanjutan. Satu-satunya vendor utama yang menyediakan implementasi Java 3D adalah Sun, dengan pelaksanaannya untuk Solaris dan Win32. Berbanding dengan OpenGL, yang tersedia untuk setiap rasa Unix, Windows, dan banyak sistem operasi lain, mudah alih lintas-kod Java 3D kelihatan dipersoalkan.

  • Bersamaan dengan masalah ketersediaan perisian terdapat kekurangan dokumentasi. Sun berusaha keras untuk memberikan latihan dan sokongan pengembang untuk Java 3D, tetapi masih kurang dibandingkan dengan usaha industri lainnya dalam mendokumentasikan OpenGL dan penggunaannya. Laman web OpenGL Consortium jauh lebih dalam dan lebih luas daripada apa yang telah berjaya dikumpulkan oleh Sun untuk Java 3D setakat ini. Ini bukan perkara kecil: kerumitan relatif API grafik 3D menjadikan dokumentasi yang baik sebagai keperluan.

  • Java 3D menyembunyikan perincian rendering-pipeline dari pemaju. Oleh kerana Java 3D adalah API tingkat tinggi, ia sengaja menyembunyikan perincian saluran rendering dari pengembang, yang membuatnya tidak sesuai untuk sejumlah masalah di mana perincian tersebut penting. (Kami akan membincangkan model tahap rendah OpenGL dan akses ke saluran rendering nanti dalam siri 3D ini.)

  • Komponen 3D Java adalah kelas berat. Artinya, mereka memiliki rekan asli (bukan Jawa) yang benar-benar melakukan rendering. Ini dapat menyulitkan pengembangan GUI Anda jika Anda menggunakan Java Swing dan komponennya yang semuanya Java, atau ringan. Terdapat beberapa kaedah penyelesaian khas, tetapi secara umum, komponen ringan dan berat tidak bercampur dengan baik pada objek dan tingkap bekas yang sama. Lebih banyak maklumat mengenai masalah komponen ringan-berat tersedia dari Sumber pada akhir artikel ini.

Memasang Java 3D

Setelah memahami ciri dan kekangan utama Java 3D, mari kita bersiap sedia untuk mencuba beberapa contoh kod.

Java 3D tersedia dalam versi beta untuk Win32 dan Solaris. Semakin lama pelaksanaan Sun 3D dari Java dibangun di atas OpenGL. Pelaksanaan Direct3D berkualiti alfa juga tersedia untuk Win32. Semua memerlukan Java 1.2, dengan beta Java 3D terbaru yang sesuai dengan Java 1.2 Beta 4. Sun telah berjanji untuk melepaskan implementasi Java 3D terakhir tidak lama setelah melepaskan Java 1.2, yang saat ini dijadwalkan untuk Desember 1998.

Sedikit membingungkan: Sun melancarkan implementasi Java 3D 1.0 alpha, yang sesuai dengan Java 3D 1.0 API, tetapi tidak pernah mengeluarkan apa pun selain alpha untuk 1.0 API. Sun kemudian mengubah API, melepaskan versi yang diubah sebagai Java 3D 1.1 API. Versi ini diikuti dengan pelepasan dari apa yang disebutnya 1.1 implementasi beta, dua sejauh ini. Sun telah berjanji untuk melepaskan API akhir dan implementasi tidak lama setelah peluncuran terakhir platform Java 1.2. Mudah-mudahan, API telah stabil dan tidak akan dihidupkan kembali, sekali lagi, dengan dunia masih menunggu pelepasan akhir pelaksanaan.

Oleh kerana kami akan merangkumi pengikatan Java OpenGL di lajur yang akan datang, saya telah memutuskan untuk menjimatkan dan menggunakan Java 3D versi OpenGL dalam arahan pemasangan ini juga. Sekiranya anda memasang versi OpenGL untuk digunakan dengan contoh Java 3D ini, anda akan mempunyai pustaka rendering yang anda perlukan agar contoh Java-OpenGL datang kemudian.

Komponen perisian yang anda perlukan untuk menggunakan Java 3D adalah:

  • Java 3D runtime, tersedia dari Sun (diperlukan penyambungan Java Developer Connection percuma). Pastikan anda memilih Java 3D versi OpenGL untuk platform anda (saya menggunakan Win32). Setakat ini, Win32 Java 3D terbaru untuk OpenGL adalah 1.1 Beta 2, dalam java3d11-beta2-win32-opengl.exe, dan beratnya kira-kira 1.7 MB.

  • OpenGL 1.1, digabungkan dengan Windows NT 4.0 dan Windows 95 OSR 2. Namun, jika anda mempunyai pelepasan OSR 1 Windows 95, anda boleh memuat turun sokongan OpenGL. Pelaksanaan Windows 95-OpenGL 1.1 terbaru boleh didapati dari Microsoft sebagai opengl95.exe, dan kira-kira 0,5 MB.

  • Java 1.2, tersedia dari Sun. (Perhatikan bahawa ketika saya menulis ini, Sun telah meluncurkan Java 1.2 - Release Candidate 1. Contoh akan dikemas kini untuk rilis terbaru secepat mungkin.) Java 3D digabungkan ke dalam platform 1.2, dan Sun telah menyatakan di mailing list java3d-minat bahawa ia tidak berminat untuk melepaskan API dan berusaha membuatnya tersedia dengan pelepasan platform sebelumnya.

Sebagai pilihan, anda mungkin juga ingin memuat turun dokumentasi Java 3D dan kod contoh. Kedua-duanya tersedia dari pautan yang sama dengan Java 3D runtime.

Harap maklum bahawa anda tidak lagi diperlukan untuk menetapkan pemboleh ubah persekitaran CLASSPATH agar java atau appletviewer anda dapat dijalankan untuk mencari perpustakaan perpanjangan. Dengan Java 1.2, Sun akhirnya membuat direktori sambungan standard. Direktori ini terletak di / jre / lib / ext / dalam direktori pemasangan JDK anda. Sebagai contoh, pada sistem saya, Java 1.2 Beta 4 dipasang di:

C:\jdk1.2beta4\

dan direktori sambungan standard ada di:

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

Semua perpustakaan peluasan harus meletakkan arkib balang ke dalam direktori peluasan ini pada waktu pemasangan, dan semua alat JDK standard tahu mencari di sini untuk fail kelas yang diperlukan.

Untuk Sun's Java 3D, arkib ini termasuk kelas umum (didokumentasikan dalam spesifikasi Java 3D API) dan swasta (khusus pelaksanaan Sun). Arkib kelas awam merangkumi:

  • j3dcore.jar- Mengandungi fail kelas untuk pakej 3D Java umum javax.media.j3d.

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

Arkib peribadi merangkumi:

  • j3daudio.jar- Mengarkibkan com.sun.j3d.audiokelas, yang membina sokongan untuk audio spasial di atas salinan khusus dari bahagian Java dari Suara Java, mesin audio berasaskan Headspace, memulai debutnya di Java 1.2.

  • j3dutils.jar- Merangkumi pelbagai kelas utiliti Sun dalam 16 jumlah pakej dan subpakej di bawahnya com.sun.j3d. Saya akan menggali lebih mendalam mengenai pakej-pakej ini dalam kesinambungan perbincangan Java 3D kami bulan depan.

  • j3dutilscontrib.jar- Arkib utiliti berguna yang disumbangkan oleh orang lain untuk usaha Sun. Terdapat tujuh pakej di bawah com.sun.j3dhierarki, termasuk com.sun.j3d.utils.trackerskod yang disebutkan di atas. Sekali lagi, ruangan bulan depan akan memberikan lebih banyak maklumat mengenai bungkusan dalam balang ini.

Harap maklum bahawa secara teori anda boleh memberi contoh dan kaedah panggilan pada mana-mana kelas yang disediakan dalam pakej yang tidak standard seperti com.sun, tetapi peringatan emptor : Tidak ada jaminan mereka akan tersedia di platform yang digunakan oleh kod anda. Dalam praktik semasa, Java 3D hanya tersedia dari Sun, jadi banyak pembangun menggunakan kelas dalam arkib peribadi Sun. Anda harus menyedari potensi pertukaran yang berpotensi untuk memilih untuk melakukannya.

Tidak ada keajaiban bagaimana kelas Java 3D awam dan swasta berinteraksi dengan sumber sistem, baik. Sun memasang perpustakaan asli di dalam J3D.dlldan j3daudio.dlldi bawah /jre/bin/direktori. Kelas Java 3D menggunakan kaedah asli untuk memanggil DLL dan antara muka dengan platform Win32 dan perpustakaan rendering OpenGL. (Perpustakaan serupa ada untuk pelaksanaan Solaris.)

Satu catatan terakhir mengenai pemasangan: Pipa rendering OpenGL dirancang untuk memanfaatkan perkakasan pecutan OpenGL untuk mempercepat aplikasi grafik anda. Walau bagaimanapun, untuk tujuan lajur ini, anda seharusnya dapat bereksperimen dengan contoh tanpa perkakasan khas. (Sebenarnya, saya mengembangkan semua contoh pada komputer riba MMM Pentium 150-MHz tanpa perkakasan pecutan OpenGL.) Sekiranya anda berminat dengan kad pecutan, anda harus merujuk ke laman Web OpenGL atau senarai mel 3D Java ( lihat Sumber) untuk maklumat lebih lanjut. Saya merancang untuk memasukkan sedikit lebih banyak maklumat dalam lajur Java 3D bulan depan mengenai perkakasan pecutan juga.

Membina cawangan pemandangan tempat kejadian

Seperti yang saya nyatakan sebelumnya, salah satu kekuatan terbesar dari model grafik grafik pemandangan ialah ia membolehkan pengaturcara grafik yang tidak berpengalaman menambahkan 3D pada aplikasinya. Secara tradisinya, pengaturcara 3D harus menentukan di mana dan bagaimana garis-garis individu atau primitif grafik lain akan dilukis. Namun, dengan menggunakan grafik pemandangan, pengaturcara hanya membuat struktur seperti pohon yang mengandungi simpul yang mewakili objek yang akan diberikan serta arahan rendering (seperti di mana sudut pandang yang dipaparkan ke monitor berada, geometri fizikal dunia 3D pengaturcara adalah mewujudkan, dan jarak relatif antara perkara).