OpenGL Transformations

OpenGL Transformations
1
-‫ טרנספורמציות ב‬:‫גרפיקה ממוחשבת‬
OpenGL
‫התייחסות למטריצת טרנספורמציה‬
‫• )‪ – glMatrixMode(GLenum mode‬קובע את מטריצת‬
‫ההתייחסות הנוכחית‬
‫• אפשרויות לפרמטר ‪:mode‬‬
‫• ‪ – GL_MODELVIEW‬מטריצה הפועלת על כל האובייקטים בעולם‬
‫או על הצפייה בעולם (הפעלת טרנספורמציה על אובייקטים היא פעולה‬
‫שקולה להפעלתה על מערכת הצפייה)‬
‫• ‪ – GL_PROJECTION‬מטריצת הטלה (אורתוגרפית‪ ,‬פרספקטיבה)‬
‫• ‪ – GL_TEXTURE‬מטריצת העתקת טקסטורה‬
‫גרפיקה ממוחשבת‪ :‬טרנספורמציות ב‪-‬‬
‫‪OpenGL‬‬
‫‪2‬‬
‫הגדרת טרנספורמציות בסיסיות‬
‫אתחול במטריצת היחידה‬
‫) (‪• glLoadIdentity‬‬
‫) ‪• glMultMatrix ( elements16‬‬
‫מערך בגודל ‪ 16‬המייצג מטריצה ‪4X4‬‬
‫לפי הסדר של עמודה אחד עמודה‬
‫וקטור הכיוון של ציר הסיבוב‬
‫(ציר הסיבוב עובר תמיד דרך הראשית)‬
‫) ‪• glTranslate ( x,y,z‬‬
‫) ‪• glRotate ( angle, x,y,z‬‬
‫) ‪• glScale ( x,y,z‬‬
‫גרפיקה ממוחשבת‪ :‬טרנספורמציות ב‪-‬‬
‫‪OpenGL‬‬
‫‪3‬‬
‫ דוגמא‬- ‫סדר הפעלת הטרנספורמציות‬
glMatrixMode( GL_MODELVIEW )
glLoadIdentity( )
glMultMatrix( M1 )
glMultMatrix( M2 )
glTranslate( 1.0, 2.0, 0.0 )
glRotate( 30, 0.0, 0.0, 1.0 )
glScale( 2.0, 1.0, 1.0 )
glBegin(…)
:
‫הגדרת אובייקט‬
glEnd( )
:‫סדר הפעולות‬
I  ( M1  ( M 2  (Translate  ( Rotate  ( Scale(object ))))) 
( I  M1  M 2  Translate  Rotate  Scale )(object )
4
-‫ טרנספורמציות ב‬:‫גרפיקה ממוחשבת‬
OpenGL
‫מחסנית המטריצה‬
‫• לכל מטריצה (‪ )texture, projection, modelview‬קיימת‬
‫מחסנית של מטריצות‬
‫• המחסנית מאותחלת במטריצת הזהות‬
‫• ניתן בכל שלב להוסיף לראש המחסנית את המטריצה הנוכחית‬
‫• ניתן בכל שלב להוציא את המטריצה הנמצאת בראש המחסנית‬
‫ולהציב אותה במטריצה הנוכחית‬
‫• המחסנית מאפשרת לשמור טרנספורמציות משלבי ביניים שונים‬
‫גרפיקה ממוחשבת‪ :‬טרנספורמציות ב‪-‬‬
‫‪OpenGL‬‬
‫‪5‬‬
‫מחסנית המטריצה‬
‫) (‪glPushMatrix‬‬
‫) (‪glPopMatrix‬‬
‫) (‪ – glGet‬הוצאת מידע על משתנים בתוכנית (כולל את ערכי מחסנית המטריצה)‬
‫גרפיקה ממוחשבת‪ :‬טרנספורמציות ב‪-‬‬
‫‪OpenGL‬‬
‫‪6‬‬
‫בניית מודל היררכי‬
‫נניח שנרצה לצייר גשר לפי האיור‪ ,‬ואח"כ לשנות מימדים‪ ,‬להזיז‪ ,‬ולסובב‬
‫גרפיקה ממוחשבת‪ :‬טרנספורמציות ב‪-‬‬
‫‪OpenGL‬‬
‫‪7‬‬
‫בניית מודל היררכי‬
‫גישה ראשונה‪ :‬נחשב את הקואורדינאטות של כל קודקוד ונצייר‪ .‬ראה תוכנית‬
‫‪ .bridge1‬כדי לצייר אחרי סיבוב והזזה‪ ,‬או אחרי שינוי רוחב משולשי הבסיס‪,‬‬
‫יש לחשב את ערכן החדש של הקואורדינאטות – מסובך!‬
‫גישה שנייה‪ :‬נחשב את המיקום היחסי של כל חלק תוך שימוש‬
‫בטרנספורמציות ואיפוס טרנספורמציות בעזרת ‘)(‪ .’glLoadIdentity‬נוסיף‬
‫פונקציות לציור אובייקטים בסיסיים כדי לא לשכתב קוד‪ .‬ראה תוכנית‬
‫‪ .bridge2‬מה יקרה שנרצה לסובב ולהזיז את כל הגשר?‬
‫גישה שלישית‪ :‬נחשב את המיקום היחסי של כל חלק תוך שימוש‬
‫בטרנספורמציות ובמחסנית‪ .‬ראה תוכנית ‪ .bridge3‬יותר יעיל לעבוד עם‬
‫המחסנית מאשר אתחול בעזרת ‘)(‪ .’glLoadIdentity‬מה יקרה שנרצה להזיז‬
‫ולסובב את כל הגשר?‬
‫גרפיקה ממוחשבת‪ :‬טרנספורמציות ב‪-‬‬
‫‪OpenGL‬‬
‫‪8‬‬