OPENGL ומטריצות

tseliot

New member
OPENGL ומטריצות

פורום בניית משחקי מחשב עדיין סגור, סורי :) אני מנסה לתכנת סימולטור טיסה... היו לי קשים רבים עם תיאור וקטור המהירות של המטוס, ניסיתי להשתמש בתיאור שלו עם גודל וYAW PITCH ROLL, מה שהסתבר כרעיון גרוע. לכן עברתי לתיאור של מערכת הקואורדינטות המקומית של המטוס בעזרת מטריצה. עד לכאן הכל עובד נפלא, אפילו ציירתי את מערכת הצירים ואני רואה שהיא מגיבה בדיוק כמו שאני רוצה. עכשיו הייתי רוצה להשתמש במטריצה הנ"ל בתור מטריצת הMODELVIEW בOPENGL כדי שהמטוס יצויר כמו שצריך, אבל כשאני מנסה לעשות את זה המטוס מצויר בזויות לא קשורות. אה, ולא שכחתי להוסיף את W, ולא שכחתי שבOPENGL הוא מצפה לעבוד בטורים ולא שורות. קצת קוד:
/*Drawing the plane's local coordinate System*/ glLoadIdentity(); glBegin(GL_LINES); // X Axis glVertex3f(0,0,0); glVertex3f(theMatrix[0],theMatrix[4],theMatrix[8]); //Y Axis glVertex3f(0,0,0); glVertex3f(theMatrix[1],theMatrix[5],theMatrix[9]); //Z Axis glVertex3f(0,0,0); glVertex3f(theMatrix[2],theMatrix[6],theMatrix[10]); glEnd();//So far all's well glPushMatrix(); glTranslatef(0,0,-6);//Zoom Out A little bit glMultMatrixf(theMatrix);//Rotate by the Plane's Orientation Matrix DrawPlane();// the plane is visible, but with angles that have no relation to local coord System glPopMatrix();​
תודה
 

tseliot

New member
תיקון אחד...

הזום אווט צריך לבוא לפני ציור מערכת הצירים, לא לפני ציור המטוס..
 

voguemaster

New member
לא הבנתי מה אתה מנסה לעשות ת'אמת

מה הכוונה ב- "עכשיו הייתי רוצה להשתמש במטריצה הנ"ל בתור מטריצת הMODELVIEW בOPENGL כדי שהמטוס יצויר כמו שצריך" ?? אני לא עוקב.
 

DadleFish

New member
גל, תפרוש, אתה לא מצחיק.

 

tseliot

New member
הסבר...

בניתי מטריצה של מערכת הצירים המקומית של המטוס, ומכיוון שהיא מייצגת את האוריינטציה שלו, הייתי רוצה להשתמש בה במקום ב glRotate:
//instead of: glLoadIdentity(); glRotatef(Plane->Yaw,0,0,1); glRotatef(Plane->Pitch,0,1,0); glRotatef(Plane->Roll,1,0,0); DrawPlane(); //we can do: glLoadMatrix(Plane->OrientationMatrix); DrawPlane();​
אם אני עדיין לא ברור תסבירו איפה ואני אשתדל להרחיב...
 

voguemaster

New member
אם אני מבין נכון את מה שעשית

בחלק הראשון בעצם השתמשת בשלושת זוויות אוילר (סביב צירים ראשיים של הגוף, לא חשוב) כדי לעשות מניפולציה על מטריצת היחידה. בחלק השני אתה רוצה להשתמש במטריצה כדי לקבוע את האוריינטציה. אז קודם כל, איך אתה יודע שהמטריצה שלך נכונה ? ואחרי זה, איך אתה יודע שהמטריצה הזו עושה TRANSFORM לוורטקסים של המטוס למקום שאכן התכוונת שהם יהיו בהם ?? תראה, מה שקורה במנוע תלת מימדי באופן כללי זה הדבר הבא: 1. יש מודל תלת-מימדי (מטוס) שמורכב מוורטקסים. הקואורדינטות שלהם יחסיות למע' הקואורדינטות של המטוס (הראשית שלה נקבעת שרירותית על ידך נניח והיא נקראת בד"כ model space). 2. אתה רוצה למקם את המטוס (יענו את הוורטקסים שלו) במרחב התלת-מימדי של *העולם* שלך. לשם כך אתה צריך לבצע rotation, scaling ו-translation. כל הפעולות האלה מבוצעות ע"י המנוע בכך שהן מפעילות את המטריצה הרלוונטית על כל הוורטקסים. לדוגמא, אם יש מטריצה שמסובבת וורטקס במרחב ב-90 מעלות סביב ציר כלשהו, אם תפעיל אותה על כל הוורטקסים המטוס כולו יסתובב ב-90 מעלות סביב אותו ציר. (אני מניח שאתה יודע את כל מה שאני כותב כאן). 3. אחרי שהפעלת מטריצה שממקמת את המטוס שלך במרחב של ה*עולם*, יש לך גם VIEW כלשהו שיודע להציג רק את מה שאתה מסתכל עליו במרחב. ככה אתה מקבל בעצם את התמונה, אחרי שהיא עוברת PROJECTION לדו-מימד. עכשיו, בעיקרון אם אתה רק רוצה לסובב את המטוס לאוריינטציה כלשהי ולצייר אותו אז זו פעולה של הכפלת כל הוורקטסים במטריצת הסיבוב (בהנחה שבנית אותה נכון). היא תסובב לך את הוורקטסים והכל יהיה בסדר. את זה OGL אמורה לעשות בשבילך, אתה רק צריך לספק לה את מטריצת הסיבוב מ-model space ל-world space. כנראה שמטריצה שלך לא נכונה. אני גם לא יודע מה DrawPlane עושה בפנים. יכול להיות שיש שם מניפולציות אחרות שאני לא יודע עליהן. שתדע בגדול - מטריצת האוריינטציה מייצגת כמה לסובב את המטוס בכל ציר בהנחה שאתה מתחיל מ-model space. פשוט נראה לי שהתבלבלת במושגים והמטריצה שלך לא נכונה.
 

tseliot

New member
זה בסדר הסתדרתי...

חשבתי שאני צריך לעשות המרה של המערך של המטריצה מROWS לCOLUMNS, אבל לא הייתי צריך. בזה היתה נעוצה כל הטעות...
 
למעלה