תכנות גרפיקה תלת מימדית בג'אווה, חלק 1: Java 3D

על מנת לבנות פלטפורמת ג'אווה אמיתית, סאן הבינה בשלב מוקדם שהיא צריכה למלא את תמונת ה- API מעבר לפונקציונליות המוגבלת הקיימת בפלטפורמת הליבה של Java 1.0. סאן הגדילה את הליבה הרבה מאוד עם גרסאות ה- 1.1 וה -1.2 הממשמש ובא, אך עדיין חסרים חלקים בפאזל Java.

סאן ושותפיה פיתחו את ממשקי ה- API של מדיה ותקשורת Java כדי לספק את חלקי התכנות החסרים למולטימדיה. שניים מהיצירות הגדולות ביותר, גרפיקה דו-ממדית ותלת-ממדית, ממוקדות באמצעות ממשקי ה- API של Java 2D ו- 3D בהתאמה. Java 2D הוא ממשק API של פלטפורמת ליבה המתחיל ב- Java 1.2, ואילו Java 3D ישוחרר כ- API של הרחבה זמן קצר לאחר שהפלטפורמה 1.2 תהיה זמינה. סיימנו לאחרונה סדרת עמודות ב- Java 2D; כעת אנו מפנים את תשומת ליבנו ל- Java 3D.

Java 3D נועד לתת למפתחי Java את היכולת לכתוב יישומונים ויישומים המספקים תוכן אינטראקטיבי בתלת מימד למשתמשים. ל- Sun יש תחרות כבדה מטכנולוגיות גרפיקה תלת-ממדיות אחרות בזירה זו, וג'אווה תלת מימד עומדת לפני מאבק עלייה אם היא תביס את תקן הגרפיקה המכהן, OpenGL.

בקשה להערות קוראים על ממשקי API של גרפיקה תלת ממדית עבור Java הצביעה על עניין רציני בקשרי Java 3D ו- Java OpenGL, ולכן החלטתי לרכז את מאמצי בטכנולוגיות אלה בחודשים הקרובים.

כמות מוגבלת יותר של עניין התבטאה ב- VRML. כתוצאה מכך אני הולך להתמודד עם VRML על ידי הדגמת השימוש בו ב- Java 3D עם מעמיסי תוכן VRML97 ודפדפן Java 3D VRML97 של Sun. Direct3D זכה להתעניינות מועטה מאוד, ולכן החלטתי שלא להמשיך בדרך זו, למעט להזכיר היכן שאחת הטכנולוגיות האחרות עשויה לתמוך בה או לשתף פעולה איתה.

יתרונות וחסרונות של Java 3D

החודש אנו מתחילים את הסיור שלנו בממשקי API של גרפיקה תלת ממדית עבור Java על ידי חקר Java 3D. נתחיל בדיון על כמה מהעוצמות והחולשות העיקריות של ה- API. גרפיקה תלת מימדית יכולה להיראות לעתים כה דיה ולכן יכולה להיות קשה להסביר אותה. אם יש לך בלבול מתמשך לגבי הדוגמאות או ההסברים שלי, אל תהסס לכתוב לי עם השאלות או ההערות שלך, ואעשה כמיטב יכולתי לטפל בהם.

מכירת נקודות עבור Java 3D:

  • הוא מספק מבט מונחה עצמים ברמה גבוהה של גרפיקה תלת ממדית. Java 3D משיג זאת בין השאר באמצעות מודל גרפי תלת-ממדי מבוסס גרף . (נדון במושג זה ביתר פירוט בהמשך המאמר.) גישה זו נועדה לעזור למתכנתים ללא ניסיון רב בתכנות גרפיקה או מולטימדיה להשתמש בתלת מימד ביישומים שלהם. בניגוד מוחלט לממשקי API 3D פרוצדורליים ברמה נמוכה יותר כמו OpenGL, שנועדו לייעל את המהירות הטובה ביותר האפשרית ולתת למתכנתים את השליטה הגדולה ביותר האפשרית בתהליך העיבוד, Java 3D נועד להיות פשוט מספיק עבור כל מתכנת Java מנוסה. לִלמוֹד.

  • אם אינך זקוק לגישה ברמה נמוכה לפעולות העיבוד, Java 3D עשוי להיות אפשרות. גישת עיבוד מוגבלת בקשות באמצעות תכונות ו ביטי יכולת, דומים בצורה ובתפקוד לרמזי הטיוח של Java 2D. (ראה משאבים לקישורים לסדרה הקודמת שלי ב- Java 2D, שכללה דיונים ודוגמאות לרמזים לעיבוד 2D).

  • Java 3D מותאם למהירות במידת האפשר. זמן הריצה משתמש בסיביות יכולת טיוח, למעשה, כדי לייעל את גרף הסצנה לקבלת העיבודים המהירים ביותר האפשריים. גישה זו הופכת את Java 3D ליישומי יותר בסביבות גרפיקה אינטראקטיביות (משחקים, סימולציות, מצבי זמן אחזור נמוך) מאשר ליישומי גרפיקה לא מקוונים ואיכותיים (כמו חוות עיבוד).

  • מספר גדול וגדל של מעמיסי תלת מימד זמינים לייבוא ​​תוכן לזמן הריצה התלת-ממדי של ג'אווה. Sun הפכה מטעין קבצים של Java 3D VRML97 ודפדפן לזמין באופן חופשי עם קוד. חפש את העמודה תכנות מדיה בחודש הבא כדי לחקור את מטעני התלת-ממד של Java בפירוט רב יותר.

  • Java 3D דורש יכולות מתמטיקה וקטוריות שאינן זמינות במקומות אחרים בפלטפורמת Java. פעולות מתמטיקה אלה ממוקמות כעת javax.vecmathבחבילה ועשויות לעבור לפלטפורמת הליבה בעתיד.

  • Java 3D תומך במספר מכשירים אקזוטיים (שרביטים, כפפות נתונים ודיבוריות, למשל). com.sun.j3d.utils.trackersהחבילה כללה עם היישום של סאן מספקת שיעורי Fakespace, Logitech, והתקני 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, שזמין לכל טעם של יוניקס, חלונות ומערכות הפעלה רבות אחרות, הניידות החוצה פלטפורמות של קוד Java 3D נראית מוטלת בספק.

  • לצד בעיות זמינות תוכנה מגיעים גירעונות בתיעוד. סאן עושה מאמץ אמיץ לספק הדרכה ותמיכה למפתחים ב- Java 3D, אך היא עדיין נופלת בהשוואה לשאר מאמצי התעשייה בתיעוד OpenGL והשימוש בה. אתר ה- OpenGL Consortium הוא הרבה יותר עמוק ורחב יותר מכל מה שסאן הצליחה להרכיב עבור Java 3D עד כה. זו לא נקודה משנית: המורכבות היחסית של ממשקי ה- API הגרפיים בתלת מימד הופכת תיעוד טוב לצורך.

  • ג'אווה תלת ממדי מסתיר את פרטי הצינור לעיבוד מהמפתח. מכיוון ש- Java 3D הוא ממשק API ברמה גבוהה, הוא מסתיר בכוונה את פרטי צינור העיבוד בפני היזם, מה שהופך אותו ללא מתאים למספר משמעותי של בעיות כאשר פרטים כאלה חשובים. (נדון במודל ברמה התחתונה של OpenGL ובגישה לצינור העיבוד בהמשך בסדרת תלת מימד זו).

  • רכיבי Java 3D הם במשקל כבד. כלומר, יש להם עמית מקורי (שאינו ג'אווה) שלמעשה מבצע את העיבוד. זה יכול לסבך את פיתוח ה- GUI שלך אם אתה משתמש ב- Java Swing וברכיביו הכוללים Java, או קלים משקל. יש כמה דרכים לעקיפת הבעיה המיוחדות, אך באופן כללי, רכיבים קלים ומשקל כבד אינם מתערבבים היטב באותם חפצי מכולה וחלונות. מידע נוסף על בעיות רכיבים קלים ומשקלים זמין במשאבים בסוף מאמר זה.

התקנת Java 3D

כעת, לאחר שהבנו את התכונות העיקריות והמגבלות של Java 3D, בואו ונהיה מוכנים לנסות קוד לדוגמא.

Java 3D זמין בגרסת בטא עבור Win32 ו- Solaris. המבוגרים יותר של יישומי Sun של Java 3D נבנו על גבי OpenGL. יישום Direct3D באיכות אלפא זמין גם עבור Win32. כולם דורשים ג'אווה 1.2, עם הג'אווה התלת מימדית העדכנית ביותר המתאימה לג'אבה 1.2 בטא 4. סאן הבטיחה לשחרר את ההטמעה הסופית של ג'אווה תלת מימד זמן קצר לאחר שהיא תשחרר את ג'אווה 1.2, המתוכננת כעת לדצמבר 1998.

בצד מעט מבלבל: Sun פרסמה יישומי אלפא של Java 3D 1.0, שתואמים ל- Java 3D 1.0 API, אך היא מעולם לא פרסמה דבר מעבר ל- Alpha עבור API API 1.0. לאחר מכן, סאן שינתה את ה- API, ושחררה את הגרסה שהשתנתה כ- Java 3D 1.1 API. גרסה זו באה בעקבותיה עם מהדורות של מה שכינה 1.1 יישומי בטא, שתיים עד כה. סאן הבטיחה לשחרר ממשק API ויישום סופי זמן קצר לאחר המהדורה הסופית של פלטפורמת Java 1.2. יש לקוות, ה- API התייצב ולא יעבור rev, שוב, כשהעולם עדיין ממתין לשחרור סופי של הטמעה.

מכיוון שנעסוק בכריכות Java OpenGL בעמודה עתידית, החלטתי לחסוך ולהשתמש בגרסת OpenGL של Java 3D גם בהוראות ההתקנה האלה. אם תתקין את גרסת OpenGL לשימוש עם דוגמאות Java 3D אלה, יהיו לך ספריות העיבוד הדרושות כדי שדוגמאות Java-OpenGL יגיעו מאוחר יותר.

רכיבי התוכנה הדרושים לך כדי להשתמש ב- Java 3D הם:

  • זמן ריצה של Java 3D, זמין מ- Sun (יש צורך בכניסה לחיבור Java Developer בחינם). הקפד לבחור בגרסת OpenGL של Java 3D לפלטפורמה שלך (אני משתמש ב- Win32). נכון לעכשיו, Win32 Java 3D האחרון עבור OpenGL הוא 1.1 Beta 2, ב- java3d11-beta2-win32-opengl.exe, ומשקלו כ 1.7 מגה.

  • OpenGL 1.1, יחד עם Windows NT 4.0 ו- Windows 95 OSR 2. אם יש לך את המהדורה OSR 1 של Windows 95, תוכל להוריד את תמיכת OpenGL. ההטמעה האחרונה של Windows 95-OpenGL 1.1 זמינה ממיקרוסופט בשם opengl95.exe, והיא בערך 0.5 מגהבייט.

  • Java 1.2, זמין מ- Sun. (שים לב שכשאני כותב את זה, Sun הוציאה Java 1.2 חדש - מועמד לשחרור 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\

כל ספריות ההרחבות צריכות למקם את ארכיוני הצנצנות שלהם בספריית הרחבות זו בזמן ההתקנה, וכל כלי ה- JDK הסטנדרטיים יודעים לחפש כאן קבצי מחלקה נדרשים.

עבור Java 3D של Sun, ארכיונים אלה כוללים שיעורים ציבוריים (מתועדים במפרט Java 3D API) והן שיעורים פרטיים (ספציפיים להטמעה של Sun). ארכיונים בכיתות ציבוריות כוללים:

  • j3dcore.jar- מכיל קבצי כיתות עבור חבילת Java 3D הציבורית javax.media.j3d.

  • vecmath.jar- מכיל שיעורים עבור javax.vecmath.

ארכיונים פרטיים כוללים:

  • j3daudio.jar- מעביר את com.sun.j3d.audioהכיתות, הבונות תמיכה באודיו מרחבי על גבי עותק מותאם אישית של חלק ה- Java של Java Sound, מנוע שמע מבוסס Headspace, המופע לראשונה ב- Java 1.2.

  • j3dutils.jar- מקפל מגוון של שיעורי השירות של Sun ב -16 חבילות וסבילות משנה שמתחת com.sun.j3d. אעמיק בחבילות אלה בהמשך הדיון התלת-ממדי שלנו ב- Java בחודש הבא.

  • j3dutilscontrib.jar- ארכיון כלי עזר שימושי שתרמו אחרים למאמצי סאן. ישנן שבע חבילות מתחת com.sun.j3dלהיררכיה, כולל com.sun.j3d.utils.trackersהקוד שצוין לעיל. שוב, העמודה בחודש הבא תביא מידע נוסף על החבילות בצנצנת זו.

שים לב שבאופן תיאורטי אתה יכול להתקשר לשיטות להתקשר לכל אחת מהשיעורים הניתנים בחבילות לא תקנות כמו com.sun, אך אזהרה ריק : אין שום ערובה שהם יהיו זמינים בפלטפורמה בה הקוד שלך מבצע. בפרקטיקה הנוכחית, Java 3D זמין רק מ- Sun, ולכן הרבה מפתחים משתמשים למעשה בשיעורים בארכיונים הפרטיים של Sun. אתה צריך להיות מודע לפיזור הניידות הפוטנציאלי הכרוך בבחירה לעשות זאת.

אין שום קסם כיצד גם שיעורי Java 3D פרטיים ופרטיים מתממשקים עם משאבי המערכת. סאן מתקין ספריות מקומיות ב J3D.dllו j3daudio.dllתחת /jre/bin/הספרייה. שיעורי התלת-ממד של ג'אווה משתמשים בשיטות מקוריות כדי לקרוא קבצי DLL אלה ומתממשקים לפלטפורמת Win32 וספריית העיבוד של OpenGL. (קיימות ספריות דומות ליישומי Solaris).

הערה אחרונה להתקנה: צינור העיבוד של OpenGL נועד לנצל את חומרת ההאצה של OpenGL כדי להאיץ את יישומי הגרפיקה שלכם. למטרות עמודה זו, אתה אמור להיות מסוגל להתנסות בדוגמאות ללא חומרה מיוחדת. (למעשה, אני מפתח את כל הדוגמאות במחשב נייד MMX של פנטיום 150 מגה-הרץ ללא חומרת תאוצה של OpenGL.) אם אתה מעוניין בכרטיסי תאוצה, עיין באתר OpenGL או ברשימת התפוצה של Java 3D ( ראה משאבים) למידע נוסף. אני מתכוון לכלול קצת יותר מידע בעמודה Java 3D בחודש הבא גם על חומרת תאוצה.

בניית ענף הנוף של הסצנה

כפי שציינתי קודם, אחד החוזקות הגדולות ביותר של מודל הגרפיקה של גרפי הסצנה הוא בכך שהוא מאפשר למתכנתים גרפיים חסרי ניסיון להוסיף תלת מימד ליישומים שלהם. באופן מסורתי, על מתכנתים תלת ממדיים לציין היכן וכיצד יש לצייר קווים בודדים או פרימיטיבים גרפיים אחרים. עם זאת, באמצעות גרף סצנה, המתכנת פשוט יוצר מבנה דמוי עץ המכיל צמתים המייצגים אובייקטים המיועדים לעיבוד וכן הוראות עיבוד (כגון היכן שנמצאת נקודת המבט המוצגת לצג, הגיאומטריה הפיזית של עולם התלת מימד המתכנת. הוא יצירת, ומרחקים יחסית בין הדברים).