การเขียนโปรแกรมกราฟิก 3 มิติใน Java ตอนที่ 1: Java 3D

ในการสร้างแพลตฟอร์ม Java ที่แท้จริง Sun ได้ตระหนักตั้งแต่เนิ่นๆว่าจำเป็นต้องกรอกรูปภาพ API นอกเหนือจากฟังก์ชันที่ จำกัด ที่มีอยู่ในแพลตฟอร์มหลักของ Java 1.0 Sun ได้พัฒนาแกนหลักอย่างมากด้วย 1.1 และ 1.2 ที่กำลังจะมาถึง แต่ก็ยังมีบางส่วนที่ขาดหายไปจากปริศนา Java

Sun และพันธมิตรได้พัฒนา Java Media and Communication APIs เพื่อจัดหาชิ้นส่วนโปรแกรมมัลติมีเดียที่ขาดหายไป สองชิ้นที่ใหญ่ที่สุดคือกราฟิก 2D และ 3D กำหนดเป้าหมายด้วย Java 2D และ 3D API ตามลำดับ Java 2D เป็น API แพลตฟอร์มหลักที่เริ่มต้นด้วย Java 1.2 ในขณะที่ Java 3D จะออกเป็น Extension API ไม่นานหลังจากแพลตฟอร์ม 1.2 พร้อมใช้งาน เราเพิ่งเสร็จสิ้นชุดคอลัมน์บน Java 2D ตอนนี้เราหันมาสนใจ Java 3D

Java 3D มีขึ้นเพื่อให้นักพัฒนา Java สามารถเขียนแอพเพล็ตและแอปพลิเคชันที่ให้เนื้อหาแบบโต้ตอบสามมิติแก่ผู้ใช้ Sun มีการแข่งขันที่หนักหน่วงจากเทคโนโลยีกราฟิก 3 มิติอื่น ๆ ในเวทีนี้และ Java 3D มีการต่อสู้ที่ยากลำบากอยู่ข้างหน้าหากจะเอาชนะมาตรฐานกราฟิกที่มีหน้าที่ OpenGL

คำขอสำหรับความคิดเห็นของผู้อ่านเกี่ยวกับ API กราฟิก 3D สำหรับ Java แสดงให้เห็นถึงความสนใจอย่างจริงจังในการเชื่อมโยง Java 3D และ Java OpenGL ดังนั้นฉันจึงตัดสินใจที่จะมุ่งเน้นไปที่เทคโนโลยีเหล่านี้ในอีกไม่กี่เดือนข้างหน้า

จำนวนดอกเบี้ยที่ จำกัด มากขึ้นถูกแสดงใน VRML ดังนั้นฉันจะจัดการกับ VRML โดยสาธิตการใช้งานใน Java 3D ด้วยตัวโหลดเนื้อหา VRML97 และเบราว์เซอร์ Java 3D VRML97 ของ Sun Direct3D ได้รับความสนใจน้อยมากดังนั้นฉันจึงตัดสินใจที่จะไม่ดำเนินตามเส้นทางนี้ยกเว้นจะพูดถึงจุดที่เทคโนโลยีอื่น ๆ อาจสนับสนุนหรือทำงานร่วมกันได้

ข้อดีข้อเสียของ Java 3D

เดือนนี้เราเริ่มทัวร์ 3D graphics APIs สำหรับ Java โดยการสำรวจ Java 3D เราจะเริ่มต้นด้วยการพูดคุยถึงจุดแข็งและจุดอ่อนที่สำคัญของ API ในบางครั้งกราฟิก 3D อาจดูเหมือนป้านและอธิบายได้ยาก หากคุณมีความสับสนเกี่ยวกับตัวอย่างหรือคำอธิบายของฉันโปรดอย่าลังเลที่จะเขียนถึงฉันพร้อมกับคำถามหรือความคิดเห็นของคุณและฉันจะพยายามอย่างเต็มที่เพื่อจัดการกับพวกเขา

จุดขายสำหรับ Java 3D:

  • ให้มุมมองระดับสูงเชิงวัตถุของกราฟิก 3 มิติ Java 3D ทำได้สำเร็จในบางส่วนโดยใช้โมเดลกราฟิก 3 มิติตามกราฟฉาก (เราจะพูดถึงแนวคิดนี้โดยละเอียดเพิ่มเติมในบทความนี้) แนวทางนี้มีไว้เพื่อช่วยให้โปรแกรมเมอร์ที่ไม่มีประสบการณ์ด้านกราฟิกหรือโปรแกรมมัลติมีเดียมากนักสามารถใช้ 3D ในแอปพลิเคชันของตน ในทางตรงกันข้ามอย่างสิ้นเชิงกับ 3D API ระดับล่างขั้นตอนเช่น OpenGL ซึ่งได้รับการออกแบบมาเพื่อเพิ่มประสิทธิภาพเพื่อความเร็วที่ดีที่สุดเท่าที่จะเป็นไปได้และทำให้โปรแกรมเมอร์สามารถควบคุมกระบวนการแสดงผลได้มากที่สุดเท่าที่จะเป็นไปได้ Java 3D นั้นมีความตรงไปตรงมาเพียงพอสำหรับโปรแกรมเมอร์ Java ที่มีประสบการณ์ เรียนรู้.

  • หากคุณไม่ต้องการการเข้าถึงระดับต่ำในการดำเนินการเรนเดอร์ Java 3D อาจเป็นตัวเลือก การเข้าถึงการแสดงผลถูก จำกัด ไว้ที่การร้องขอผ่านแอตทริบิวต์และบิตความสามารถซึ่งคล้ายกันในรูปแบบและฟังก์ชันกับคำแนะนำในการเรนเดอร์ของ Java 2D (ดูแหล่งข้อมูลสำหรับลิงก์ไปยังซีรี่ส์ก่อนหน้าของฉันบน Java 2D ซึ่งรวมถึงการอภิปรายและตัวอย่างคำแนะนำการเรนเดอร์ของ 2D)

  • Java 3D ได้รับการปรับให้เหมาะสมกับความเร็วหากเป็นไปได้ รันไทม์ใช้บิตความสามารถในการเรนเดอร์เพื่อปรับกราฟฉากให้เหมาะสมที่สุดเพื่อการแสดงผลที่เร็วที่สุด แนวทางนี้ทำให้ Java 3D สามารถใช้ได้กับสภาพแวดล้อมกราฟิกเชิงโต้ตอบ (เกมการจำลองสถานการณ์เวลาแฝงต่ำ) มากกว่าแอปพลิเคชันกราฟิกคุณภาพสูงแบบออฟไลน์ (เช่นเรนเดอร์ฟาร์ม)

  • มีรถตัก 3 มิติจำนวนมากขึ้นเรื่อย ๆ เพื่อนำเข้าเนื้อหาไปยังรันไทม์ Java 3D Sun ได้สร้างตัวโหลดไฟล์ Java 3D VRML97 และเบราว์เซอร์ให้ใช้งานได้อย่างอิสระพร้อมโค้ด มองหาคอลัมน์Media Programmingของเดือนถัดไปเพื่อสำรวจ Java 3D loaders โดยละเอียด

  • Java 3D ต้องการความสามารถทางคณิตศาสตร์แบบเวกเตอร์ที่ไม่มีในแพลตฟอร์ม Java ขณะนี้การดำเนินการทางคณิตศาสตร์เหล่านี้อยู่ในjavax.vecmathแพ็คเกจและอาจถูกย้ายไปยังแพลตฟอร์มหลักในอนาคต

  • Java 3D รองรับอุปกรณ์แปลกใหม่จำนวนมาก (เช่นไม้กายสิทธิ์ถุงมือข้อมูลและชุดหูฟังเป็นต้น) com.sun.j3d.utils.trackersแพคเกจรวมกับการดำเนินการของดวงอาทิตย์ให้ชั้นเรียนสำหรับ Fakespace อจิเทคและอุปกรณ์ Polhemus อย่างไรก็ตามอุปกรณ์เหล่านี้ไม่ได้ใช้กันอย่างแพร่หลายดังนั้นฉันจะไม่พูดถึงในรายละเอียดมากนัก หากคุณสนใจที่จะค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการสนับสนุนอุปกรณ์โปรดดูไซต์ Java 3D ของ Sun และที่เก็บรายชื่ออีเมล Java 3D (ทั้งสองรายการมีให้จาก URL หลักของ Sun Java 3D ที่รวมอยู่ในแหล่งข้อมูลด้านล่าง)

Java 3D มีข้อดีมากมาย แต่ข้อเสียล่ะ? ได้แก่ :

  • Java 3D เป็น API ส่วนขยายมาตรฐาน ผู้ได้รับอนุญาตแพลตฟอร์ม Java จะได้รับตัวเลือกในการใช้งาน API หากต้องการ แต่ไม่จำเป็นต้องใช้งาน การวางตำแหน่งของ Java 3D เป็นส่วนขยายมาตรฐานจะเสี่ยงต่อการลดความสามารถในการพกพาโค้ด Java 3D ข้ามแพลตฟอร์ม - ผู้ขายส่วนใหญ่ต้องดิ้นรนเพื่อให้ทันกับการเปลี่ยนแปลงและการเพิ่มเติมในแพลตฟอร์มหลักเพียงอย่างเดียว

  • Java 3D มีข้อ จำกัด ด้านความพร้อมใช้งานที่รุนแรง สิ่งเหล่านี้เป็นผลมาจากสถานะของ Java 3D เป็น API ส่วนขยาย ผู้ให้บริการรายใหญ่รายเดียวที่ให้บริการ Java 3D คือ Sun ซึ่งมีการใช้งาน Solaris และ Win32 เมื่อเทียบกับ OpenGL ซึ่งพร้อมใช้งานสำหรับทุกรสชาติของ Unix, Windows และระบบปฏิบัติการอื่น ๆ การพกพาข้ามแพลตฟอร์มของโค้ด Java 3D นั้นดูน่าสงสัย

  • พร้อมกับปัญหาความพร้อมใช้งานของซอฟต์แวร์มาพร้อมกับการขาดดุลเอกสาร Sun กำลังพยายามอย่างกล้าหาญในการให้การฝึกอบรมนักพัฒนาและการสนับสนุน Java 3D แต่ก็ยังถือว่าสั้นเมื่อเทียบกับความพยายามอื่น ๆ ของอุตสาหกรรมในการจัดทำเอกสาร OpenGL และการใช้งาน เว็บไซต์ของ OpenGL Consortium นั้นลึกและกว้างกว่าสิ่งใด ๆ ที่ Sun ได้จัดการรวมกันสำหรับ Java 3D จนถึงตอนนี้ นี่ไม่ใช่ประเด็นเล็กน้อย: ความซับซ้อนสัมพัทธ์ของ API กราฟิก 3 มิติทำให้เอกสารที่ดีเป็นสิ่งจำเป็น

  • Java 3D ซ่อนรายละเอียดการแสดงผลไปป์ไลน์จากผู้พัฒนาเนื่องจาก Java 3D เป็น API ระดับสูงจึงตั้งใจซ่อนรายละเอียดของไปป์ไลน์การแสดงผลจากผู้พัฒนาซึ่งทำให้ไม่เหมาะสำหรับปัญหาจำนวนมากที่รายละเอียดดังกล่าวมีความสำคัญ (เราจะพูดถึงโมเดลระดับล่างของ OpenGL และการเข้าถึงไปป์ไลน์การเรนเดอร์ในซีรีส์ 3 มิตินี้)

  • ส่วนประกอบ Java 3D มีน้ำหนักมาก นั่นคือพวกเขามีเพียร์ดั้งเดิม (ไม่ใช่ Java) ที่ทำการเรนเดอร์จริง สิ่งนี้อาจทำให้การพัฒนา GUI ของคุณซับซ้อนขึ้นหากคุณใช้ Java Swing และส่วนประกอบ Java ทั้งหมดหรือน้ำหนักเบา มีวิธีแก้ปัญหาพิเศษบางประการ แต่โดยทั่วไปส่วนประกอบที่มีน้ำหนักเบาและมีน้ำหนักมากไม่สามารถผสมกันได้ในวัตถุและหน้าต่างคอนเทนเนอร์เดียวกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับปัญหาส่วนประกอบน้ำหนักเบา - รุ่นเฮฟวี่เวทได้จากแหล่งข้อมูลในตอนท้ายของบทความนี้

การติดตั้ง Java 3D

ตอนนี้เราเข้าใจคุณสมบัติและข้อ จำกัด ที่สำคัญของ Java 3D แล้วมาลองใช้โค้ดตัวอย่างกัน

Java 3D พร้อมใช้งานในรุ่นเบต้าสำหรับ Win32 และ Solaris การใช้งาน Java 3D ของ Sun ที่เป็นผู้ใหญ่มากขึ้นนั้นสร้างขึ้นจาก OpenGL นอกจากนี้ยังมีการใช้ Direct3D คุณภาพอัลฟาสำหรับ Win32 ทั้งหมดต้องใช้ Java 1.2 โดย Java 3D beta ล่าสุดที่สอดคล้องกับ Java 1.2 Beta 4 Sun ได้สัญญาว่าจะเปิดตัวการใช้งาน Java 3D ขั้นสุดท้ายไม่นานหลังจากที่เผยแพร่ Java 1.2 ซึ่งปัจจุบันมีกำหนดในเดือนธันวาคม 1998

ความสับสนเล็กน้อย: Sun เปิดตัวการใช้งาน Java 3D 1.0 alpha ซึ่งสอดคล้องกับ Java 3D 1.0 API แต่ไม่เคยเปิดตัวอะไรเลยนอกจาก alpha สำหรับ 1.0 API Sun ได้แก้ไข API แล้วปล่อยเวอร์ชันที่แก้ไขแล้วเป็น Java 3D 1.1 API เวอร์ชันนี้ตามมาด้วยการเปิดตัวของสิ่งที่เรียกว่าการใช้งาน 1.1 เบต้าสองครั้ง Sun ได้สัญญาว่าจะปล่อย API ขั้นสุดท้ายและการใช้งานไม่นานหลังจากที่แพลตฟอร์ม Java 1.2 รุ่นสุดท้ายออก หวังว่า API จะเสถียรและจะไม่ได้รับการปรับปรุงอีกต่อไปโดยที่โลกยังคงรอการเปิดตัวการใช้งานครั้งสุดท้าย

เนื่องจากเราจะครอบคลุมการผูก Java OpenGL ในคอลัมน์ในอนาคตฉันจึงตัดสินใจประหยัดและใช้ Java 3D เวอร์ชัน OpenGL ในคำแนะนำการติดตั้งเหล่านี้ด้วย หากคุณติดตั้งเวอร์ชัน OpenGL เพื่อใช้กับตัวอย่าง Java 3D เหล่านี้คุณจะมีไลบรารีการแสดงผลที่คุณต้องการสำหรับตัวอย่าง Java-OpenGL ในภายหลัง

ส่วนประกอบซอฟต์แวร์ที่คุณต้องใช้ Java 3D ได้แก่ :

  • รันไทม์ Java 3D พร้อมใช้งานจาก Sun (ต้องลงชื่อเข้าใช้ Java Developer Connection ฟรี) อย่าลืมเลือก Java 3D เวอร์ชัน OpenGL สำหรับแพลตฟอร์มของคุณ (ฉันใช้ Win32) ณ ตอนนี้ Win32 Java 3D ล่าสุดสำหรับ OpenGL คือ 1.1 Beta 2 ใน java3d11-beta2-win32-opengl.exe และมีน้ำหนักประมาณ 1.7 MB

  • OpenGL 1.1 มาพร้อมกับ Windows NT 4.0 และ Windows 95 OSR 2 หากคุณมี Windows 95 รุ่น OSR 1 คุณสามารถดาวน์โหลดการสนับสนุน OpenGL ได้ การใช้งาน Windows 95-OpenGL 1.1 ล่าสุดมีให้จาก Microsoft ในชื่อ opengl95.exe และมีขนาดประมาณ 0.5 MB

  • Java 1.2 พร้อมให้บริการในวันอาทิตย์ (โปรดทราบว่าในขณะที่ฉันเขียนสิ่งนี้ Sun ได้เปิดตัว Java 1.2 - Release Candidate 1 ใหม่ตัวอย่างจะได้รับการอัปเดตสำหรับรุ่นล่าสุดโดยเร็วที่สุด) Java 3D ประกอบเข้ากับแพลตฟอร์ม 1.2 และ Sun ได้ระบุไว้ใน รายชื่อผู้รับจดหมาย java3d ที่ไม่สนใจในการแยก API และพยายามทำให้พร้อมใช้งานกับแพลตฟอร์มรุ่นก่อนหน้า

หรือคุณอาจต้องการดาวน์โหลดเอกสาร Java 3D และโค้ดตัวอย่าง ทั้งสองอย่างสามารถใช้ได้จากลิงค์เดียวกันกับรันไทม์ Java 3D

โปรดทราบว่าคุณไม่จำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อม CLASSPATH อีกต่อไปเพื่อให้ไฟล์ปฏิบัติการ java หรือ appletviewer ของคุณค้นหาไลบรารีส่วนขยาย ด้วย Java 1.2 ในที่สุด Sun ก็ได้สร้างไดเร็กทอรีส่วนขยายมาตรฐาน ไดเร็กทอรีนี้อยู่ที่ / jre / lib / ext / ภายในไดเร็กทอรีการติดตั้ง JDK ของคุณ ตัวอย่างเช่นในระบบของฉัน Java 1.2 Beta 4 ได้รับการติดตั้งที่:

C:\jdk1.2beta4\

และไดเร็กทอรีส่วนขยายมาตรฐานอยู่ที่:

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

ไลบรารีส่วนขยายทั้งหมดควรวางไฟล์เก็บถาวร jar ไว้ในไดเร็กทอรีส่วนขยายนี้ในเวลาติดตั้งและเครื่องมือ JDK มาตรฐานทั้งหมดควรค้นหาไฟล์คลาสที่ต้องการที่นี่

สำหรับ Java 3D ของ Sun ที่เก็บถาวรเหล่านี้จะรวมทั้งคลาสสาธารณะ (เอกสารในข้อกำหนด Java 3D API) และคลาสส่วนตัว (เฉพาะการใช้งาน Sun) จดหมายเหตุระดับสาธารณะ ได้แก่ :

  • j3dcore.jar- javax.media.j3dมีคลาสไฟล์สำหรับแพคเกจ

  • vecmath.jar- มีคลาสสำหรับjavax.vecmath.

จดหมายเหตุส่วนตัว ได้แก่ :

  • j3daudio.jar- เก็บcom.sun.j3d.audioคลาสซึ่งสร้างการสนับสนุนสำหรับเสียงเชิงพื้นที่ที่ด้านบนของสำเนาที่กำหนดเองของส่วน Java ของ Java Sound, เอ็นจิ้นเสียงที่ใช้ Headspace, การเปิดตัวใน Java 1.2

  • j3dutils.jar- สุนทรีย์มีความหลากหลายของดวงอาทิตย์อาคารเรียนในแพคเกจ 16 com.sun.j3dรวมและแพ็กเกจย่อยที่อยู่ภายใต้ ฉันจะเจาะลึกลงไปในแพ็คเกจเหล่านี้ในการสนทนา Java 3D ของเราต่อไปในเดือนหน้า

  • j3dutilscontrib.jar- โปรแกรมอรรถประโยชน์ที่เป็นประโยชน์ของคลังเก็บมีส่วนร่วมโดยผู้อื่นในความพยายามของ Sun มีเจ็ดแพ็คเกจภายใต้com.sun.j3dลำดับชั้นรวมถึงcom.sun.j3d.utils.trackersรหัสที่กล่าวถึงข้างต้น อีกครั้งคอลัมน์ของเดือนถัดไปจะให้ข้อมูลเพิ่มเติมเกี่ยวกับแพ็คเกจในขวดนี้

โปรดทราบว่าในทางทฤษฎีคุณสามารถสร้างอินสแตนซ์และเรียกใช้เมธอดในคลาสใด ๆ ที่มีให้ในแพ็คเกจที่ไม่เป็นมาตรฐานเช่นcom.sunแต่ไม่มีข้อแม้ : ไม่มีการรับประกันว่าจะพร้อมใช้งานบนแพลตฟอร์มที่รหัสของคุณดำเนินการ ในทางปฏิบัติปัจจุบัน Java 3D มีให้บริการจาก Sun เท่านั้นดังนั้นในความเป็นจริงแล้วนักพัฒนาจำนวนมากจึงใช้คลาสภายในที่เก็บถาวรส่วนตัวของ Sun คุณควรตระหนักถึงการแลกเปลี่ยนความสามารถในการพกพาที่อาจเกิดขึ้นในการเลือกทำเช่นนั้น

ไม่มีความมหัศจรรย์ในการเชื่อมต่อคลาส Java 3D สาธารณะและส่วนตัวกับทรัพยากรระบบเช่นกัน Sun ติดตั้งไลบรารีดั้งเดิมในJ3D.dllและj3daudio.dllภายใต้/jre/bin/ไดเร็กทอรี คลาส Java 3D ใช้เมธอดดั้งเดิมเพื่อเรียก DLL และอินเทอร์เฟซเหล่านี้กับแพลตฟอร์ม Win32 และไลบรารีการแสดงผล OpenGL (มีไลบรารีที่คล้ายกันสำหรับการใช้งาน Solaris)

หมายเหตุสุดท้ายเกี่ยวกับการติดตั้ง: ไปป์ไลน์การแสดงผล OpenGL ได้รับการออกแบบมาเพื่อใช้ประโยชน์จากฮาร์ดแวร์เร่งความเร็ว OpenGL เพื่อเร่งความเร็วแอปพลิเคชันกราฟิกของคุณ อย่างไรก็ตามสำหรับวัตถุประสงค์ของคอลัมน์นี้คุณควรทดลองกับตัวอย่างได้โดยไม่ต้องใช้ฮาร์ดแวร์พิเศษใด ๆ (อันที่จริงฉันกำลังพัฒนาตัวอย่างทั้งหมดบนแล็ปท็อป Pentium 150-MHz MMX ที่ไม่มีฮาร์ดแวร์เร่งความเร็ว OpenGL) หากคุณสนใจการ์ดเร่งความเร็วคุณควรดูเว็บไซต์ OpenGL หรือรายชื่อผู้รับจดหมาย Java 3D ( ดูแหล่งข้อมูล) สำหรับข้อมูลเพิ่มเติม ฉันวางแผนที่จะรวมข้อมูลเพิ่มเติมเล็กน้อยในคอลัมน์ Java 3D ของเดือนหน้าเกี่ยวกับฮาร์ดแวร์เร่งความเร็วด้วย

การสร้างสาขามุมมองของฉาก

ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้จุดแข็งที่ใหญ่ที่สุดอย่างหนึ่งของโมเดลกราฟิกกราฟฉากคือการช่วยให้โปรแกรมเมอร์กราฟิกที่ไม่มีประสบการณ์สามารถเพิ่ม 3D ลงในแอปพลิเคชันของตนได้ ตามเนื้อผ้าโปรแกรมเมอร์ 3D จะต้องระบุว่าจะวาดเส้นแต่ละเส้นหรืออย่างไร อย่างไรก็ตามการใช้กราฟฉากโปรแกรมเมอร์เพียงแค่สร้างโครงสร้างแบบต้นไม้ที่มีโหนดที่แสดงถึงวัตถุที่จะแสดงผลรวมทั้งคำแนะนำในการแสดงผล (เช่นตำแหน่งที่มุมมองที่แสดงบนจอภาพตั้งอยู่เรขาคณิตทางกายภาพของโลก 3 มิติที่โปรแกรมเมอร์ กำลังสร้างและระยะทางสัมพัทธ์ระหว่างสิ่งต่างๆ)