Download - jogl
04/19/2304/19/23 11
jogljogl
נכתב ע"י משה חדדנכתב ע"י משה חדד
2204/19/2304/19/23
PreviouslyPreviously ,on CG… ,on CG…
מעבר מקורדינטות עולם לקורדינטות מבטמעבר מקורדינטות עולם לקורדינטות מבט
ProjectionProjectionהטלה אורתוגרפיתהטלה אורתוגרפיתהטלה פרספקטיביתהטלה פרספקטיביתOpenGLOpenGL
windowswindows
GlutGlut
openGLopenGLפקודות פקודות
3304/19/2304/19/23
היוםהיום
JoglJoglהתקנההתקנהאובייקטים בסיסייםאובייקטים בסיסייםהגדרת סביבה בסיסיתהגדרת סביבה בסיסית
openGLopenGL פקודות נוספות ב פקודות נוספות ב
4404/19/2304/19/23
JOGLJOGL
jogljogl בראשית היהjava3D וחושך על פני תהום, ויאמרו
Sun Microsystems יהי joglJogl-היא ממשק ל openGL עבור java שפותחה
openGL SGISGIבשיתוף עם יוצרת השימוש בפונקציות השימוש בפונקציותopenGLopenGL נעשה בעזרת נעשה בעזרת JNI JNI
java native interfacejava native interfaceJNIJNI מאפשרת שימוש בקוד מאפשרת שימוש בקוד c / cc / c++++ מתוך קוד מתוך קוד javajava
JoglJogl משתמש בעצם בספריות משתמש בעצם בספריות openGLopenGL -שכתובות ב- שכתובות ב cc nativesnativesכמובן שעבור על סביבת עבודה נצטרך כמובן שעבור על סביבת עבודה נצטרך
המתאימים לסביבה )מנטרל את הרב-סביבתיות של המתאימים לסביבה )מנטרל את הרב-סביבתיות של javajava) )
5504/19/2304/19/23
JOGLJOGL
JoglJoglהתקנת התקנת ע"מ להתקין את הספריות יש להוריד מהאתר של ע"מ להתקין את הספריות יש להוריד מהאתר שלjogljogl שני שני
קבצים עיקרייםקבצים עיקריים
Jogl.jarJogl.jar-מכיל את הפקודות ב- – מכיל את הפקודות ב – javajava
jogl-natives-windows-i586.zipjogl-natives-windows-i586.zip -מכיל את קבצי ה- – מכיל את קבצי ה – dlldll במקרה שלנו ( במקרה שלנו (windowswindowsהמתאימים למערכת ההפעלה )המתאימים למערכת ההפעלה )
לינק לאתר לינק לאתרhttps://jogl.dev.java.net/servlets/ProjectDocumentList
20092009אפשר להוריד את הגרסה האחרונה של יוני אפשר להוריד את הגרסה האחרונה של יוני ניתן כמובן גם להוריד משם את ניתן כמובן גם להוריד משם אתjavaDocjavaDoc וגם קבצי וגם קבצי demodemo
6604/19/2304/19/23
JOGLJOGL JoglJoglהתקנת התקנת
כזה ראה וקדשכזה ראה וקדש
7704/19/2304/19/23
JOGLJOGL
JSR-231-1.1.1aJSR-231-1.1.1a
)בהנחה שיש לכם מעבד )בהנחה שיש לכם מעבד jogl-1.1.1a-windows-i586.zipjogl-1.1.1a-windows-i586.zipקובץ קובץ אינטל(אינטל(
8804/19/2304/19/23
JOGLJOGL
\C:\Program Files\Java\C:\Program Files\Java יש לשם בספריה יש לשם בספריה jarjarאת קובץ ה את קובץ ה jre1.5.0_06\lib\extjre1.5.0_06\lib\ext
dlldll יש לפתוח ולהכניס את קבצי ה- יש לפתוח ולהכניס את קבצי ה- nativesnativesאת קובץ ה-את קובץ ה-לספריהלספריה
C:\Program Files\Java\jre1.5.0_06\binC:\Program Files\Java\jre1.5.0_06\bin
הערההערהJoglJoglעברה פיתוחים רבים ושינויים רבים ,נכון לעכשיו היא התייצבה עברה פיתוחים רבים ושינויים רבים ,נכון לעכשיו היא התייצבה בעקבות השינויים הנ"ל קוד ישן לא יעבוד עם הספריות החדשותבעקבות השינויים הנ"ל קוד ישן לא יעבוד עם הספריות החדשות ניתן להבחין בין קוד ישן ניתן להבחין בין קוד ישן
………………import net.java.games.joglimport net.java.games.joglהקוד הישן משתמש ב הקוד הישן משתמש ב
…………import import com.sun.opengl.utilcom.sun.opengl.utilהקוד החדש משתמש ב-הקוד החדש משתמש ב-אז אם אתם מחפשים דוגמאות באינטרנט תדאגו שהם יהיו מעודכנותאז אם אתם מחפשים דוגמאות באינטרנט תדאגו שהם יהיו מעודכנות
9904/19/2304/19/23
JOGLJOGL
אובייקטים בסיסייםאובייקטים בסיסיים GLCanvasGLCanvas מתפקד כמו מתפקד כמוcanvascanvas)כלומר משטח עליו ניתן לצייר( )כלומר משטח עליו ניתן לצייר( GLJPanelGLJPanel מתפקד כמו – מתפקד כמו –JpanelJpanel איטי יחסית ל ,איטי יחסית ל, GLCanvasGLCanvasGLAutoDrawableGLAutoDrawableממשק שמיישמים שני הרכיבים הנ"ל המאפשר- ממשק שמיישמים שני הרכיבים הנ"ל המאפשר -
)ומשם למתודות שלו( )ומשם למתודות שלו(GLGLגישה לאובייקט גישה לאובייקט
לאירועים המתרחשים בתכנית לאירועים המתרחשים בתכנית calbackcalback GLEventListenerGLEventListenerמנגנון מנגנון Init)( , display)( , reshape)(, displayChangedInit)( , display)( , reshape)(, displayChanged)()(
GLCapabilitiesGLCapabilities –– מאפשר קבלת סט של פרמטרים עבור מאפשר קבלת סט של פרמטרים עבורopenGLopenGL לא )לא( חובה לשימוש(חובה לשימוש(
AnimatorAnimator אובייקט שתפקידו העיקרי הוא לקבל -אובייקט שתפקידו העיקרי הוא לקבל-GLCanvasGLCanvas ולקרוא ולקרוא באופן סידרתי באופן סידרתי)()(displaydisplayלמתודת ה-למתודת ה-
101004/19/2304/19/23
JOGLJOGL
הגדרת סביבה בסיסיתהגדרת סביבה בסיסית importimport נקרא לספריות של - נקרא לספריות של - openGLopenGL-ול-ולawtawt
java.awtjava.awt
javax.media.opengljavax.media.opengl
javax.media.opengl.glu.GLUjavax.media.opengl.glu.GLU
com.sun.opengl.utilcom.sun.opengl.util-ניישם מחלקה כ-ניישם מחלקה כGLEventListenerGLEventListener
וכו' וכו' init)( displayinit)( displayהמחלקה תיישם את המתודות המחלקה תיישם את המתודות
ניישם כמובן גם את הארועים עליהם אנחנו רוצים להגיב כלומר ניישם כמובן גם את הארועים עליהם אנחנו רוצים להגיב כלומר keylistener,mouselistenerkeylistener,mouselistener וכו' כך שיתווספו לנו המתודות וכו' כך שיתווספו לנו המתודות
המתאימותהמתאימות
111104/19/2304/19/23
JOGLJOGL public classpublic class Ex3 implements GLEventListener, KeyListener, MouseMotionListener { Ex3 implements GLEventListener, KeyListener, MouseMotionListener {//the main class will implement the GLEventListener adding the init & display methods//the main class will implement the GLEventListener adding the init & display methodspublic staticpublic static GLU glu; GLU glu; //static object GLU that will be init at the init)( method//static object GLU that will be init at the init)( method
public static voidpublic static void main)String[] args( { main)String[] args( {Frame f = new Frame)"Ex3"(; Frame f = new Frame)"Ex3"(; //create a frame//create a frameGLCanvas canvas = GLCanvas canvas = newnew GLCanvas)(; GLCanvas)(; //create a GLCanvas//create a GLCanvascanvas.addGLEventListener)new Ex3)((; canvas.addGLEventListener)new Ex3)((; //add the ex3 as an event listener for GLCanvas events//add the ex3 as an event listener for GLCanvas eventsf.setSize)800, 640(;f.setSize)800, 640(;finalfinal Animator animator = Animator animator = newnew Animator)canvas(; Animator)canvas(; //create animator class that gets the GLCanvas //create animator class that gets the GLCanvas
and calls it’s display methods sequentiallyand calls it’s display methods sequentiallyf.add)canvas(; //add the canvas to the framef.add)canvas(; //add the canvas to the framef.addWindowListener)new WindowAdapter)( { f.addWindowListener)new WindowAdapter)( { //create a window adapter the handle the window //create a window adapter the handle the window
closing eventclosing eventpublicpublic voidvoid windowClosing)WindowEvent e( { windowClosing)WindowEvent e( {
newnew Thread) Thread)newnew Runnable)( Runnable)( {//create a different thread that handles the {//create a different thread that handles the animator closing and system exit to make sure the animator will be stopped before the system will exitanimator closing and system exit to make sure the animator will be stopped before the system will exit
publicpublic voidvoid run)( { run)( {animator.stop)(;animator.stop)(;System.exit)0(;System.exit)0(;
}}}(.start)(;}(.start)(;
}}}(;}(;f.setVisible)f.setVisible)truetrue(; (; //make the frame visible//make the frame visibleanimator.start)(; animator.start)(; //start the animator//start the animator
}}}}
121204/19/2304/19/23
JOGLJOGL
Init)( , displayInit)( , display)()('וכו' וכו מקבלות אובייקט מסוג מקבלות אובייקט מסוגGLAutoDrawableGLAutoDrawable ממנו אפשר לגשת ממנו אפשר לגשת
GLGLלאובייקט לאובייקט לפי ההוראות במדריך של לפי ההוראות במדריך שלjogljogl עדיף לקבל את עדיף לקבל את GLGL בכל פעם בכל פעם
)()(initinitבמתודות מאשר להגדיר משתנה גלובלי שמותחל ב-במתודות מאשר להגדיר משתנה גלובלי שמותחל ב--במתודת ה-במתודת הinitinit)()( נגדיר את כל ההגדרות הבסיסיות לסביבה נגדיר את כל ההגדרות הבסיסיות לסביבה
openGLopenGLשל של -במתודת ה-במתודת הdisplaydisplay)()(נצייר את הסביבה שאנחנו רוצים נצייר את הסביבה שאנחנו רוצים ע"מ לגשת לאובייקטים של ע"מ לגשת לאובייקטים שלGLUGLU נגדיר מחלקה גלובלית נגדיר מחלקה גלובלית GLUGLU
GLUGLU וכך ניגש למתודות ואובייקטים של וכך ניגש למתודות ואובייקטים של )()(initinitשמותחל ב-שמותחל ב-
131304/19/2304/19/23
JOGLJOGL public voidpublic void init)GLAutoDrawable arg0( { init)GLAutoDrawable arg0( {
GL gl = arg0.getGL)(; GL gl = arg0.getGL)(; // get the GL from the GLAutoDrawable// get the GL from the GLAutoDrawable
gl.glEnable)GL.GL_NORMALIZE(; gl.glEnable)GL.GL_NORMALIZE(; //all the vecs wil be//all the vecs wil be normalizenormalize
gl.glEnable)GL.GL_CULL_FACE(; gl.glEnable)GL.GL_CULL_FACE(; //enable cull face//enable cull face
gl.glEnable)GL.GL_DEPTH_TEST(; gl.glEnable)GL.GL_DEPTH_TEST(; //enable depth buffer//enable depth buffer
gl.glClearColor)0.0f, 0.0f, 0.0f, 0.0f(; gl.glClearColor)0.0f, 0.0f, 0.0f, 0.0f(; //define the clear color to//define the clear color to blackblack
glu = glu = newnew GLU)(; GLU)(; //init the GLU object//init the GLU object
gl.glMatrixMode)GL.GL_PROJECTION(; gl.glMatrixMode)GL.GL_PROJECTION(; //switch to projection //switch to projection matrixmatrix
gl.glLoadIdentity)(; gl.glLoadIdentity)(; //init the matrix//init the matrix
glu.gluPerspective)45.0f, 800 / 640, 1, 1000glu.gluPerspective)45.0f, 800 / 640, 1, 1000(;//init the 3D (;//init the 3D perspective viewperspective view
}}
141404/19/2304/19/23
JOGLJOGL glMatrixMode(GL_PROJECTION) ;glLoadIdentity(); gluPerspective(viewAngle,aspectRatio,n,f);
zv
far
near
yv
xv
151504/19/2304/19/23
JOGLJOGL public voidpublic void display)GLAutoDrawable arg0( { display)GLAutoDrawable arg0( {
GL gl = arg0.getGL)(GL gl = arg0.getGL)(;//get the GL object;//get the GL object
gl.glClear)GL.GL_COLOR_BUFFER_BIT | gl.glClear)GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT(; GL.GL_DEPTH_BUFFER_BIT(; //clear the depth buffer and the color //clear the depth buffer and the color bufferbuffer
gl.glMatrixMode)GL.GL_MODELVIEW(; gl.glMatrixMode)GL.GL_MODELVIEW(; //switch to model //switch to model matrixmatrix
gl.glLoadIdentity)(; gl.glLoadIdentity)(; //init the matrix//init the matrix
glu.gluLookAt)eyeX,eyeY,eyeZ,cX,cY,cZ,upX,upY,upZ((; glu.gluLookAt)eyeX,eyeY,eyeZ,cX,cY,cZ,upX,upY,upZ((; //set //set the camera viewthe camera view
//draw things using openGL//draw things using openGL
gl.glFlush)(; gl.glFlush)(; //load the data to the bufffers//load the data to the bufffers
}}
161604/19/2304/19/23
OpenGLOpenGLOpenGLOpenGL
glPushMatrixglPushMatrixדוחפת את המטריצה הנוכחית למחסניתדוחפת את המטריצה הנוכחית למחסנית
glPopMatrixglPopMatrixמחזירה את המטריצה האחרונה שנדחפה למחסניתמחזירה את המטריצה האחרונה שנדחפה למחסנית
נשתמש בפונקציות הנ"ל כשנבנה אובייקט המורכב מכמה אובייקטיםנשתמש בפונקציות הנ"ל כשנבנה אובייקט המורכב מכמה אובייקטים נשתמש בנקודה אחת כנקודת מקור שממנה נבנה את כל האובייקט נשתמש בנקודה אחת כנקודת מקור שממנה נבנה את כל האובייקט
כולוכולוgl.glCallList)Darw_CarBody(; gl.glCallList)Darw_CarBody(; //call the CarBody polar display list//call the CarBody polar display listgl.glPushMatrix)(; gl.glPushMatrix)(; //push the matrix to go back to 0,0//push the matrix to go back to 0,0gl.glTranslatef)X,Y,Z(; gl.glTranslatef)X,Y,Z(; //translate to a new position//translate to a new position gl.glRotatef)right_w, 0.0f, 1.0f, 0.0f(; gl.glRotatef)right_w, 0.0f, 1.0f, 0.0f(; //rotate the wheel//rotate the wheelgl.glCallList)draw_wheel(; gl.glCallList)draw_wheel(; //call the wheel display list//call the wheel display listgl.glPopMatrix)(; gl.glPopMatrix)(; //pop the matrix we back at where we were//pop the matrix we back at where we weregl.glPushMatrix)(; gl.glPushMatrix)(; //push matrix again//push matrix againgl.glTranslatef)X1,Y1,Z1(; gl.glTranslatef)X1,Y1,Z1(; //translate to a new position//translate to a new positiongl.glRotatef)right_w, 0.0f, 1.0f, 0.0f(; gl.glRotatef)right_w, 0.0f, 1.0f, 0.0f(; //rotate the wheel//rotate the wheel gl.glCallList)draw_wheel(; gl.glCallList)draw_wheel(; //call the wheel display list again//call the wheel display list againgl.glPopMatrix)(; gl.glPopMatrix)(; //pop the matrix//pop the matrix
171704/19/2304/19/23
OpenGLOpenGLOpenGLOpenGL
Body System
Front-Wheel System
181804/19/2304/19/23
OpenGLOpenGL
OpenGLOpenGLgluLookAtgluLookAt)()(
הפקודה הנ"ל נותנת לנו נקודת מבט על העולםהפקודה הנ"ל נותנת לנו נקודת מבט על העולם
)ממקמת את המצלמה במיקום מסויים()ממקמת את המצלמה במיקום מסויים(
: :GLdoubleGLdouble או או doubledoubleמקבלת את הערכים הבאים מסוג מקבלת את הערכים הבאים מסוג
eyex,eyey,eyezeyex,eyey,eyezזה המיקום של המצלמה זה המיקום של המצלמה
centerx,centery,centerzcenterx,centery,centerz לאן המצלמה מסתכלת לאן המצלמה מסתכלת
upx ,upy upzupx ,upy upz ווקטור ווקטור UPUP
הפקודה תבוא אחרי קריאה למטריצת המודלינג הפקודה תבוא אחרי קריאה למטריצת המודלינג glMatrixMode)GL_MODELVIEW(glMatrixMode)GL_MODELVIEW(;;
191904/19/2304/19/23
OpenGLOpenGL
OpenGLOpenGLהמצלמההמצלמה
glLookAtglLookAtנוכל לשלוט בתזוזת המצלמה ע"י נוכל לשלוט בתזוזת המצלמה ע"י
נגדיר את שלוש הנקודות כווקטוריםנגדיר את שלוש הנקודות כווקטורים
נשנה את הווקטורים בהתאם לצרכים שלנונשנה את הווקטורים בהתאם לצרכים שלנו
תזוזה קדימה אחורהתזוזה קדימה אחורה נחשב ווקטור בין מיקום המצלמה נחשב ווקטור בין מיקום המצלמהeyeeye לבין לבין centercenter directiondirectionתזוזה קדימה תתבצע בכיוון של הווקטור הנ"לתזוזה קדימה תתבצע בכיוון של הווקטור הנ"לeye+directioneye+direction יקדם את יקדם אתeyeeye בכיוון של בכיוון של directiondirectioncenter+directioncenter+direction יקדם את יקדם את centercenter בכיוון של בכיוון של directiondirection אם נכפיל את אם נכפיל אתdirectiondirectionבגודל כלשהו נקבל התקדמות מהירה יותר בגודל כלשהו נקבל התקדמות מהירה יותר אם נכפיל את אם נכפיל אתdirectiondirectionבמספר שלילי נקבל התקדמות אחורה במספר שלילי נקבל התקדמות אחורה
202004/19/2304/19/23
OpenGLOpenGL
OpenGLOpenGLהמצלמההמצלמה
סיבוב המצלמה מסביב לאובייקטסיבוב המצלמה מסביב לאובייקט המצלמה נמצא ב המצלמה נמצא בeyeeye ומסתכלת על ומסתכלת על centercenter נחשב ווקטור נחשב ווקטור
rrבניהם נקרא לו בניהם נקרא לו נקרא לזוית בין נקרא לזוית ביןrr לציר לציר yy ββr*sin)r*sin)ββ(=r_project(=r_project נראה לזוית בין נראה לזוית ביןr_projectr_project לציר לציר xx α αr_project*sin)r_project*sin)αα(=z(=zr_project*cos)r_project*cos)αα(=x(=x שליטה על הזויות תיתן לנו שליטה על מיקום המצלמה מסביב שליטה על הזויות תיתן לנו שליטה על מיקום המצלמה מסביב
לאובייקטלאובייקט
212104/19/2304/19/23
OpenGLOpenGL
OpenGLOpenGLהמצלמההמצלמה
מבט של המצלמה מסביבמבט של המצלמה מסביב ממש כמו מקודם יש לנו שתי זוויות אחת עם ציר ממש כמו מקודם יש לנו שתי זוויות אחת עם צירYY ואחת עם ואחת עם
XX ββ ו ו ααבהתאמה בהתאמה הפעם מיקום ה הפעם מיקום הeyeeye ומיקום ה ומיקום ה centercenterהתחלף התחלף עכשיו בראשית יושב ה עכשיו בראשית יושב הeyeeye-וה- וה centercenter יושב היכן שהמצלמה יושב היכן שהמצלמה
מסתכלתמסתכלת ע"י שינוי הזוויות אפשר לשלוט על מבט המצלמה ע"י שינוי הזוויות אפשר לשלוט על מבט המצלמה
222204/19/2304/19/23
OpenGLOpenGL
OpenGLOpenGLהמצלמההמצלמה
לא לשכוח להחזיר את המצלמה למקום שלהלא לשכוח להחזיר את המצלמה למקום שלהבחישוב שלנו אנחנו משתמשים בווקטורים,ווקטורים יוצאים בחישוב שלנו אנחנו משתמשים בווקטורים,ווקטורים יוצאים
נמצא חישבנו אותו נמצא חישבנו אותו centercenterמהראשית,לכן אחרי שחישבנו היכן מהראשית,לכן אחרי שחישבנו היכן כלומר לחבר בין כלומר לחבר בין eyeeyeיחסית לראשית וצריך למקום אותו יחסית ל יחסית לראשית וצריך למקום אותו יחסית ל
שניהםשניהם
eye
center
up ββ
αα
232304/19/2304/19/23
OpenGLOpenGL
OpenGLOpenGLהמצלמההמצלמה
תנועה חלקהתנועה חלקה לחיצה על החצים במקלדת תגרום למצלמה להמשיך ישר כל הזמן עד לחיצה על החצים במקלדת תגרום למצלמה להמשיך ישר כל הזמן עד
לשיחרור המקש לשיחרור המקש ע"מ לשלב לחיצה על כמה מקשים במקביל נבצע כמה דבריםע"מ לשלב לחיצה על כמה מקשים במקביל נבצע כמה דברים
)move)amount(move)amountבהנחה שיש לנו פונקצית תזוזת מצלמה בהנחה שיש לנו פונקצית תזוזת מצלמה
)rotate)r_amount(rotate)r_amountבהנחה שיש לנו פונקציית סיבוב מצלמה בהנחה שיש לנו פונקציית סיבוב מצלמה
ולא ולא displaydisplayקריאה לפונקציות הנ"ל תתבצע בפונקציית ה קריאה לפונקציות הנ"ל תתבצע בפונקציית ה בפונקציית המקלדת, הקריאה תתבצע רק אם יש תזוזה במצלמהבפונקציית המקלדת, הקריאה תתבצע רק אם יש תזוזה במצלמה
ישונו לפי לחיצה על מקשי ישונו לפי לחיצה על מקשי r_amountr_amount ו ו amountamountהערכים הערכים המקלדתהמקלדת
הערכים יאופסו ברגע ששיחררנו את מקשי המקלדתהערכים יאופסו ברגע ששיחררנו את מקשי המקלדת
242404/19/2304/19/23
OpenGLOpenGLOpenGLOpenGL
המצלמההמצלמהתנועה חלקהתנועה חלקה
כשאר לוחצים על המקשים במקלדתכשאר לוחצים על המקשים במקלדתpublic voidpublic void keyPressed)KeyEvent arg0( { keyPressed)KeyEvent arg0( {
switch )arg0.getKeyCode)(( {switch )arg0.getKeyCode)(( {casecase 38: 38:
moveAmount = 0.01f;moveAmount = 0.01f;breakbreak;;
casecase 40: 40:moveAmount =-0.01f;moveAmount =-0.01f;
breakbreak;; casecase 37: 37:
rotateAmount = 0.01f;rotateAmount = 0.01f;breakbreak;;
..
..
..}}
}}
252504/19/2304/19/23
OpenGLOpenGLOpenGLOpenGL
המצלמההמצלמהתנועה חלקהתנועה חלקה
הפונקציה שתטפל בשיחרור מקשהפונקציה שתטפל בשיחרור מקשpublic void keyReleased)KeyEvent arg0( {public void keyReleased)KeyEvent arg0( {
switch )arg0.getKeyCode)(( {switch )arg0.getKeyCode)(( {
case 38:case 38:
moveAmount = 0.0f;moveAmount = 0.0f;
break;break;
case 40:case 40:
moveAmount = 0.0f;moveAmount = 0.0f;
break;break;
case 37:case 37:
rotateAmount = 0.0f;rotateAmount = 0.0f;
break;break;
case 39:case 39:
rotateAmount = 0.0f;rotateAmount = 0.0f;
break;break;
}}
}}
262604/19/2304/19/23
OpenGLOpenGL
אור וצבעאור וצבעמראה האובייקט תלוי בכמה דבריםמראה האובייקט תלוי בכמה דבריםסוג פני השטח של האובייקטסוג פני השטח של האובייקט
מחוספס ,חלק ,משטח מראה וכו,מחוספס ,חלק ,משטח מראה וכו,מיקום האור וסוגומיקום האור וסוגו
יחסית לעיןיחסית לעיןמיקום העיןמיקום העין
יחסית לאוריחסית לאור
272704/19/2304/19/23
OpenGLOpenGL
אור וצבעאור וצבעשלושה סוגי אורשלושה סוגי אור
AmbientAmbient אור אחיד...האור המוחזר מכל עצם ומגיע מכל מקום בצורה אור אחיד...האור המוחזר מכל עצם ומגיע מכל מקום בצורה
אחידה.אחידה.
DiffuseDiffuse הבהירות של העצם )בכל נקודה( ביחס למקור האור. )מחושב הבהירות של העצם )בכל נקודה( ביחס למקור האור. )מחושב
לפי הזווית בין קרן האור לבין הנורמל לנקודה(לפי הזווית בין קרן האור לבין הנורמל לנקודה(
SpecularSpecular הברק של העצם ביחס למקור האור )מחושב לפי הזווית בין קרן הברק של העצם ביחס למקור האור )מחושב לפי הזווית בין קרן
האור לבין הנורמל לנקודה(האור לבין הנורמל לנקודה(
282804/19/2304/19/23
OpenGLOpenGL
אור וצבעאור וצבע-ע"מ להגדיר אור ב-ע"מ להגדיר אור בOpenGLOpenGL:צריך להגדיר: צריך להגדיר מיקום האורמיקום האורסוג החומר של העצםסוג החומר של העצםהנורמלים של הקודקודיםהנורמלים של הקודקודיםוכמובן צריך להודיע לוכמובן צריך להודיע לOpenGLOpenGL-- שאנחנו נשתמש שאנחנו נשתמש
באורבאורgl.glEnable)gl.glEnable)GL_LIGHTINGGL_LIGHTING((
292904/19/2304/19/23
OpenGLOpenGL
אור וצבעאור וצבעOpenGLOpenGL-מקורות אור מקורות אור88 תומכת ב- תומכת ב נאפשר כל מקור בנפרד ע"י נאפשר כל מקור בנפרד ע"יglEnable)glEnable)GL_LIGHTnGL_LIGHTn((
>>nn>>0077כאשר כאשר ונגדיר את המאפיינים של כל מקור ע"יונגדיר את המאפיינים של כל מקור ע"י ווקטור ערכים ווקטור ערכיםfloat values[] = {0.0, 1.0, 0.0, 1.0}float values[] = {0.0, 1.0, 0.0, 1.0};;
gl.glLightfv(GL_LIGHT2,GL_DIFFUSE,values);gl.glLightfv(GL_LIGHT2,GL_DIFFUSE,values);
ערכים אפשרייםערכים אפשרייםGL.GL_AMBIENT, GL.GL_DIFFUSE: GL.GL_AMBIENT, GL.GL_DIFFUSE: GL.GL_SPECULAR ,GL.GL_POSITIONGL.GL_SPECULAR ,GL.GL_POSITION
303004/19/2304/19/23
OpenGLOpenGLאוראור
דוגמהדוגמהfloat color[4] = {0.0, 0.85, 0.0, 1.0};float ambient[4] = {0.05, 0.05, 0.05, 1.0};float position[4] = {0.0, 1.0, 1.0};Init)GLAutoDrawable arg0({
GL gl = arg0.getGL)(;gl.glEnable)GL_LIGHTING(;gl.glEnable)GL_LIGHT0(;
}Display)GLAutoDrawable arg0({
GL gl = arg0.getGL)(;gl.glLightfv)GL_LIGHT0, GL_AMBIENT, ambient(; gl.glLightfv)GL_LIGHT0, GL_DIFFUSE, color(; gl.glLightfv)GL_LIGHT0, GL_SPECULAR, color(; gl.glLightfv)GL_LIGHT0, GL_POSITION, position(;
}
313104/19/2304/19/23
OpenGLOpenGL
אוראור:סוגי האור:סוגי האור
אור קבועאור קבוע
אור הנע מסביב לאובייקטאור הנע מסביב לאובייקט
אור הנע עם המצלמהאור הנע עם המצלמה
323204/19/2304/19/23
OpenGLOpenGL
אוראוראור קבועאור קבוע
-האור יוגדר לאחר הגדרת ה-האור יוגדר לאחר הגדרת הViewportViewport gllookAtgllookAtכלומר לאחר כלומר לאחר
gl.glMatrixMode)GL_MODELVIEW( ;gl.glMatrixMode)GL_MODELVIEW( ;gl.glLookAt / any view transformgl.glLookAt / any view transformgl.glLightgl.glLight)GL_POSITION/DIRECTION()GL_POSITION/DIRECTION(gl.glRotate/glTranslate/glScale - on the objects.gl.glRotate/glTranslate/glScale - on the objects.
333304/19/2304/19/23
OpenGLOpenGL
אוראוראור הנע מסביב לאובייקטאור הנע מסביב לאובייקט
האור יוגדר בנפרד וללא קשר האור יוגדר בנפרד וללא קשרViewportViewportל-ל-
gl.glMatrixMode)GL_MODELVIEW( ;gl.glMatrixMode)GL_MODELVIEW( ;gl.glLookAt / any view transformgl.glLookAt / any view transformgl.glPushMatrix)( ;gl.glPushMatrix)( ;gl.glTranslate)( / glRotate)( )for light pos and dir(gl.glTranslate)( / glRotate)( )for light pos and dir(gl.gl.glLightglLight)GL_POSITION/DIRECTION()GL_POSITION/DIRECTION(gl.glPopMatrix)( ;gl.glPopMatrix)( ;gl.glBegin)( … gl.glEnd)( // Draw the objects.gl.glBegin)( … gl.glEnd)( // Draw the objects.
343404/19/2304/19/23
OpenGLOpenGL
אוראוראור הנע עם המצלמהאור הנע עם המצלמה
-האור יוגדר לפני ה-האור יוגדר לפני הViewportViewport כלומר לפני כלומר לפני glLookAtglLookAt
gl.glMatrixMode)GL_MODELVIEW( ;gl.glMatrixMode)GL_MODELVIEW( ;
gl.glLoadIdentity)( ; gl.glLoadIdentity)( ;
gl.gl.glLightglLight)GL_POSITION/DIRECTION()GL_POSITION/DIRECTION(
gl.glLookAt / any view transformgl.glLookAt / any view transform
gl.glTranslate)( / glRotate)( )for objects(gl.glTranslate)( / glRotate)( )for objects(
gl.glBegin)( … glEnd)( // Draw the objects.gl.glBegin)( … glEnd)( // Draw the objects.
353504/19/2304/19/23
OpenGLOpenGL
אוראורהגדרת חומרים הגדרת חומרים
כדי לדעת את כמות האור המוחזר כדי לדעת את כמות האור המוחזרמהאובייקט עלינו להגדיר גם מאיזה מהאובייקט עלינו להגדיר גם מאיזה
סוג חומר הואסוג חומר הוא הגדרת חומרים נעשית דומה מאוד הגדרת חומרים נעשית דומה מאוד
להגדרת אורלהגדרת אור
363604/19/2304/19/23
OpenGLOpenGL
אוראורהגדרת חומריםהגדרת חומרים
הגדרת חומר מוחלת על כל הגדרת חומר מוחלת על כלהאובייקטים המצויירים עד אשר משנים האובייקטים המצויירים עד אשר משנים
את ההגדרהאת ההגדרהנשתמש בפונקציהנשתמש בפונקציה
gl.gl.glMaterialfv(GL_FRONT, p_name, p)glMaterialfv(GL_FRONT, p_name, p);;
373704/19/2304/19/23
OpenGLOpenGL
אוראורהגדרת חומריםהגדרת חומרים
כפי שראינו בהרצאה כל חומר מחזיר את כפי שראינו בהרצאה כל חומר מחזיר אתשלושת הסוגים של האור לכן גם כאן נגדיר שלושת הסוגים של האור לכן גם כאן נגדיר
את שלושת הסוגיםאת שלושת הסוגיםAmbientAmbient ו ו diffusediffuse בדרך כלל הם אותו צבע בדרך כלל הם אותו צבע SpecularSpecular מוגדר בדרך כלל בגוון של אפור מוגדר בדרך כלל בגוון של אפור
)מתכתי()מתכתי(
383804/19/2304/19/23
OpenGLOpenGL
אוראורהגדרת חומריםהגדרת חומרים
GL_SHININESSGL_SHININESSמגדיר את כמות הברק של האובייקט מגדיר את כמות הברק של האובייקט
float m_color[4] = {0.0, 0.85, 0.0, 1.0};float s_color[4] = {0.8, 0.8, 0.8, 1.0};float shininess[1] = {120.0};
gl.gl.glMaterialfv)GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m_color(; gl.gl.glMaterialfv)GL_FRONT, GL_SPECULAR, s_color(; glMaterialfv)GL_FRONT,
gl.gl.GL_SHININESS, shininess( ;
393904/19/2304/19/23
OpenGLOpenGL
אוראורהגדרת חומריםהגדרת חומרים
GL_FRONTGL_FRONT אומר בעצם להגדיר את הפוליגונים רק בצד אומר בעצם להגדיר את הפוליגונים רק בצד הקידמי שלהםהקידמי שלהם
איך נדע מה הצד הקידמי ומה הצד האחורי? נגדיראיך נדע מה הצד הקידמי ומה הצד האחורי? נגדירgl.gl.glFrontFaceglFrontFace)GLenum mode()GLenum mode(קובע איך יוגדרו הצדדים קובע איך יוגדרו הצדדים
CCWCCW נגד כיוון השעון -נגד כיוון השעון-GL.GL_CCWGL.GL_CCW
CWCW עם כיוון השעון –עם כיוון השעון– GL.GL_CWGL.GL_CW אחרי ההגדרה הזאת סדר הכנסת הקודקודים קובע את הפנים אחרי ההגדרה הזאת סדר הכנסת הקודקודים קובע את הפנים
והאחורוהאחור
404004/19/2304/19/23
OpenGLOpenGL
אוראורהגדרת חומריםהגדרת חומרים
v1
v2v3
v1
v3v2
CounterClockWiseClockWise
414104/19/2304/19/23
OpenGLOpenGL
אוראורנורמליםנורמלים
כדי לגעת איך האור מוחזר עלינו לדעת כדי לגעת איך האור מוחזר עלינו לדעתאת מיקום האובייקט יחסית לאור לכן את מיקום האובייקט יחסית לאור לכן
נצטרך להגדיר נורמל לכל קודקוד נצטרך להגדיר נורמל לכל קודקוד שאנחנו מגדיריםשאנחנו מגדירים
הגדרת נורמל מתבצעת בעזרתהגדרת נורמל מתבצעת בעזרתglNormal3f(x, y, z);glNormal3f(x, y, z);
424204/19/2304/19/23
OpenGLOpenGL
אוראורנורמליםנורמלים
הגדרת הנורמלים נעשית בעת הגדרת הגדרת הנורמלים נעשית בעת הגדרתהאובייקטהאובייקט
-לפני שנקרא ל-לפני שנקרא לgl.glVertex3fgl.glVertex3f-נקרא ל- נקרא ל gl.glNormal3fgl.glNormal3f והקודקוד שיבוא אחריו יקבל את הנורמלוהקודקוד שיבוא אחריו יקבל את הנורמל
נורמל צריך להיות ווקטור היחידה לכן או נורמל צריך להיות ווקטור היחידה לכן או openGLopenGLשננרמל אותו לפני כן או שנגדיר ל שננרמל אותו לפני כן או שנגדיר ל
לנרמל את הווקטורים אוטומטית ע"י לנרמל את הווקטורים אוטומטית ע"י gl.gl.glEnable)GL.GL_NORMALIZE(;glEnable)GL.GL_NORMALIZE(;
434304/19/2304/19/23
שאלות?שאלות?