0% found this document useful (0 votes)
1 views

07_Graphical Input (Updated)

The document outlines the fundamentals of input devices in computer graphics, focusing on physical and logical properties, input modes, and event-driven input using GLUT. It discusses various input devices, their functionalities, and how to implement interactive programs with callbacks for mouse and keyboard events. Additionally, it covers techniques like double buffering for smooth animations and the creation of menus in GLUT.

Uploaded by

m.almohammed256
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1 views

07_Graphical Input (Updated)

The document outlines the fundamentals of input devices in computer graphics, focusing on physical and logical properties, input modes, and event-driven input using GLUT. It discusses various input devices, their functionalities, and how to implement interactive programs with callbacks for mouse and keyboard events. Additionally, it covers techniques like double buffering for smooth animations and the creation of menus in GLUT.

Uploaded by

m.almohammed256
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 36

Graphical

6.53
Input
Computer Graphics
CPIT285
OBJECTIVES
⮚Introduce the basic input devices
Physical Devices
Logical Devices
Input Modes
⮚Event-driven input
⮚Introduce double buffering for smooth animations
⮚Programming event input with GLUT
⮚Learn to build interactive programs using GLUT callbacks
Mouse
Keyboard
Reshape
⮚Introduce menus in GLUT

2
PROJECT SKETCHPAD

Ivan Sutherland (MIT 1963) established the basic interactive paradigm that
characterizes interactive computer graphics:

• User sees an object on the display

• User points to (picks) the object with an input device (light pen, mouse, trackball)

• Object changes (moves, rotates, morphs)

• Repeat

Angel: Interactive Computer Graphics 5E © Addison- 3


Wesley 2009
GRAPHICAL INPUT
⮚Devices can be described either by
- Physical properties
Mouse
Keyboard
Trackball
- Logical Properties
What is returned to program via API
A position
An object identifier
- Modes
How and when input is obtained
Request or event

Angel: Interactive Computer Graphics 5E © Addison- 4


Wesley 2009
PHYSICAL DEVICES

mous
trackbal light
e
l pen

data joystick space


tablet ball
5
INCREMENTAL (RELATIVE) DEVICES

Devices such as the data tablet return a position directly to the


operating system
Devices such as the mouse, trackball, and joystick return incremental
inputs (or velocities) to the operating system
Must integrate these inputs to obtain an absolute position
Rotation of cylinders in mouse
Roll of trackball
- Difficult to obtain absolute position
- Can get variable sensitivity

Angel: Interactive Computer Graphics 5E © Addison- 6


Wesley 2009
LOGICAL DEVICES

Consider the C and C++ code


C++: cin >> x;
C: scanf (“%d”, &x);

What is the input device?


Can’t tell from the code
Could be keyboard, file, output from another program
The code provides logical input
A number (an int) is returned to the program regardless of the physical device

Angel: Interactive Computer Graphics 5E © Addison- 7


Wesley 2009
GRAPHICAL LOGICAL DEVICES

Graphical input is more varied than input to standard programs which is usually numbers,
characters, or bits
⮚Two older APIs (GKS, PHIGS) defined six types of logical input
Locator: return a position
Pick: return ID of an object
Keyboard: return strings of characters
Stroke: return array of positions
Valuator: return floating point number
Choice: return one of n items

Angel: Interactive Computer Graphics 5E © Addison- 8


Wesley 2009
X WINDOW INPUT

The X Window System introduced a client-server model for a network of workstations


Client: OpenGL program
Graphics Server: bitmap display with a pointing device and a keyboard

9
INPUT MODES

Input devices contain a trigger which can be used to send a signal to the operating system
Button on mouse
Pressing or releasing a key

When triggered, input devices return information (their measure) to the system
Mouse returns position information
Keyboard returns ASCII code

Angel: Interactive Computer Graphics 5E © Addison- 10


Wesley 2009
REQUEST MODE

Input provided to program only when user triggers the device


Typical of keyboard input
Can erase (backspace), edit, correct until enter (return) key (the trigger) is depressed

Angel: Interactive Computer Graphics 5E © Addison- 11


Wesley 2009
EVENT MODE

Most systems have more than one input device, each of which can be triggered at
an arbitrary time by a user
Each trigger generates an event whose measure is put in an event queue which can
be examined by the user program

Angel: Interactive Computer Graphics 5E © Addison- 12


Wesley 2009
EVENT TYPES

Window: resize, expose, iconify


Mouse: click one or more buttons
Motion: move mouse
Keyboard: press or release a key
⮚Idle: nonevent: Define what should be done if no other event is in queue

Angel: Interactive Computer Graphics 5E © Addison- 13


Wesley 2009
CALLBACKS

Programming interface for event-driven input


Define a callback function for each type of event the graphics system recognizes
This user-supplied function is executed when the event occurs
GLUT example: glutMouseFunc(mymouse)

mouse callback
function

Angel: Interactive Computer Graphics 5E © Addison- 14


Wesley 2009
GLUT CALLBACKS
GLUT recognizes a subset of the events recognized by any particular window system
(Windows, X, Macintosh)
glutDisplayFunc
glutMouseFunc
glutReshapeFunc
glutKeyboardFunc
glutIdleFunc
glutMotionFunc, glutPassiveMotionFunc

Angel: Interactive Computer Graphics 5E © Addison- 15


Wesley 2009
GLUT EVENT LOOP

Recall that the last line in main.c for a program using GLUT must be
glutMainLoop();

which puts the program in an infinite event loop


In each pass through the event loop, GLUT
▪ looks at the events in the queue
▪ for each event in the queue, GLUT executes the appropriate callback function if one is
defined
▪ if no callback is defined for the event, the event is ignored

Angel: Interactive Computer Graphics 5E © Addison- 16


Wesley 2009
THE DISPLAY CALLBACK

The display callback is executed whenever GLUT determines that the


window should be refreshed, for example
When the window is first opened
When the window is reshaped
When a window is exposed
When the user program decides it wants to change the display
In main.c
glutDisplayFunc(mydisplay) identifies the function to be executed
Every GLUT program must have a display callback

Angel: Interactive Computer Graphics 5E © Addison- 17


Wesley 2009
POSTING REDISPLAYS

Many events may invoke the display callback function


⮚That can lead to multiple executions of the display callback on a single pass through the event loop

We can avoid this problem by using glutPostRedisplay(); instead, which sets a


flag.

GLUT checks to see if the flag is set at the end of the event loop.
⮚ If sets then the display callback function is executed

Angel: Interactive Computer Graphics 5E © Addison- 18


Wesley 2009
DOUBLE BUFFERING
Instead of one-color buffer, we use two
Front Buffer: one that is displayed but not written to
Back Buffer: one that is written to but not displayed
Program then requests a double buffer in main.c
glutInitDisplayMode(GL_RGB | GL_DOUBLE)
At the end of the display callback buffers are swapped
void mydisplay()
{
glClear(GL_COLOR_BUFFER_BIT|….)
.
/* draw graphics here */
.
glutSwapBuffers()
}
Angel: Interactive Computer Graphics 5E © Addison- 20
Wesley 2009
USING THE IDLE CALLBACK
The idle callback is executed whenever there are no events in the event queue
glutIdleFunc(myidle)
Useful for animations

void myidle() {
/* change something */
t += dt
glutPostRedisplay();
}

Void mydisplay() {
glClear();
/* draw something that depends on t */
glutSwapBuffers();
}

Angel: Interactive Computer Graphics 5E © Addison- 21


Wesley 2009
USING GLOBALS

The form of all GLUT callbacks is fixed


void mydisplay()
void mymouse(GLint button, GLint state, GLint x, GLint y)

Must use globals to pass information to callbacks

float t; /*global */

void mydisplay()
{
/* draw something that depends on t
}

Angel: Interactive Computer Graphics 5E © Addison- 22


Wesley 2009
THE MOUSE CALLBACK

glutMouseFunc(mymouse)
void mymouse(GLint button, GLint state, GLint x, GLint y)
Returns
which button (GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON)
caused event
state of that button (GLUT_UP, GLUT_DOWN)
Position in window

Angel: Interactive Computer Graphics 5E © Addison- 23


Wesley 2009
POSITIONING
• The position in the screen window is usually measured in pixels with the origin
at the top-left corner
• Consequence of refresh done from top to bottom
• OpenGL uses a world coordinate system with origin at the bottom left
• Must invert y coordinate returned by callback by height of window
• y = h – y;

(0,0)
h

24
OBTAINING THE WINDOW SIZE

To invert the y position, we need the window height


Height can change during program execution
Track with a global variable
New height returned to reshape callback that we will look at in detail soon
Can also use query functions

glGetIntv
glGetFloatv

to obtain any value that is part of the state

Angel: Interactive Computer Graphics 5E © Addison- 25


Wesley 2009
TERMINATING A PROGRAM

In our original programs, there was no way to terminate them through OpenGL
We can use the simple mouse callback

void mouse(int btn, int state, int x, int y)


{
if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
exit(0);
}

Angel: Interactive Computer Graphics 5E © Addison- 26


Wesley 2009
USING THE MOUSE POSITION

In the next example, we draw a small square at the location of the mouse each time the left
mouse button is clicked

This example does not use the display callback but one is required by GLUT; We can use the
empty display callback function
mydisplay(){}

Angel: Interactive Computer Graphics 5E © Addison- 27


Wesley 2009
DRAWING SQUARES AT CURSOR LOCATION
void mymouse(int btn, int state, int x, int y)
{
if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
exit(0);
if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
drawSquare(x, y);
}
void drawSquare(int x, int y)
{
y=w-y; /* invert y position */
glColor3ub( (char) rand()%256, (char) rand )%256, (char) rand()%256); /* a random
color */
glBegin(GL_POLYGON);
glVertex2f(x+size, y+size);
glVertex2f(x-size, y+size);
glVertex2f(x-size, y-size);
glVertex2f(x+size, y-size);
glEnd();
} Angel: Interactive Computer Graphics 5E © Addison- 28
Wesley 2009
USING THE MOTION CALLBACK

We can draw squares (or anything else) continuously as long as a mouse button is
depressed by using the motion callback
glutMotionFunc(drawSquare)

We can draw squares without depressing a button using the passive motion callback
glutPassiveMotionFunc(drawSquare)

Angel: Interactive Computer Graphics 5E © Addison- 29


Wesley 2009
USING THE KEYBOARD

glutKeyboardFunc(mykey)
void mykey(unsigned char key,
int x, int y)
Returns ASCII code of key depressed and mouse location

void mykey()
{
if(key == ‘Q’ | key == ‘q’)
exit(0);
}

Angel: Interactive Computer Graphics 5E © Addison- 30


Wesley 2009
SPECIAL AND MODIFIER KEYS

GLUT defines the special keys in glut.h


Function key 1: GLUT_KEY_F1
Up arrow key: GLUT_KEY_UP
⮚if(key == ‘GLUT_KEY_F1’ ……
Can also check of one of the modifiers
⮚GLUT_ACTIVE_SHIFT
⮚GLUT_ACTIVE_CTRL
⮚GLUT_ACTIVE_ALT
is depressed by
⮚ glutGetModifiers()
Allows emulation of three-button mouse with one- or two-button mice

Angel: Interactive Computer Graphics 5E © Addison- 31


Wesley 2009
TOOLKITS AND WIDGETS

Most window systems provide a toolkit or library of functions for building user
interfaces that use special types of windows called widgets
Widget sets include tools such as
Menus
Slide bars
Dials
Input boxes

But toolkits tend to be platform dependent


GLUT provides a few widgets including menus

Angel: Interactive Computer Graphics 5E © Addison- 32


Wesley 2009
MENUS
GLUT supports pop-up menus
A menu can have submenus

Three steps
• Define entries for the menu
• Define action for each menu item
• Action carried out if entry selected
• Attach menu to a mouse button

33
DEFINING A SIMPLE MENU

⮚In main.c
menu_id = glutCreateMenu(mymenu);
glutAddmenuEntry(“clear Screen”, 1);

gluAddMenuEntry(“exit”, 2);
clear
glutAttachMenu(GLUT_RIGHT_BUTTON); screen
exi
t

entries that appear when


identifiers
right button depressed

34
MENU ACTIONS
Menu callback

void mymenu(int id)


{
if(id == 1) glClear();
if(id == 2) exit(0);
}
Note each menu has an id that is returned when it is created
Add submenus by
glutAddSubMenu(char *submenu_name, submenu id)

entry in parent
menu

35
OTHER FUNCTIONS IN GLUT

Dynamic Windows
- Create and destroy during execution
Subwindows
Multiple Windows
Changing callbacks during execution
Timers
Portable fonts
glutBitmapCharacter
glutStrokeCharacter

36
THANK YOU

You might also like