אודות טרנספורמציית קואורדינטות של מודלים תלת-ממדיים
חומר
קודם כל
לעתים קרובות אתה עשוי לראות תמונות תלת-ממדיות על מסכי טלוויזיה ותצוגות במשחקים, אך כיצד ניתן להציג אובייקטים הקיימים במרחב תלת-ממדי, כגון דמויות ובניינים הנעים על המסך, על מסך דו-ממדי?
במשחקים דו-ממדיים, יש רק אלמנטים דו-ממדיים של "X ו-Y" כערכי קואורדינטות, והתצוגה היא גם דו-ממדית, כך שאם אתה מצייר אובייקט על ידי ציון מיקום הקואורדינטות של X ו- Y, תבין אינטואיטיבית כיצד הוא יצויר באיזו עמדה.
עם זאת, בתלת מימד, זה לא כל כך קל. כפי שהשם מרמז, תלת מימד הוא "3 מימד" ויש לו שלושה מידע קואורדינטות: "X, Y ו- Z". מכיוון שהקואורדינטות שונות מהתצוגה הדו-ממדית, לא ניתן לצייר את האובייקט כפי שהוא.
לאחר מכן, מה לעשות הוא "להמיר מידע תלת מימדי למידע דו מימדי". זה נקרא בדרך כלל "טרנספורמציית קואורדינטות". זכור שטרנספורמציית קואורדינטות זו חיונית לתכנות תלת-ממדי.
ישנם מספר סוגים של טרנספורמציות קואורדינטות להמרת תלת-ממד לדו-ממד, אך ישנם שלושה סוגים עיקריים של טרנספורמציות קואורדינטות שמתכנתים מטפלים בהם: "טרנספורמציית עולם", "טרנספורמציית תצוגה" ו"טרנספורמציית הקרנה". כאן, נסביר את כל מה שקשור לשינוי קואורדינטות.
מערכות קואורדינטות שמאליות וימניות
בתלת-ממד קיימות שתי מערכות קואורדינטות, "מערכת הקואורדינטות השמאלית" ו"מערכת הקואורדינטות הימנית", שיש להן כיוונים שונים לכל קואורדינטה כפי שמוצג באיור שלהלן.
Direct3D השתמש בעיקר במערכת קואורדינטות שמאלית, אך יש גם פונקציות לחישוב עבור מערכות קואורדינטות ימניות. עם זאת, XNA מספק רק שיטות חישוב עבור מערכות קואורדינטות ימניות. נראה שזה עולה בקנה אחד עם העובדה שיישומים אחרים משתמשים לעתים קרובות במערכות קואורדינטות ימניות.
כל עצות XNA באתר זה משתמשות במערכת הקואורדינטות הימנית.
מערכת קואורדינטות מקומית (מערכת קואורדינטות מודל)
לכל מודל יש מערכת קואורדינטות שבמרכזה המקור. בעת יצירת מודל עם תוכנת דוגמנות, אני חושב שקל יותר להבין אם אתה מדמיין ליצור אותו עם המקור כמרכז.
מערכת קואורדינטות עולמית
מערכת הקואורדינטות העולמית מאפשרת לך למקם את המודל בכל מקום. אם לא תעשה דבר בטרנספורמציה של העולם הזה, המודל ימוקם במקור באותו אופן כמו הקואורדינטות המקומיות. המיקום הוא לא רק לנוע מהמקור, אלא גם לסובב ולשנות קנה מידה.
הצג מערכת קואורדינטות
ברגע שהצבת את המודל בקואורדינטות העולם, אתה צריך מידע על איפה אתה מסתכל ואיפה אתה מסתכל על המרחב התלת-ממדי. זה מה שאנו מכנים "טרנספורמציות תצוגה". המרות תצוגה מיוצגות בדרך כלל כמצלמות.
הפרמטרים הנדרשים להמרה זו הם "מיקום מצלמה", "נקודת עניין של מצלמה" ו"כיוון מצלמה כלפי מעלה". כיוון המצלמה נקבע על ידי שלושת הפרמטרים הללו. האיור שלהלן מציג את המצלמה מנקודת מבט של צד שלישי.
האיור למטה נראה למעשה מנקודת מבטה של המצלמה עם הסידור המוצג באיור לעיל (בשלב זה, עדיין לא המרנו את הקואורדינטות למסך, כך שזו רק תמונה).
בהסבר הקודם נראה שהמצלמה ממוקמת והקואורדינטות משתנות, אך בחישוב בפועל קואורדינטות העולם מומרות בהתאם למיקום וכיוון המצלמה. לכן, המקור הוא מיקום המצלמה כפי שמוצג באיור למטה.
מערכת קואורדינטות פרויקטיבית
לאחר שהחלטתם מאיזו עמדה להציג את החלל התלת-ממדי, השלב הבא הוא לעבד את התצוגה של "עצמים קטנים רחוקים" ו"דברים גדולים שנמצאים בקרבת מקום". זה נקרא טרנספורמציה פרויקטיבית. ישנן שתי שיטות לטרנספורמציה של הקרנה, "הקרנת פרספקטיבה" ו"היטל אורתוגרפי", אך התמונה הנפוצה של "הקרנת פרספקטיבה" היא כדלקמן.
הקרנת פרספקטיבה משתמשת בפרמטרים הבאים: זווית צפייה, יחס גובה-רוחב, מיקום קליפ קדימה ומיקום קליפ אחורי. האזור שכותרתו "תסכול" באיור לעיל יופיע סוף סוף על המסך.
"זווית צפייה" מציינת את טווח הצפייה הנראה מהמצלמה. הקטנת הזווית מתקרבת, הגדלתה מקטינה את התצוגה. זווית הצפייה תהיה הערך האנכי של התסכול.
יחס גובה-רוחב משמש לקביעת זווית הראייה האופקית, ואילו זווית הצפייה היא זווית אנכית. הזווית האופקית נקבעת בדרך כלל על ידי "זווית צפייה × יחס גובה-רוחב", ויחס הגובה-רוחב הוא בעצם הערך של "רוחב ÷ גובה" של המסך שאתה מנסה להציג. אם תשנה ערך זה, האובייקט התלת-ממדי המוצג ייראה כאילו הוא נמתח אופקית או אנכית.
מיקום הקליפ קדימה ומיקום הקליפ האחורי מצוינים כדי לקבוע אם האובייקט יוצג בטווח הקדמי או האחורי. בשל אופיו של המחשב, לא ניתן להציג עד אינסוף, ולכן נציב גבול. ערך זה משפיע גם על הדיוק של מאגר Z, ולכן לא מומלץ לכלול אותו באזור הציור מעבר לטווח שאין צורך להציגו.
האובייקט שעבר שינוי צורה בפרספקטיבה מומר למרחב כמו זה שמתחתיו. עצמים שהיו קרובים למצלמה מוגדלים, ועצמים שהיו רחוקים מוקטנים.
הדבר מומחש בתרשים קל להבנה להלן.
אם אתה באמת מסתכל על זה מנקודת המבט של המצלמה, זה נראה כמו למטה.
שיטה נוספת לטרנספורמציה פרויקטיבית היא היטל אורתוגרפי, המקרין אזור גלוי כמו זה שמתחתיו. מכיוון שהרוחב והגובה קבועים ללא קשר לעומק, גודל האובייקט אינו משתנה עם העומק.
מערכת קואורדינטות מסך
לאחר שינוי ההקרנה, הוא מומר לקואורדינטות של המסך בפועל. למרות שמדובר במסך, המיקום והטווח של התצוגה משתנים בהתאם להגדרות האשנב שהוגדרו בהתקן. עם זאת, במקרה של משחקים, קואורדינטות הלקוח של החלון הם לעתים קרובות אשנב כפי שהוא, אז אני לא חושב שאתה צריך לדאוג יותר מדי.
הקואורדינטות של המסך (0, 0) מומרות מקואורדינטות ההקרנה (-1, 1, z). באופן דומה, קואורדינטות המסך (רוחב, גובה) מומרות מקואורדינטות ההקרנה (1, -1,z).