330 likes | 688 Views
OpenGL & GLUT Mouse Interaction & Camera Control. Mouse events, Advanced camera control. George Georgiev. Telerik Corporation. www.telerik.com. Table of Contents. GLUT Mouse Interaction Mouse up/down events Passive motion Active motion OpenGL Camera Default transformation
E N D
OpenGL & GLUTMouse Interaction & Camera Control Mouse events, Advanced camera control George Georgiev Telerik Corporation www.telerik.com
Table of Contents • GLUT Mouse Interaction • Mouse up/down events • Passive motion • Active motion • OpenGL Camera • Default transformation • “Manual” control • Custom camera class
GLUT Mouse Interaction Mouse event callbacks
GLUT Mouse Interaction • GLUT provides mouse detection capabilities • Advantages • Multi-platform • Similar to other GLUT routines • Easy to code • Disadvantages • Doesn’t receive device information • No scroll information • Unstable ‘leave’ and ‘enter’ events
GLUT Mouse Interaction • Detecting mouse buttons • Registering callback function • glutMouseFunc(void(*func)(int button, int state, int x, int y)) • func –mouse button callback function • button – mouse button raising the event • state – type of event • x, y – cursor coordinates (from upper left corner)
GLUT Mouse Interaction • Detecting mouse buttons (2) • Callback parameter values • button • GLUT_LEFT_BUTTON • GLUT_MIDDLE_BUTTON • GLUT_RIGHT_BUTTON • state • GLUT_DOWN • GLUT_UP
GLUT Mouse Interaction • Detecting mouse buttons (2) • Callback parameter values • button • GLUT_LEFT_BUTTON • GLUT_MIDDLE_BUTTON • GLUT_RIGHT_BUTTON • state • GLUT_DOWN • GLUT_UP
GLUT Mouse Interaction • Detecting movement • Types • Passive • Mouse moves • No buttons pressed • Active • Mouse moves • One or more buttons pressed
GLUT Mouse Interaction • Passive motion • Registering callback function • glutPassiveMotionFunc(void(*func)(int x, int y)) • func – mouse passive motion callback • x, y – cursor coordinates (from upper left corner)
GLUT Mouse Interaction • Active motion • Registering callback function • glutMotionFunc(void(*func)(int x, int y)) • func – mouse active motion callback • x, y – cursor coordinates (from upper left corner)
GLUT Mouse Interaction • GLUT Mouse leave and entry routines • Detect when cursor leaves and enters window • Registering callback • glutEntryFunc(void(*func)(int state)) • Func – callback handling cursor leaving and entering window • State – enter or leave event • GLUT_ENTERED • GLUT_LEFT
GLUT Mouse Interaction • Cursor-related routines • glutWarpPointer (int x, int y) • Sends cursor to specified coordinates • glutSetCursor (int cursor) • Sets the cursor image (style) for the window • Values: • GLUT_CURSOR_NONE, GLUT_CURSOR_INFO, GLUT_CURSOR_DESTROY, etc… • Google for more (much, much more)
Mouse Interaction • Object-oriented mouse handling • Custom mouse class • Current cursor position • Last cursor position and/or drag-begin position • Current mouse button states • Last mouse button states • Cursor style • Anything else you can think of
Custom mouse class Live Demo
Mouse Interaction ? ? Questions? ? ? ? ? ? ? ? ? ?
OpenGL Camera Control Basic and Advanced camera positioning
OpenGL Camera Control • Default camera position • Set up with glLoadIdentity() • Centered at coordinate system center (0, 0, 0) • Rotation around all axes – zero (0, 0, 0) • Looks down the negative Z axis
OpenGL Camera Control • “Manual” control • Applying transformations to the world • Opposite those of the camera • Applied before rendering anything else • Why not use gluLookAt ? • Does the same things without asking you • Gives you less freedom • Future – transformations won’t be deprecated • gluLookAt most probably will
OpenGL Camera Control • “Manual” control (2) • Imagining it – three options • Positioning the ‘world’ • Opposite to the location and orientation of the ‘camera’ • Positioning the ‘camera’ away from the ‘world’ • Positioning the coordinate system of the ‘paintbrush’ • Either way, the result is the same
OpenGL Camera Control • “Manual” control (3) • The steps • Load default view • glLoadIdentity – not really camera-related • Move away • glTranslate* • Look away • glRotate* • Move on to lighting, drawing objects, etc…
OpenGL Camera control • Moving away • glTranslate* • Specifies a translation • Applies to any subsequently drawn geometry • You could imagine it moves the ‘paintbrush’ • Used for all object positioning (not just camera) • Say we want the camera at C(0, 0, 20) • glTranslatef(0, 0, -20)
OpenGL Camera control • Looking away • glRotate* • Specifies a rotation • Applies to any subsequently drawn geometry • You could imagine it turns the ‘paintbrush’ • Used for all object positioning (not just camera) • If we want the camera to look right 90 degrees • glRotatef (-90, 0, 1.0, 0)
OpenGL Camera control • Looking away (2) – explanation • glRotatef parameters • 1st parameter – degrees to rotate • 2nd, 3rd, 4th parameter – multiplier for resultant rotation on x, y, z axis respectively • Example: glRotatef (90, 0.5, 1.0, 0.0) = rotate by • 45 degrees round X • 90 degrees round Y • 0 degrees round Z
OpenGL Camera control • Looking away (3) – explanation • glRotatef positive rotations • Positive rotation round Y
OpenGL Camera control • Looking away (4) – explanation • glRotatef positive rotations • Positive rotation round X
OpenGL Camera control • Looking away (5) – explanation • glRotatef positive rotations • Positive rotation round Z
OpenGL Camera Control • Basic camera control • So far we can • Set the location of the camera • Set the orientation of the camera • Limit the rotation of the camera • Hard to do that with gluLookAt
OpenGL Camera Control • Advanced camera control • A good camera can • Move forward and backward • Strafe left and right • Move up and down • Look left and right • Look up and down • Tilt left and right • “LookAt”
OpenGL Camera Control • Custom camera class • Fields • Location, last location • Rotation (Euler angles), last rotation • Forward vector • Right vector • Upward vector • Speed? Maximum upward (x) rotation? Etc…
OpenGL Camera Control • Custom camera class • Methods • Set/Get location • Set/Get rotation • Move forward, backward, upward, downward • Strafe left, right • Look up, down, left, right • Tilt left, tilt right • “Look at”, “sweep left/right”, “fly to” ? Etc…
Custom camera class Live Demo
Mouse Interaction & Camera control ? ? Questions? ? ? ? ? ? ? ? ? ?