שאלה בתלת מימד....

אלעד 4

New member
שאלה בתלת מימד....

שלום. אני בונה קוביה עם שש פיאות בתלת מימד (אני עושה את זה בתכנות , לא בתוכנה) הצלחתי לסובב את הקוביה, אבל הבעיה שלי מתי לצייר כל פיאה (כלומר איזו פיאה תצוייר ראשונה ואיזו אחרונה) ניסיתי לחשב לכל פיאה את מיקום ה Z שלה,וכך לצייר את הפיאה עם ה Z הכי קטן ראשונה , והפיאה עם ה z הכי גדול אחרונה - אבל זה עדיין לא עובד לי בחלק מהמקרים (בזוויות מסויימות). מישהו יכול לעזור לי בבקשה ? איך אני אמור לחשב ? תודה.
 

אלדד28

New member
בקוביה...

יש בין 1 לבין 3 פאות שצריך להציג, בכל זמן נתון (אין יותר - אתה לא יכול להציג 4 פאות, למשל). מה שצריך לעשות זה לבדוק האם הנורמל של המשטח (של הפאה) פונה לכיוון הצופה. ציר ה-Z לא יספיק. נורמל של משטח הוא תוצאת ה-cross product של שני וקטורים בפאה - אתה יכול פשוט לקחת שתי צלעות, להתייחס אליהן כאל וקטורים, ולחשב את ה-cp שלהן. כל מה שנשאר הוא לבדוק לאן פונה הוקטור הנ"ל מנקודת החיבור של שתי הצלעות - כלפי נקודת התצפית או ממנה והלאה. ככה תדע מה צריך להציג ומה לא. בנוסף אתה יכול לחפש ברשת אחרי hidden faces removal.
 

giladznaor

New member
ולגבי יותר מקוביה

בקוביה, כפי שכבר נאמר, הפיתרון הטוב ביותר יחסית פשוט. במקרים יותר מורבכים, אחת השיטות הפשוטות ביותר ליישום, שגם מאוד "חזקה", היא שיטה שנקראת Z-Buffering. אחד הדברים הטובים בשיטה הזאת היא שהיא יכולה לטפל גם במקרים שבהם מספר עצמים "מתנגשים", ואז חלקי פוליגונים עוברים דרך פוליגונים אחרים, וכל זאת בלי צורך לפצל את הפוליגונים לחלקי משנה. החסרונות של השיטה הן שהיא דורשת יחסית הרבה זיכרון, לא תמיד הכי יעילה ודורשת שינוי של פונקציות הציור הדו-מימדיות. כאמור, השיטה מאוד פשוטה. הרעיון של השיטה הוא בגדול "לרמות", ולא לחשוב בתלת מימד, אלא בדו-מימד. הרעיון הוא שמגדירים מערך נוסף בגודל של תמונת היעד (המסך, לדוגמא). עקרונית, לפני כל פריים ממלאים את המערך בערך מקסימלי. המערך מכיל בעצם את הפיקסלים הכי קרובים שכבר "צויירו", ולכן הוא מאותחל בערך שמקביל לאינסוף. עושים את הכל כרגיל, וכאשר מציירים את הפוליגון הדו-מימדי צריכים גם לזכור את ערכי הZ שלו. ממשיכים לצייר את הפוליגון כרגיל, רק שעבור כל פיקסל מחשבים את ערך הZ שלו (כמו שמחשבים את ערכי הX והY שלו - באינטרפולציה לינארית [ולכן עדיף אחד חלקי Z]). בודקים אם ערך הZ, במיקום X, Y של הפיקסל במערך שלנו, קטן או גדול מערך הZ של בפיקסל. אם הפיקסל שלנו קרוב יותר, אז מציירים אותו ורושמים את הערך במערך כערך הZ הנוכחי. אם לא, אז פשוט לא מציירים את הפיקסל. אני יודע שזה נשמע מסובך, אבל זה רק בגלל שאני לא יודע להסביר טוב.
 

אלדד28

New member
../images/Emo45.gif

מומלץ לחפש חומר על Hidden surfaces removal - מדברים שם גם על זה בין השאר.
 
יכול להיות שתצטרך להציג

יותר מ-3 פאות.... כשיש מראה
 

אלדד28

New member
קודם אמרתי קובייה,

אח"כ אמרתי מראה, יאללה יאללה, יו יו יו - עכשיו לוקחת מראה שלך, הולכת בג'מבו, הולכת בסופרנטו, לא בא בלובה בחיים שלך!
 
בפרט לקוביה:

מכיוון שכל הצלעות באותו גודל, ובזוויות ישרות אחת מהשניה, אפשר עד כמה שאני זוכר פשוט להציג את הפאות שה-Z הממוצע שלהן (ממוצע על 4 הפינות) הוא הגבוה ביותר (3 פאות כאלה כאמור). בנוסף, אפשר לייעל את החישוב מכיוון שחלק מהסכום עבור הממוצע משותף לפאה אחת או יותר.
 
למעלה