Presentation is loading. Please wait.

Presentation is loading. Please wait.

2DViewing נכתב ע"י משה חדד 11/21/2018.

Similar presentations


Presentation on theme: "2DViewing נכתב ע"י משה חדד 11/21/2018."— Presentation transcript:

1 2DViewing נכתב ע"י משה חדד 11/21/2018

2 Previously ,on CG… ווקטורים מטריצות טרנספורמציות שאלות לדוגמה
11/21/2018

3 היום תזכורת Viewing Clipping מטריצות דו מימד Wc-vc Vc-ndc Ndc-dc
Cohen Sutherland 11/21/2018

4 תזכורת מטריצות דו מימד קורדינטות הומוגניות הזזה -translation
11/21/2018

5 תזכורת מטריצות דו מימד קורדינטות הומוגניות הגדלה\הקטנה -scaling
11/21/2018

6 תזכורת מטריצות דו מימד קורדינטות הומוגניות סיבוב -rotate 11/21/2018

7 תזכורת מטריצות דו מימד קורדינטות הומוגניות סיבוב -rotate y (vx,vy)
(ux,uy) (vx,vy) X 11/21/2018

8 Viewing Pipeline Clipping World-Coordinates WC Viewing transformation
VC Normalized Device transformation NDC Device transformation DC 11/21/2018

9 Viewing הרעיון התכנון הביצוע העולם מנקודת המבט של המצלמה
מעבר מקורדינטות עולם לקורדינטות מסך הביצוע שימוש במטריצות למעבר ממערכת צירים אחת (העולם) למערכת צירים שנייה (המצלמה) 11/21/2018

10 Viewing לנקודת המבט של המצלמה בדו מימד יש 5 דרגות חופש הגדלה\הקטנה
הזזה X ו Y סיבוב סביב ציר Z (כביכול פונה אלינו) 11/21/2018

11 Viewing המצלמה נמצאת במערכת צירים משלה
נמצא את מערכת הצירים (u , v) ונבנה מטריצת סיבוב נמצא את ראשית הצירים ונבנה מטריצת הזזה y world x view y view (x0,y0) (vx,vy). (ux,uy). x world 11/21/2018

12 Viewing מציאת מערכת הצירים WC-VC נגדיר את הפרמטרים הבאים:
נקודת המוצא היא P0=(x0,y0) וקטור למעלה יהיה v=(vx,vy) U יהיה u=v x (0,0,1) (מכפלה ווקטורית עם ציר Z) (vx,vy). y view (x0,y0) x view (ux,uy). 11/21/2018

13 Viewing מציאת מערכת הצירים WC-VC מטריצת המעבר תהיה : (vx,vy). y view
y world x view y view (x0,y0) (vx,vy). (ux,uy). x world 11/21/2018

14 Viewing מציאת מערכת הצירים NDC-VC
במערכת ה-Viewing נזיז את חלון ה-clipping למרכז ננרמל את החלון (xmax,ymax) (xmin,ymin) Window is Viewing coordinates Window translated to origin Window scaled to Normalized Viewport size 11/21/2018

15 Viewing מציאת מערכת הצירים NDC-VC
איך ננרמל? נבצע scaling לחלון בגודל שלו עבור X xmax-xmin עבור Y ymax-ymin 11/21/2018

16 Window scaled to Normalized Viewport size
Viewing מציאת מערכת הצירים NDC-DC הרעיון...התאמה להתקנים שונים (רזולוציות שונות ) נזיז את החלון לנקודה הרצויה ע"י הזזה נכוון את הגודל הרצוי ע"י מתיחה (umaxn,vmaxn) (umin,vmin) Window scaled to Normalized Viewport size Window scaled and translated to Viewport location in device coordinates 11/21/2018

17 Viewing מציאת מערכת הצירים NDC-DC איך נמתח לגודל הרצוי?
נבצע scaling לגודל החלון החדש עבור X umax-umin עבור Y ymax-ymin 11/21/2018

18 clipping Clipping יוצר לנו חלון במסך גבולות החלון
(xmin,ymin) צד שמאלי תחתון (xmax,ymax) ימני עליון כל קו שיוצא מגבולות החלון נחתך Xmin<x<Xmax & Ymin<y<Ymax המטרות יעילות-אין צורך לצייר קווים שלא נראה 11/21/2018

19 clipping Cohen sutherland הרעיון הכללי
עוברים על כל קודקודי הפוליגון בזוגות (פאות) ומתקנים בהתאם אם הפאה מחוץ לחלון לא צריך לצייר אותה (מוציאים אותה מהפוליגון) פאה בחוץ היא פאה ששני הקודקודים שלה בחוץ אם הפאה כולה בפנים לא עושים כלום פאה בפנים היא פאה ששני הקודקודים שלה בפנים אם הפאה הנוכחית נחתכת עם החלון משכתבים אותה פאה שנחתכת היא פאה שאחד הקודקודים שלה בחוץ ואחד בפנים הנקודה שנמצאת מחוץ לחלון מקבלת קורדינטות חדשות תקינות 11/21/2018

20 clipping Cohen sutherland איך יודעים אם פאה בחוץ או בפנים?
מושכים את הקווים של חלון החיתוך נוצרים לנו 9 איזורים ניצור קוד בן 4 ביטים ,כל ביט עבור כל צד של החלון 0101 0001 0110 0100 1001 0010 1010 0000 1000 11/21/2018

21 clipping ביט ראשון מימין עבור ימינה ביט שני מימין עבור שמאלה
ביט שלישי מימין עבור למעלה ביט רביעי מימין עבור למטה כל נקודה שנופלת באחד האזורים מקבלת את הקוד המתאים 11/21/2018

22 clipping למטה למעלה שמאלה ימינה 11/21/2018

23 clipping 0101 0001 0110 0100 1001 0010 1010 0000 1000 P1 p3 p4 P2 11/21/2018

24 clipping האלגוריתם: עוברים על כל קודקודי הפוליגון ובודקים את הקוד בין זוגות הקודקודים פעולות בוליאניות על הקוד נותנות מידע על הקו p1,p2 אם code(p1) & code(p2) !=0 אז הקו נמצא כולו בחוץ שתי נקודות באותו צד יוצרות קו שנמצא מחוץ לחלון לשתי נקודות באותו צד יהיה אותו ביט 1 במקום המתאים ומכיוון ש1 & 1=1 זיהינו שהקו נמצא בחוץ ע"י פעולת & אם code(p1) | code(p2) ==0 אז הקו כולו בפנים שתי נקודות בתוך החלון יוצרות קו שנמצא בפנים קו שנמצא בפנים אין לו אף ביט ששווה ל 1 נזהה קו כזה ע"י פעולת or 11/21/2018

25 clipping האלגוריתם: אם לא מתקיימים שני המקרים הנ"ל ,הקו נחתך ע"י החלון
עוברים על כל הפאות ובודקים חיתוך עם הקו כל פעם שהקו נחתך עם פאה,יוצרים קו חדש עד נקודת החיתוך ממשיכים הלאה על כל הפאות עם הקו החדש 11/21/2018

26 clipping 11/21/2018

27 clipping 11/21/2018

28 clipping 11/21/2018

29 clipping 11/21/2018

30 clipping 11/21/2018

31 clipping 11/21/2018

32 clipping 11/21/2018

33 clipping 11/21/2018

34 clipping 11/21/2018

35 clipping 11/21/2018

36 clipping 11/21/2018

37 clipping 11/21/2018

38 clipping 11/21/2018

39 clipping 11/21/2018

40 clipping 11/21/2018

41 clipping 11/21/2018

42 clipping האלגוריתם: מציאת האזורים: 0101= 0001= 0100= 5 1001= 1 1000=
0110= 0010= 1010= 0000= 5 קו חלון ימני 1 קו חלון עליון 4 9 קו חלון תחתון 8 6 קו חלון שמאלי 2 10 11/21/2018

43 clipping האלגוריתם: ניצור פונקציה שתיצור את הקוד
הפונקציה מקבלת נקודה ומחזירה קוד גבולות החלון ידועים xmin,ymin xmax,ymax Int whatCode(vertex v) { Int code=0; if (v.y>ymax)//למעלה code | =4; else if(v.y<ymin)//ללמטה code | =8; If (v.x>xmax)//ימינה code | =2; else if (v.x<xmin)//למעלה code | =1; Return code; } 0101 0001 0110 0100 1001 0010 1010 0000 1000 Xmax , Ymax Xmin , Ymin 11/21/2018

44 clipping האלגוריתם: בדיקת האיזורים מאוד פשוטה נניח מקבלים פאה E
הפאה כולה מתקבלת אם whatCode(E.start) | whatCode(E.end) == 0 הפאה כולה נדחית אם whatCode(E.start) & whatCode(E.end) !=0 אם לא, מוצאים חיתוך עם החלון... 11/21/2018

45 clipping האלגוריתם: איך נמצא נקודת חיתוך? תזכורת: משוואה פרמטרית:
P=p0+(p1-p0)*t t=[0,1] כדי למצוא t של נקודה על הקו נחשב T=(pt-p0)/(p1-p0) p0 p1 11/21/2018

46 clipping האלגוריתם: נמצא את נקודות החיתוך של הפאה עם החלון.
אחד הערכים בנקודה יקבל את הערך של החלון. הערך השני יחושב ע"י משוואת קו הפרמטרית. בהינתן פאה e נמצא עם איזה קו חלון היא נחתכת ע"י פעולת & נחשב את נקודת החיתוך בהתאם 11/21/2018

47 clipping האלגוריתם: נתחיל עם vertex שנמצא בחוץ ,נניח e.start
נמצא עם איזה פאה הוא נחתך If(whatCode(e.start) & 4!=0)//למעלה { t=(ymax-e.start.y)/(e.end.y-e.start.y) x=e.start.x+(e.end.x-e.start.x)*t y=ymax // } else if(whatCode(e.start) & 8!=0)//למטה t=(ymin-e.start.y)/(e.end.y-e.start.y) y=ymin 11/21/2018

48 clipping האלגוריתם: המשך If(whatCode(e.start) & 1!=0)//ימינה {
t=(xmax-e.start.x)/(e.end.x-e.start.x) y=e.start.y+(e.end.y-e.start.y)*t x=xmax } else if(whatCode(e.start) & 2!=0)//שמאלה t=(xmin-e.start.x)/(e.end.x-e.start.x) x=xmin 11/21/2018

49 שאלות? 11/21/2018


Download ppt "2DViewing נכתב ע"י משה חדד 11/21/2018."

Similar presentations


Ads by Google