6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 previously,on cg… מעבר...

43
01/22/22 01/22/22 1 jogl jogl דדדד ד"ד דדד דדד דדדד ד"ד דדד דדד

Post on 19-Dec-2015

227 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

04/18/2304/18/23 11

jogljogl

נכתב ע"י משה חדדנכתב ע"י משה חדד

Page 2: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

2204/18/2304/18/23

PreviouslyPreviously ,on CG… ,on CG…

מעבר מקורדינטות עולם לקורדינטות מבטמעבר מקורדינטות עולם לקורדינטות מבט

ProjectionProjectionהטלה אורתוגרפיתהטלה אורתוגרפיתהטלה פרספקטיביתהטלה פרספקטיביתOpenGLOpenGL

windowswindows

GlutGlut

openGLopenGLפקודות פקודות

Page 3: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

3304/18/2304/18/23

היוםהיום

JoglJoglהתקנההתקנהאובייקטים בסיסייםאובייקטים בסיסייםהגדרת סביבה בסיסיתהגדרת סביבה בסיסית

openGLopenGL פקודות נוספות ב פקודות נוספות ב

Page 4: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

4404/18/2304/18/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) )

Page 5: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

5504/18/2304/18/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

Page 6: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

6604/18/2304/18/23

JOGLJOGL JoglJoglהתקנת התקנת

כזה ראה וקדשכזה ראה וקדש

Page 7: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

7704/18/2304/18/23

JOGLJOGL

JSR-231-1.1.1aJSR-231-1.1.1a

)בהנחה שיש לכם מעבד )בהנחה שיש לכם מעבד jogl-1.1.1a-windows-i586.zipjogl-1.1.1a-windows-i586.zipקובץ קובץ אינטל(אינטל(

Page 8: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

8804/18/2304/18/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הקוד החדש משתמש ב-הקוד החדש משתמש ב-אז אם אתם מחפשים דוגמאות באינטרנט תדאגו שהם יהיו מעודכנותאז אם אתם מחפשים דוגמאות באינטרנט תדאגו שהם יהיו מעודכנות

Page 9: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

9904/18/2304/18/23

JOGLJOGL

אובייקטים בסיסייםאובייקטים בסיסיים GLCanvasGLCanvas מתפקד כמו מתפקד כמוcanvascanvas)כלומר משטח עליו ניתן לצייר( )כלומר משטח עליו ניתן לצייר( GLJPanelGLJPanel מתפקד כמו – מתפקד כמו –JpanelJpanel איטי יחסית ל ,איטי יחסית ל, GLCanvasGLCanvasGLAutoDrawableGLAutoDrawableממשק שמיישמים שני הרכיבים הנ"ל המאפשר- ממשק שמיישמים שני הרכיבים הנ"ל המאפשר -

)ומשם למתודות שלו( )ומשם למתודות שלו(GLGLגישה לאובייקט גישה לאובייקט

לאירועים המתרחשים בתכנית לאירועים המתרחשים בתכנית calbackcalback GLEventListenerGLEventListenerמנגנון מנגנון Init)( , display)( , reshape)(, displayChangedInit)( , display)( , reshape)(, displayChanged)()(

GLCapabilitiesGLCapabilities –– מאפשר קבלת סט של פרמטרים עבור מאפשר קבלת סט של פרמטרים עבורopenGLopenGL לא )לא( חובה לשימוש(חובה לשימוש(

AnimatorAnimator אובייקט שתפקידו העיקרי הוא לקבל -אובייקט שתפקידו העיקרי הוא לקבל-GLCanvasGLCanvas ולקרוא ולקרוא באופן סידרתי באופן סידרתי)()(displaydisplayלמתודת ה-למתודת ה-

Page 10: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

101004/18/2304/18/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 וכו' כך שיתווספו לנו המתודות וכו' כך שיתווספו לנו המתודות

המתאימותהמתאימות

Page 11: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

111104/18/2304/18/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

}}}}

Page 12: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

121204/18/2304/18/23

JOGLJOGL

Init)( , displayInit)( , display)()('וכו' וכו מקבלות אובייקט מסוג מקבלות אובייקט מסוגGLAutoDrawableGLAutoDrawable ממנו אפשר לגשת ממנו אפשר לגשת

GLGLלאובייקט לאובייקט לפי ההוראות במדריך של לפי ההוראות במדריך שלjogljogl עדיף לקבל את עדיף לקבל את GLGL בכל פעם בכל פעם

)()(initinitבמתודות מאשר להגדיר משתנה גלובלי שמותחל ב-במתודות מאשר להגדיר משתנה גלובלי שמותחל ב--במתודת ה-במתודת הinitinit)()( נגדיר את כל ההגדרות הבסיסיות לסביבה נגדיר את כל ההגדרות הבסיסיות לסביבה

openGLopenGLשל של -במתודת ה-במתודת הdisplaydisplay)()(נצייר את הסביבה שאנחנו רוצים נצייר את הסביבה שאנחנו רוצים ע"מ לגשת לאובייקטים של ע"מ לגשת לאובייקטים שלGLUGLU נגדיר מחלקה גלובלית נגדיר מחלקה גלובלית GLUGLU

GLUGLU וכך ניגש למתודות ואובייקטים של וכך ניגש למתודות ואובייקטים של )()(initinitשמותחל ב-שמותחל ב-

Page 13: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

131304/18/2304/18/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

}}

Page 14: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

141404/18/2304/18/23

JOGLJOGL glMatrixMode(GL_PROJECTION) ;glLoadIdentity(); gluPerspective(viewAngle,aspectRatio,n,f);

zv

far

near

yv

xv

Page 15: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

151504/18/2304/18/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

}}

Page 16: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

161604/18/2304/18/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

Page 17: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

171704/18/2304/18/23

OpenGLOpenGLOpenGLOpenGL

Body System

Front-Wheel System

Page 18: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

181804/18/2304/18/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(;;

Page 19: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

191904/18/2304/18/23

OpenGLOpenGL

OpenGLOpenGLהמצלמההמצלמה

glLookAtglLookAtנוכל לשלוט בתזוזת המצלמה ע"י נוכל לשלוט בתזוזת המצלמה ע"י

נגדיר את שלוש הנקודות כווקטוריםנגדיר את שלוש הנקודות כווקטורים

נשנה את הווקטורים בהתאם לצרכים שלנונשנה את הווקטורים בהתאם לצרכים שלנו

תזוזה קדימה אחורהתזוזה קדימה אחורה נחשב ווקטור בין מיקום המצלמה נחשב ווקטור בין מיקום המצלמהeyeeye לבין לבין centercenter directiondirectionתזוזה קדימה תתבצע בכיוון של הווקטור הנ"לתזוזה קדימה תתבצע בכיוון של הווקטור הנ"לeye+directioneye+direction יקדם את יקדם אתeyeeye בכיוון של בכיוון של directiondirectioncenter+directioncenter+direction יקדם את יקדם את centercenter בכיוון של בכיוון של directiondirection אם נכפיל את אם נכפיל אתdirectiondirectionבגודל כלשהו נקבל התקדמות מהירה יותר בגודל כלשהו נקבל התקדמות מהירה יותר אם נכפיל את אם נכפיל אתdirectiondirectionבמספר שלילי נקבל התקדמות אחורה במספר שלילי נקבל התקדמות אחורה

Page 20: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

202004/18/2304/18/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 שליטה על הזויות תיתן לנו שליטה על מיקום המצלמה מסביב שליטה על הזויות תיתן לנו שליטה על מיקום המצלמה מסביב

לאובייקטלאובייקט

Page 21: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

212104/18/2304/18/23

OpenGLOpenGL

OpenGLOpenGLהמצלמההמצלמה

מבט של המצלמה מסביבמבט של המצלמה מסביב ממש כמו מקודם יש לנו שתי זוויות אחת עם ציר ממש כמו מקודם יש לנו שתי זוויות אחת עם צירYY ואחת עם ואחת עם

XX ββ ו ו ααבהתאמה בהתאמה הפעם מיקום ה הפעם מיקום הeyeeye ומיקום ה ומיקום ה centercenterהתחלף התחלף עכשיו בראשית יושב ה עכשיו בראשית יושב הeyeeye-וה- וה centercenter יושב היכן שהמצלמה יושב היכן שהמצלמה

מסתכלתמסתכלת ע"י שינוי הזוויות אפשר לשלוט על מבט המצלמה ע"י שינוי הזוויות אפשר לשלוט על מבט המצלמה

Page 22: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

222204/18/2304/18/23

OpenGLOpenGL

OpenGLOpenGLהמצלמההמצלמה

לא לשכוח להחזיר את המצלמה למקום שלהלא לשכוח להחזיר את המצלמה למקום שלהבחישוב שלנו אנחנו משתמשים בווקטורים,ווקטורים יוצאים בחישוב שלנו אנחנו משתמשים בווקטורים,ווקטורים יוצאים

נמצא חישבנו אותו נמצא חישבנו אותו centercenterמהראשית,לכן אחרי שחישבנו היכן מהראשית,לכן אחרי שחישבנו היכן כלומר לחבר בין כלומר לחבר בין eyeeyeיחסית לראשית וצריך למקום אותו יחסית ל יחסית לראשית וצריך למקום אותו יחסית ל

שניהםשניהם

eye

center

up ββ

αα

Page 23: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

232304/18/2304/18/23

OpenGLOpenGL

OpenGLOpenGLהמצלמההמצלמה

תנועה חלקהתנועה חלקה לחיצה על החצים במקלדת תגרום למצלמה להמשיך ישר כל הזמן עד לחיצה על החצים במקלדת תגרום למצלמה להמשיך ישר כל הזמן עד

לשיחרור המקש לשיחרור המקש ע"מ לשלב לחיצה על כמה מקשים במקביל נבצע כמה דבריםע"מ לשלב לחיצה על כמה מקשים במקביל נבצע כמה דברים

)move)amount(move)amountבהנחה שיש לנו פונקצית תזוזת מצלמה בהנחה שיש לנו פונקצית תזוזת מצלמה

)rotate)r_amount(rotate)r_amountבהנחה שיש לנו פונקציית סיבוב מצלמה בהנחה שיש לנו פונקציית סיבוב מצלמה

ולא ולא displaydisplayקריאה לפונקציות הנ"ל תתבצע בפונקציית ה קריאה לפונקציות הנ"ל תתבצע בפונקציית ה בפונקציית המקלדת, הקריאה תתבצע רק אם יש תזוזה במצלמהבפונקציית המקלדת, הקריאה תתבצע רק אם יש תזוזה במצלמה

ישונו לפי לחיצה על מקשי ישונו לפי לחיצה על מקשי r_amountr_amount ו ו amountamountהערכים הערכים המקלדתהמקלדת

הערכים יאופסו ברגע ששיחררנו את מקשי המקלדתהערכים יאופסו ברגע ששיחררנו את מקשי המקלדת

Page 24: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

242404/18/2304/18/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;;

..

..

..}}

}}

Page 25: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

252504/18/2304/18/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;

}}

}}

Page 26: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

262604/18/2304/18/23

OpenGLOpenGL

אור וצבעאור וצבעמראה האובייקט תלוי בכמה דבריםמראה האובייקט תלוי בכמה דבריםסוג פני השטח של האובייקטסוג פני השטח של האובייקט

מחוספס ,חלק ,משטח מראה וכו,מחוספס ,חלק ,משטח מראה וכו,מיקום האור וסוגומיקום האור וסוגו

יחסית לעיןיחסית לעיןמיקום העיןמיקום העין

יחסית לאוריחסית לאור

Page 27: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

272704/18/2304/18/23

OpenGLOpenGL

אור וצבעאור וצבעשלושה סוגי אורשלושה סוגי אור

AmbientAmbient אור אחיד...האור המוחזר מכל עצם ומגיע מכל מקום בצורה אור אחיד...האור המוחזר מכל עצם ומגיע מכל מקום בצורה

אחידה.אחידה.

DiffuseDiffuse הבהירות של העצם )בכל נקודה( ביחס למקור האור. )מחושב הבהירות של העצם )בכל נקודה( ביחס למקור האור. )מחושב

לפי הזווית בין קרן האור לבין הנורמל לנקודה(לפי הזווית בין קרן האור לבין הנורמל לנקודה(

SpecularSpecular הברק של העצם ביחס למקור האור )מחושב לפי הזווית בין קרן הברק של העצם ביחס למקור האור )מחושב לפי הזווית בין קרן

האור לבין הנורמל לנקודה(האור לבין הנורמל לנקודה(

Page 28: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

282804/18/2304/18/23

OpenGLOpenGL

אור וצבעאור וצבע-ע"מ להגדיר אור ב-ע"מ להגדיר אור בOpenGLOpenGL:צריך להגדיר: צריך להגדיר מיקום האורמיקום האורסוג החומר של העצםסוג החומר של העצםהנורמלים של הקודקודיםהנורמלים של הקודקודיםוכמובן צריך להודיע לוכמובן צריך להודיע לOpenGLOpenGL-- שאנחנו נשתמש שאנחנו נשתמש

באורבאורgl.glEnable)gl.glEnable)GL_LIGHTINGGL_LIGHTING((

Page 29: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

292904/18/2304/18/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

Page 30: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

303004/18/2304/18/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(;

}

Page 31: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

313104/18/2304/18/23

OpenGLOpenGL

אוראור:סוגי האור:סוגי האור

אור קבועאור קבוע

אור הנע מסביב לאובייקטאור הנע מסביב לאובייקט

אור הנע עם המצלמהאור הנע עם המצלמה

Page 32: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

323204/18/2304/18/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.

Page 33: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

333304/18/2304/18/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.

Page 34: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

343404/18/2304/18/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.

Page 35: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

353504/18/2304/18/23

OpenGLOpenGL

אוראורהגדרת חומרים הגדרת חומרים

כדי לדעת את כמות האור המוחזר כדי לדעת את כמות האור המוחזרמהאובייקט עלינו להגדיר גם מאיזה מהאובייקט עלינו להגדיר גם מאיזה

סוג חומר הואסוג חומר הוא הגדרת חומרים נעשית דומה מאוד הגדרת חומרים נעשית דומה מאוד

להגדרת אורלהגדרת אור

Page 36: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

363604/18/2304/18/23

OpenGLOpenGL

אוראורהגדרת חומריםהגדרת חומרים

הגדרת חומר מוחלת על כל הגדרת חומר מוחלת על כלהאובייקטים המצויירים עד אשר משנים האובייקטים המצויירים עד אשר משנים

את ההגדרהאת ההגדרהנשתמש בפונקציהנשתמש בפונקציה

gl.gl.glMaterialfv(GL_FRONT, p_name, p)glMaterialfv(GL_FRONT, p_name, p);;

Page 37: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

373704/18/2304/18/23

OpenGLOpenGL

אוראורהגדרת חומריםהגדרת חומרים

כפי שראינו בהרצאה כל חומר מחזיר את כפי שראינו בהרצאה כל חומר מחזיר אתשלושת הסוגים של האור לכן גם כאן נגדיר שלושת הסוגים של האור לכן גם כאן נגדיר

את שלושת הסוגיםאת שלושת הסוגיםAmbientAmbient ו ו diffusediffuse בדרך כלל הם אותו צבע בדרך כלל הם אותו צבע SpecularSpecular מוגדר בדרך כלל בגוון של אפור מוגדר בדרך כלל בגוון של אפור

)מתכתי()מתכתי(

Page 38: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

383804/18/2304/18/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( ;

Page 39: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

393904/18/2304/18/23

OpenGLOpenGL

אוראורהגדרת חומריםהגדרת חומרים

GL_FRONTGL_FRONT אומר בעצם להגדיר את הפוליגונים רק בצד אומר בעצם להגדיר את הפוליגונים רק בצד הקידמי שלהםהקידמי שלהם

איך נדע מה הצד הקידמי ומה הצד האחורי? נגדיראיך נדע מה הצד הקידמי ומה הצד האחורי? נגדירgl.gl.glFrontFaceglFrontFace)GLenum mode()GLenum mode(קובע איך יוגדרו הצדדים קובע איך יוגדרו הצדדים

CCWCCW נגד כיוון השעון -נגד כיוון השעון-GL.GL_CCWGL.GL_CCW

CWCW עם כיוון השעון –עם כיוון השעון– GL.GL_CWGL.GL_CW אחרי ההגדרה הזאת סדר הכנסת הקודקודים קובע את הפנים אחרי ההגדרה הזאת סדר הכנסת הקודקודים קובע את הפנים

והאחורוהאחור

Page 40: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

404004/18/2304/18/23

OpenGLOpenGL

אוראורהגדרת חומריםהגדרת חומרים

v1

v2v3

v1

v3v2

CounterClockWiseClockWise

Page 41: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

414104/18/2304/18/23

OpenGLOpenGL

אוראורנורמליםנורמלים

כדי לגעת איך האור מוחזר עלינו לדעת כדי לגעת איך האור מוחזר עלינו לדעתאת מיקום האובייקט יחסית לאור לכן את מיקום האובייקט יחסית לאור לכן

נצטרך להגדיר נורמל לכל קודקוד נצטרך להגדיר נורמל לכל קודקוד שאנחנו מגדיריםשאנחנו מגדירים

הגדרת נורמל מתבצעת בעזרתהגדרת נורמל מתבצעת בעזרתglNormal3f(x, y, z);glNormal3f(x, y, z);

Page 42: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

424204/18/2304/18/23

OpenGLOpenGL

אוראורנורמליםנורמלים

הגדרת הנורמלים נעשית בעת הגדרת הגדרת הנורמלים נעשית בעת הגדרתהאובייקטהאובייקט

-לפני שנקרא ל-לפני שנקרא לgl.glVertex3fgl.glVertex3f-נקרא ל- נקרא ל gl.glNormal3fgl.glNormal3f והקודקוד שיבוא אחריו יקבל את הנורמלוהקודקוד שיבוא אחריו יקבל את הנורמל

נורמל צריך להיות ווקטור היחידה לכן או נורמל צריך להיות ווקטור היחידה לכן או openGLopenGLשננרמל אותו לפני כן או שנגדיר ל שננרמל אותו לפני כן או שנגדיר ל

לנרמל את הווקטורים אוטומטית ע"י לנרמל את הווקטורים אוטומטית ע"י gl.gl.glEnable)GL.GL_NORMALIZE(;glEnable)GL.GL_NORMALIZE(;

Page 43: 6/12/20151jogl נכתב ע"י משה חדד. 26/12/2015 Previously,on CG… מעבר מקורדינטות עולם לקורדינטות מבט מעבר מקורדינטות עולם

434304/18/2304/18/23

שאלות?שאלות?