עם החלטתי לשחרר לפומבי את הפרוייקט שכתבתי במסגרת קורס גרפיקה ממוחשבת באוניברסיטה הפתוחה, עולה הצורך להסביר את הפרוייקט למי שאינם מכירים את הקורס אבל עדיין רוצים לעיין בפרוייקט. החומר הנלמד בקורס כולל בסיס אלגוריתמי לגרפיקה ממוחשבת קלאסית וגם מטלות תכנות הנכתבות באמצעות הספריות OpenGL, Glu ו-glut. החומר הנלמד לא כולל שימוש ב-shaders, אלא בסגנון המקביל לזה המתואר ב"ספר האדום" שבלינק הזה. הערה נוספת - הקורס נלמד עם דוגמאות תכנות ב-C++ כאשר דרישת קדם לקורס היא ידיעת שפת C, מתוך הנחה שמי שיודע C יוכל להבין כיצד להשתמש ב-C++. אי לכך, הקוד בפרוייקט הזה סובל ממשבר זהות והוא מריח כמו קוד C++ שנכתב על ידי מתכנתת C שאלתרה כל הדרך.
בפרוייקט הסיום נדרשתי לבנות רובוט ב-OpenGL שהמשתמש יכול לשלוט בו. הרובוט נמצא בעולם תלת-ממדי המכיל רצפה, כמה עצמים שונים, תאורה סביבתי ולפחות מקור אור אחד. מבין הפיצ'רים שנתבקשתי להוסיף לפרוייקט נמנים:
- הרובוט צריך להזיז את הראש שלו למעלה, למטה ולצדדים.
- הרובוט צריך לנוע במרחב.
- לרובוט יש זרוע תלת מפרקית בה כל המפרקים ניתנים להזזה.
- כל האובייקטים בסצנה מורכבים מחומרים שונים, בעלי תכונות שונות. חומר אחד לפחות צריך להיות מתכתי, הרצפה צריכה להיות מבריקה.
- ניתן לשנות את מיקום המצלמה וגם להחליף בין מצלמה חיצונית (third-person) לבין צפיה מנקודת מבטו של הרובוט (first-person).
- ניתן לשנות את מיקום מקורות האור ועצמת ההארה.
סבבוטGL הוא רובוט בעל זרוע אחת שגר בחדר עם שולחן וכיסא. הוא לא זקוק לכיסא, לאוכל ולשתיה אבל הוא אוהב לארח ולכן הוא מחזיק בחדרו גם קנקן תה מקרר ופח אשפה. סבבוטGL יודע להזיז את כל שלושת מפרקי הזרוע שלו ולהתגלגל בחדרו, והוא מזמין את המשתמש להביט בטבלת המקשים כדי ללמוד איך להזיזו.
ניתן להזיז גם את המצלמה כדי לשנות זווית ראיה על ידי לחיצה על F4. המצלמה תמיד מצביעה על מרכז החדר. אפשר להחליף את זווית הראיה לזווית הראיה של סבבוטGL ולראות את העולם דרך עיניו באמצעות לחיצה על F3. במקרה זה מצב ההזזה יחזור באופן אוטומטי למצב הזזת רובוט. לחיצה נוספת על F3 תחזיר את זווית הראיה למצלמה החיצונית. מצב הזזה נוסף הוא מצב הזזת תאורה שניתן להגיע אליו על ידי לחיצה על F5. אפשר להגביר ולהחליש את עוצמת האור, להזיז את מקור האור ולשנות את הכיוון שלו. כדי לחזור למצב ההזזה המקורי, מצב הזזת רובוט, יש ללחוץ על F2.
מומלץ לעבור על הפרוייקט בסדר הזה:
-
קריאת הקובץ הזה במלואו
-
קמפול והרצת הפרוייקט לפי השלבים המתוארים בסוף הקובץ הזה
-
קריאת הקוד בסדר הבא:
א. main.cpp
ב. sababot.h
ג. sababot.cpp
קבצי הפרוייקט נמצאים בתיקיה SababotGL שנמצאת בתיקיה mmn17 שבריפו זה.
- Main.cpp – מכיל את פונקציית הריצה ופונקציות נוספות שקשורות לריצה.
- sababot.cpp – מכיל את הפונקציות המציירות ומשנות את הסצנה ומשתנים של הסצנה.
- Sababot.h – מכיל את הקבועים של הסצנה והצהרות לפונקציות.
- stb_image.h – ספריה נוספת לצורך טעינת תמונות לטקסטורות.
- textures – תיקיה המכילה את הטקסטורות שבשימוש בפרוייקט.
- screenshots – תיקיה המכילה צילומי מסך מתוך התוכנית.
יש לקמפל את sababot.cpp לפני main.cpp.
מומלץ עם תחילת הריצה ללחוץ F1 ולצפות בתפריט העזרה. תפריט העזרה הוא מעט שקוף כך שניתן ללחוץ על המקשים תוך כדי צפיה בתפריט ולראות כיצד הסצנה משתנה. לשם פשטות השימוש והקריאה, תפריט העזרה הוא לא טקסטואלי אלא ויזואלי ולכן בתפריט מופיעים המקשים עליהם ניתן ללחוץ אך הושמטו הפרטים המדוייקים.
גוף הרובוט זז באופן זהה לאופן התזוזה במשחקי ירי בגוף ראשון (first person shooter) – סיבוב (strafe) ותזוזה קדימה או אחורה. זה קצת פחות אינטואיטיבי כאשר המצלמה נמצאת מול הרובוט, אבל מאוד נוח כאשר המצלמה נמצאת מאחורי הרובוט או כאשר נכנסים למצב גוף ראשון (F3). התנועה הזאת טבעית יותר ומזכירה תנועה של בני אדם.
הראש והמפרקים של הרובוט זזים באופן דומה יחסית לתזוזה של מפרקים אנושיים. למשל, המרפק ניתן רק לקיפול ולפתיחה, בדומה למרפק אנושי. “כף היד" של הרובוט אינה בסגנון אנושי ויכולה להסתובב 360 מעלות לכל כיוון.
תזוזת המצלמה (F4) ממומשת כך שלמשתמש יהיה טבעי ונוח להזיז אותה. המצלמה תמיד מביטה למרכז הסצנה וניתן לסובב אותה סביב הסצנה (pan), ניתן לבצע זום אין או זום אאוט וניתן להגביה או להנמיך את המצלמה.
תזוזת מיקום וכיוון התאורה (F5) ממומשת באמצעות הזזה פשוטה לאורך שלושת הצירים. מומלץ להרחיק את המצלמה מהסצנה כדי לראות את האפקט של הזזת התאורה.
לחיצה על הלחצן הימני של העכבר תוביל לתפריט העכבר, שם ניתן למצוא גישה נוספת לתפריט העזרה, גישה לתפריט שינוי תאורת רקע וכפתור יציאה מהתוכנית.
| מקש | פעולה | הערות |
|---|---|---|
| RIGHT-CLICK | פתיחת תפריט עכבר | |
| יציאה מתפריט עכבר | לחיצה על הלחצן השמאלי של העכבר מחוץ לתפריט | |
| F1 | צפיה ב-help | לחיצה נוספת על F1 תצא מ-help |
| פתיחת adjust ambient | רק דרך תפריט עכבר | |
| ESC | סגירת adjust ambient |
| מקש | פעולה | הערות |
|---|---|---|
| F2 | מצב הזזת רובוט | |
| D | הזזת ראש רובוט ימינה | |
| A | הזזת ראש רובוט שמאלה | |
| W | הזזת ראש רובוט למעלה | |
| S | הזזת ראש רובוט למטה | |
| RIGHT | הזזת רובוט ימינה | |
| LEFT | הזזת רובוט שמאלה | |
| UP | הזזת רובוט קדימה | |
| DOWN | הזזת רובוט אחורה | |
| H | הזזת מפרק כתף ימינה | |
| F | הזזת מפרק כתף שמאלה | |
| T | הזזת מפרק כתף קדימה | |
| G | הזזת מפרק כתף אחורה | |
| J | קיפול מרפק פנימה | |
| U | מתיחת מרפק החוצה | |
| I | סיבוב כף היד פנימה | |
| K | סיבוב כף היד החוצה |
| מקש | פעולה | הערות |
|---|---|---|
| F3 | החלפת נקודת מבט | החלפה בין מצלמה חיצונית לבין first-person view |
| F4 | מצב הזזת מצלמה | |
| UP | זום אין | |
| DOWN | זום אאוט | |
| RIGHT | סיבוב מצלמה ימינה | |
| LEFT | סיבוב מצלמה שמאלה | |
| PAGE DOWN | הנמכת מצלמה | |
| PAGE UP | הגבהת מצלמה |
| מקש | פעולה | הערות |
|---|---|---|
| F5 | מצב הזזת מקור אור | |
| RIGHT | הזזת מקור האור X+ | |
| LEFT | הזזת מקור האורX- | |
| UP | הזזת מקור האור למעלה | |
| DOWN | הזזת מקור האור למטה | |
| END | הזזת מקור האור Z+ | |
| HOME | הזזת מקור האור Z- | |
| D | הזזת כיוון האור X+ | |
| A | הזזת כיוון האורX- | |
| W | הזזת כיוון האור למעלה | |
| S | הזזת כיוון האור למטה | |
| E | הזזת כיוון האור Z+ | |
| Q | הזזת כיוון האור Z- | |
| R | הגברת עוצמת אור | |
| F | הנמכת עוצמת אור |







