OpenGL Transformations
Transcription
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