מצלמה ו- up vector

Metheny

New member
מצלמה ו- up vector

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

Voxel

New member
תשובה

נהוג להתייחס לכמה וקטורים כשמדברים על מערכות צירים מקומיות. Up, Right, Forward Vectors. הם בסה"כ כינויים אינטואיטיביים לכיוונים מקומיים מנקודת המבט של העולם. על כל אובייקט בעולם תלת מימדי ניתן להסתכל מנקודת המבט של העולם שבו הוא נמצא (קואורדינטות עולם), או מנקודת המבט המקומית שלו - נקודת הפיבוט שלו. אז כדי לסובב אובייקט, ניתן לסובב אותו מנקודת המבט עליו בעולם, או סביב נקודת הפיבוט שלו. בכל מקרה, הוקטורים של ה up, right, forward הם הוקטורים שמתארים את הכיוונים האלה, בקואורדינטות של העולם. דוגמא: כאשר קובייה נמצאת ב 0,0,0 ללא שום סיבוב, וקטורי ה URF מיושרים לגמרי עם צירי העולם, XYZ. כאשר נסובב את הקוביה 90 מעלות סביב ציר Z, אז וקטור up יהיה בכיוון השלילי של ציר X, מבחינת הקובייה, הפיבוט שלה נשאר קבוע. מקווה שזה ברור.
 

Metheny

New member
לא לגמרי הבנתי

אותנו לימדו שיש שני סוגי קואורדינטות: 1) קואורדינטות עולם (כמו שאתה אמרת) 2) קואורדינטות של המביט (viewer / מצלמה). בנוסף לקואורדינטות של המצלמה, יש לה גם Vector up. לא שמעתי על קואורדינטות של אובייקט. בכל מקרה השאלה שלי הייתה לגבי סיבוב המצלמה, לא סיבוב האובייקט. האם כאשר מסובבים את המצלמה , גם מערכת הצירים שלה מסתובבת? אם כן, אז מה המשמעות של ה- vector up ? אפשר כבר להסיק ממערכת הצירים באיזה צורה אנחנו מסתכלים על העולם.
 

Voxel

New member
תשובה

לכל אובייקט יש מערכת צירים, המצלמה לא שונה בזה מכל דבר אחר. במערכת הצירים המקומית של כדור הארץ, הוא מסתובב סביב עצמו, ובמערכת הצירים הגלובלית, הוא מסתובב סביב השמש. אדם על כדור הארץ תמיד יראה את ה up vector שלו בצורה זהה, למטה הקרקע ולמעלה השמיים. אולם, למתבונן בו מחוץ למערכת הצירים המקומית (אסטרונאוט), up vector של אותו אדם משתנה כל הזמן בגלל הסיבוב שלו סביב השמש. אז הכלל הוא פשוט: up, right, forward vectors נועדו לתאר את המנח של אובייקט עבור מתבונן מחוץ למערכת הצירים המקומית. כאשר אתה מסובב מצלמה, ה up vector שלה משתנה כל הזמן. מערכת הצירים המקומית שלה, לא משתנה בדיוק כמו אותו אדם על כדור הארץ.
 

Metheny

New member
עדיין לא ברור... מצטער

אתה אומר שלמצלמה יש מערכת צירים : up, right, forward vectors. אז אתה אומר שכאשר מסובבים את מצלמה, ה- up vector שלה משתנה, אבל מערכת הצירים שלה ( שכוללת את ה- up vector) לא משתנה.
 

Metheny

New member
עוד משהו..

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

Voxel

New member
תכנות

אם אתה מדבר על תכנות, אז נרד יותר לפרטים. ניתן לייצג מיקום וסיבוב של אובייקט על ידי מטריצת אוריינטציה, שכוללת סיבוב והזזה וע"י הכפלה של נקודה XYZ במטריצה, מעבירים את הקואורדינטה הלוקלית לעולם ModelViewMatrix. לכל אובייקט יש מערכת צירים לוקלית, לדוגמא, כשממדלים כדור, אתה ממדל אותו כך שמרכז הכדור הוא נקודת 0,0,0 ולאחר מכן, כדי להזיז את הכדור שמיוצג בקואורדינטות לוקליות 10 יחידות הצידה, אתה לא תזיז אותו בצורה לוקלית אלא תכפיל את הקואורדינטות שלו במטריצה שמכילה את ההזזה וכך תקבל קואורדינטות חדשות של הכדור בעולם. מצלמה בעולם תלת מימדי שקולה לכל אובייקט אחר. אותו כדור תמיד ידע לאן הוא מסתכל ומה צד ימין שלו ומה למעלה. אם תשאל את הכדור, תמיד ימינה זה לכיוון החיובי של ציר X (בדוגמא הזו) ו למעלה יהיה ציר Y, אבל המשמעות של up, right, forward הם לא לוקליים, הם אחרי ההכפלה ב ModelViewMatrix ואז תקבל את הכיוונים שלהם בעולם. תנסה להעמיק במשמעות של ה modelViewMatrix ולהבין מה המשמעות של קואורדינטות לוקליות ואבסולוטיות.
 

Metheny

New member
אוקיי

כלומר אם מסובבים אובייקט, אז מערכת הצירים של האובייקט (נגיד המצלמה) משתנה אם מסתכלים עליהם בתור וקטורים במערכת הצירים של העולם. אוקיי, אז אם הבנתי את זה, אז נחזור לשאלה אליה חתרתי לפני כן. בהינתן המיקום של המצלמה (P), הנקודה שאני רוצה להסתכל עליה (L) והוקטור שאני רוצה שהמצלמה "תראה" כלפי מעלה (V , up-vector), כדי לחשב את מערכת הצירים של המצלמה (X,Y,Z), בהתחלה אני מחשב את Z:
Z = (P - L) / |P-L|​
אח"כ אני מחשב את X:
X = (Z x V) / |Z x V|​
ובסוף מחשבים את Y:
Y = (Z x X) / |Z x X|​
אני מבין שמשתמשים ב-V כדי ליצור את מערכת הצירים של המצלמה. אבל מה המשמעות של ה- V) up-vector) שהוא לא אנכי ל-Z (כלומר, לכיוון ההסתכלות)? כלומר אם אני מסתכל לכיוון מסויים, הוקטור שאני רואה כלפי מעלה תמיד אנכי לכיוון שאני מסתכל אליו). כלומר, למה שה- V לא יתלכד תמיד עם ה-Y ?
 

Voxel

New member
עוד תשובה

כמו שאמרת, הווקטור שאתה רואה כלפי מעלה תמיד אנכי לכיוון שאתה מסתכל אליו. אם אתה מסתכל תמיד במישור מקביל למישור XZ אז וקטור UP תמיד יהיה מקביל לציר Y, אבל כאשר אתה מסתכל בזווית אחרת, נניח 45 מעלות מעל האופק, אז וקטור ה UP יהיה אחר כי הוא נמדד בקואורדינטות עולם ולא מקומיות.
 

Metheny

New member
לא הבנת...

קודם כל, תודה רבה על ההשקעה! שים לב לחישוב שכתבתי בהודעה הקודמת שלי: X,Y,Z אצלי הם הקואורדינטות של האובייקט/מצלמה, לא של העולם. מה שנתון לי הוא vector-up, V , ושתי נקודות: של המצלמה ושל האובייקט. הוקטור בין המצלמה והאובייקט הוא בעצם ציר ה-Z של המצלמה. והשאלה הייתה אם ה- vector-up בעולם ,תמיד מתלכד עם ציר ה-Y של המצלמה. לכאורה, ה-vector-up לא חייב להיות מאונך לציר ה-Z של המצלמה (ולכן לא חייב להתלכד עם ציר ה-Y של המצלמה). וזה מה שמוזר לי. בתמונה אפשר לראות ש-Z וה-vector up לא מאונכים, אבל הם יוצרים משטח שממנו ניתן לחשב את שתי הקואורדינטות האחרות של המצלמה (X ו-Y). בתמונה שאתה נתת, הקואורדינטה Y וה-vector up הם בעצם אחד.
 

Voxel

New member
נכון.

נכון. הבנת נכון. לפי התמונה שנתתי, וקטור UP הוא בקואורדינטות עולם, ובקואורדינטות לוקליות הוא ציר Y של האובייקט. תמיד הוקטורים up, forward, right הם מאונכים זה לזה. אם תקח את וקטור Y של המצלמה (010) ותכפיל אותו במטריצת האוריינטציה של המצלמה, תקבל את וקטור UP בקואורדינטות עולם.
 

CoolCalb

New member
תגובה לא קשורה..

זה בכוונה, או יצא במקרה שאתה הגרסה הדיסלקטית, מסכלת האותיות של TheMeny??? אני כל הזמן קורא את הניק שלך, וחושב שאתה מני...
 

Metheny

New member
אוקיי, הבנתי

תודה רבה רבה על הסבלנות!!!
 
למעלה