Download presentation
Presentation is loading. Please wait.
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
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.