כיצד להכין קובייה ב- OpenGL

מְחַבֵּר: Gregory Harris
תאריך הבריאה: 12 אַפּרִיל 2021
תאריך עדכון: 1 יולי 2024
Anonim
פיתוח Hello World ב-++C תוך שימוש ב-Visual Studio
וִידֵאוֹ: פיתוח Hello World ב-++C תוך שימוש ב-Visual Studio

תוֹכֶן

OpenGL הוא כלי תכנות תלת מימד המאפשר ליצור תמונות תלת מימד מורכבות מצורות פשוטות. במאמר זה, תלמד כיצד לצייר בעזרתו קובייה פשוטה הניתנת לסיבוב בתלת מימד!

צעדים

חלק 1 מתוך 3: התקנה ראשונית

  1. 1 התקן את OpenGL. התחל בהדרכה כיצד להתקין את OpenGL במחשב שלך. אם כבר יש לך OpenGL ומהדר C, תוכל לדלג על שלב זה ולעבור לשלב הבא.
  2. 2 צור מסמך. צור קובץ חדש בעורך הקוד האהוב עליך ושמור אותו כ- mycube.c
  3. 3 הוסף #כולל. להלן ההנחיות הבסיסיות של "כלול" שתזדקק להן. חשוב לזכור כי ההנחיות למערכות הפעלה שונות שונות, ועל כן עליך לבחור הכל כך שהתוכנית תהיה אוניברסלית וניתן להריץ על כל מערכת.

      // כולל #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 הוסף אב טיפוס פונקציונלי וגלובלים. השלב הבא הוא הצהרת אב טיפוס פונקציונלי.

      // אבות טיפוס פונקציונליים הצגת חלל (); void specialKeys (); // משתנים גלובליים rotate_y כפול = 0; סיבוב_קס כפול = 0;

  5. 5 הגדר את הפונקציה הראשית ().

      int main (int argc, char * argv []) // אתחל GLUT ועיבד פרמטרים מותאמים אישית glutInit (& argc, argv); // בקש חלון עם תמיכה באגירה כפולה, Z-buffering וצבע אמיתי glutInitDisplayMode (GLUT_DOUBLE

חלק 2 מתוך 3: פונקציית התצוגה ()

  1. 1 להבין את מטרת הפונקציה display (). כל העבודה על עיבוד הקוביה תיפול על הקווים השבירים של פונקציה זו. הרעיון הכללי הוא זה: תציירו שישה פנים נפרדות של הקוביה ותמקמו אותן במיקומן.
    • עבור כל פנים, תגדיר ארבע פינות, ו- OpenGL יחבר אותן עם קווים וימלא אותן בצבע שבחרת. כיצד לעשות זאת יוסבר להלן.
  2. 2 הוסף פונקציה glClear (). קודם כל, כאשר עובדים עם פונקציה זו, אנו צריכים צבע ברור ומאגר z... בלי זה, הישן יהיה גלוי מתחת לתמונה החדשה, והאובייקטים שציירו התוכנית ימוקמו בצורה לא נכונה.

      תצוגת חלל () // נקה את המסך ו- Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • שימו לב לשתי השורות האחרונות. אלה הפונקציות glFlush (); ו glutSwapBuffers ();, נותן את האפקט של חוצץ כפול, שתואר לעיל.

חלק 3 מתוך 3: אינטראקטיביות התוכנית

  1. 1 הוסף את הפונקציה specialKeys (). באופן עקרוני, הכל כמעט מוכן, אך הקוביה רק ​​מצוירת ולא מסתובבת. כדי לעשות זאת, עליך ליצור הפונקציה specialKeys (), שיאפשר לך לסובב את הקוביה על ידי לחיצה על מקשי החצים!
    • עבור פונקציה זו הוכרזו המשתנים הגלובליים rotate_x ו- rotate_y. כאשר תלחץ על מקשי החצים שמאלה וימינה, ערך rotate_y יגדל או יפחת בחמש מעלות. הערך של rotate_x ישתנה באותו אופן, אך הפעם על ידי לחיצה על מקשי החצים למעלה ולמטה.
    • void specialKeys (int key, int x, int y) {// חץ ימינה - הגדל את הסיבוב ב -5 מעלות אם (key == GLUT_KEY_RIGHT) rotate_y + = 5; // חץ שמאלי - הפחת סיבוב ב -5 מעלות אחרות אם (key == GLUT_KEY_LEFT) rotate_y - = 5; אחרת אם (key == GLUT_KEY_UP) rotate_x + = 5; אחרת אם (key == GLUT_KEY_DOWN) rotate_x - = 5; // בקשת רענון מסך glutPostRedisplay (); }

  2. 2 הוסף glRotate (). הדבר האחרון שנעשה הוא להוסיף קו שיאפשר לנו לסובב את האובייקט. חזור לתפקוד תצוגה () ולפני תיאור הצד הקדמי הוסף:

      // אפס טרנספורמציות glLoadIdentity (); // סובב כאשר המשתמש משנה את הערכים rotate_x ו- rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // צד מרובה צבעים - קדמי ....

    • שים לב כי התחביר glRotatef ()הדומה לתחביר של glColor3f () ו- glVertex3f (), אך תמיד דורש ארבעה פרמטרים. הראשון הוא זווית הסיבוב במעלות. שלושת הבאים הם הצירים שלאורכם מתרחש הסיבוב, בסדר x, y, z. לעת עתה עלינו לסובב את הקובייה לאורך שני צירים, x ו- y.
    • כל השינויים שאנו מגדירים בתוכנית דורשים קווים דומים. בעיקרון, אנו מייצגים את הסיבוב של אובייקט לאורך ציר ה- x כשינוי בערך rotate_x, והסיבוב לאורך ציר y כשינוי בערך של rotate_y. עם זאת, OpenGL יחבר את הכל למטריצת טרנספורמציה אחת. בכל פעם שתתקשר לתצוגה, תיצור מטריצת טרנספורמציה ו- glLoadIdentity () יאפשר לך להתחיל עם מטריצה ​​חדשה בכל פעם.
    • פונקציות טרנספורמציה אחרות בהן השתמשת הן glTranslatef () ו- glScalef (). הם דומים ל- glRotatef (), אלא שהם דורשים רק שלושה פרמטרים: ערכי x, y ו- z כדי לשנות את גודל האובייקט ולהגדיל אותו.
    • כדי שהכל יוצג בצורה נכונה כאשר כל שלוש הטרנספורמציות מוחלות על אובייקט אחד, עליך להגדיר טרנספורמציות בסדר המתאים, כלומר glTranslate, glRotate, glScale - ואף פעם לא אחרת. OpenGL הופך את האובייקט על ידי קריאת התוכנית מלמטה למעלה. כדי להבין זאת טוב יותר, תארו לעצמכם כיצד קוביית 1x1x1 תראה אחרי כל השינויים אם OpenGL ייישם אותם בסדר המוצג (מלמעלה למטה), ואז חשבו כיצד OpenGL יעבד את הקובייה על ידי קריאת ההוראות מלמטה למעלה.
  3. 3 הוסף את הפקודות הבאות כדי לשנות את הקוביה פעמיים בכיוון x ו- y, כדי לסובב את הקוביה 180 מעלות בציר y ולהזיז את הקוביה 0.1 בציר x. וודא שכל הפקודות הרלוונטיות, כולל הפקודות glRotate () שניתנו בעבר, נמצאות בסדר הנכון. אם אתה חושש לטעות, עיין בגירסה הסופית של התוכנית בסוף המאמר.

      // עוד טרנספורמציות glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

  4. 4 הידור והפעלת הקוד. נניח שאתה משתמש ב- gcc כמהדר, אז הזן את הפקודות הבאות במסוף שלך:

      ב- Linux: gcc cube.c -o cube -lglut -lGL ./ mycube ב- Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube ב- Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 בדוק את הקוד הסופי. להלן הקוד הסופי שיצר מחבר המאמר, שאינו מתרגם את ההערות.

      // // קובץ: mycube.c // מחבר: מאט דיילי // נוצר: 25/4/2012 // פרוייקט: קוד מקור ליצירת קובייה ב- OpenGL // תיאור: יוצר חלון OpenGL ומצייר קובייה תלת -ממדית/ / שהמשתמש יכול לסובב באמצעות מקשי החצים // // פקדים: חץ שמאלה -סיבוב שמאלה // חץ ימינה -סיבוב ימינה // חץ למעלה -סיבוב כלפי מעלה // חץ למטה -סיבוב למטה // ------ -------------------------------------------------- -// כולל // ---------------------------------------------------- -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif // ----------------------------------------- ------------------ // אב טיפוס של פונקציות // -------------------------- -------------------------------- תצוגת חלל (); void specialKeys (); // ------------------------------------------------ ---------- // משתנים גלובליים // ---------------------------------- ------------------------ rotate_y כפול = 0; סיבוב_קס כפול = 0; // ------------------------------------------------ ---------- // תצוגה () פונקציית התקשרות חזרה // ------------------------------- --------------------------- תצוגת חלל () // נקה מסך ו- Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () פונקציית התקשרות חוזרת // ----------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// חץ ימינה-הגדל את הסיבוב ב -5 מעלות אם (key == GLUT_KEY_RIGHT) rotate_y + = 5; // חץ שמאלה - הפחת סיבוב ב- 5 מעלות אחרת אם (key == GLUT_KEY_LEFT) rotate_y - = 5; אחרת אם (key == GLUT_KEY_UP) rotate_x + = 5; אחרת אם (key == GLUT_KEY_DOWN) rotate_x - = 5; // בקש עדכון תצוגה glutPostRedisplay ();} // ------------------------------------ ---------------------- // פונקציה main () // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB