Problems S01x

rodscarletSoftware and s/w Development

Dec 14, 2013 (3 years and 10 months ago)

107 views

COS 397 Computer Graphics

Assoc. Prof.
Svetla

Boytcheva

AUBG
• 201
3

COS 397 Computer Graphics

Practical Session
№1

Introduction to

OpenGL, GLFW and CG

Outline

Task 1
:

CodeBlock
, GLFW

&

OpenGL testing


Task 2
:

Full Screen mode


Task 3
:

Graphical Application Structure


Task
4:

Alternative Structure of Graphical Application

Task
5:

OpneGL

primitives


points, lines,


triangles, squares, polygons

Task
6:

Cube vertices

Task
7:

Cube edges

Task
8:

Cube Size Parameterization

Task
9:

Concentric Cubes

Task
10:

Cube Center
Parameterization



Learning Outcomes


Introduction to OpenGL

(1.
x) in level to
design and implement simple 3D

animations


Implementation of simple CG algorithms

Required software


OpenGL, GLU, GLFW, GCC



Code::Blocks


Information
about OpenGL 1.x

http://www.opengl.org/registry/

http://www.glprogramming.com/red
/


Alternative software


MESA,
FreeGLUT
, GLUT, Notepad, C
compiler

Software

Task

1

CodeBlock
, GLFW

&

OpenGL
Testing

Let’s Begin:


Code::Blocks



GNU GCC Compiler


GLFW
2.7.7 32
-
bit

Task

1

Create New project


File → New → Project → GLFW Project

Settings


Choose project name and browse for location


Browse to select the folder where is GLFW library
stored

Hint


Code::Blocks


should explicitly “know”
where is GLFW 2.7 library

Result


Automatically generated GLFW project


Build and Run

Project Result

Task

2 Full Screen mode

GLFW functions


GLFW Reference Manual

http://www.glfw.org/GLFWUsersGuide277.pdf

sections

3.1.1, 3.1.2 и 3.2.1


Changes in
glfwOpenWindow
()



Parameter

GLFW_FULLSCREEN


Task

3
:


Graphical
Application Structure


Minimal Skeleton of GLFW

code

#include <GL/
glfw.h
>


int

main()

{



glfwInit
();


glfwOpenWindow
(512,512,0,0,0,0,0,0,GLFW_WINDOW)
;



while(…)



{


//Using OpenGL, GLU, GLFW functions



}



glfwTerminate
();



return 0;

}


Graphical Application
Structure

Structure
of
GLFW Application


GLFW Initialization


OpenGL

window opening


Animation frame (scene) generation


Termination

Graphical Application
Structure

Animation frame (scene) generation


Buffers Cleaning


Projection Type Setting


View Point Setting


Drawing a frame in the hidden buffer


Swapping the hidden buffer with the visible
one

Task


Identify these elements in generated source
code in Task 1


Alternative
Structure of

Minimal
GLFW
Application


Proposed in
GLFW Reference
Manual

Task

4 Alternative Structure of
Graphical
Application


Define the following functions:


bool

running
()


to test whether to
continue running


void
init
()


to initialize the graphical
window, to set perspective, to set point of
view and etc.


void
finit
()


to close the graphical window
and to terminate the process

Alternative Structure
of Minimal
GLFW
Application

#include <GL/
glfw.h
>


bool

running
() { // definition }

void
init
() { // definition }

void
finit
() { // definition }


int

main()

{


init
();
// Initialization



while( running()
)

// Testing


{


glClear
( GL_COLOR_BUFFER_BIT );


glRotatef
( 0.1, 0.4,
-
0.2, 0.7);

// We will keep this rotation, because It will be necessary for other tasks



// single frame drawing

// <Write your code here ….>



glfwSwapBuffers
();


}



finit
();
// Termination


return 0;

}

Task 5:

OpenGL primitives


points, lines,
triangles
,
squares,
polygons

glBegin
(
GLenum

mode);

…. // list of vertices and colors

glEnd
();


Parameters

Mode
-

Specifies
the primitive or primitives that will be created from
vertices presented
between
glBegin

and the subsequent
glEnd
. Ten
symbolic constants are accepted:

GL_POINTS
,

GL_LINES
,

GL_LINE_STRIP
,

GL_LINE_LOOP
,

GL_TRIANGLES
,

GL_TRIANGLE_STRIP
,

GL_TRIANGLE_FAN
,

GL_QUADS
,

GL_QUAD_STRIP
,
and

GL_POLYGON
.


More readings:
http
://
www.opengl.org/sdk/docs/man2/xhtml/glBegin.xml


Vertices

2D

void
glVertex2i(
GLint

x,
GLint

y
);

void
glVertex2f(
GLfloat

x,
GLfloat

y
);


3D

void glVertex3i(
GLint

x,
GLint

y,
GLint

z
);

void
glVertex3f(
GLfloat

x,
GLfloat

y,
GLfloat

z);








I hope that you have no eye

problem and will be able to see the
result on the screen without magnifier


Color

//integer values in range [0;255]

void
glColor3i(
GLint

red,
GLint

green,
GLint

blue
);


//floating point values in range [0.0; 1.0]

void
glColor3f(
GLfloat

red,
GLfloat

green,
GLfloat

blue);

2D Points

glBegin
(
GL_POINTS
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd
();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

2D Lines

glBegin(
GL_LINES
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

Line Strip

glBegin(
GL_LINE_STRIP
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

2D Line Loop

glBegin(
GL_LINE_LOOP
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

2D Polygon

glBegin(
GL_POLYGON
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

OpenGL only supports
convex polygons

(and really only triangles)

2D Quads

glBegin
(
GL_QUADS
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd
();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

2D Quads

glBegin
(
GL_QUADS
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);




glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);





glEnd
();


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

2D Quads

glBegin
(
GL_QUADS
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);

glEnd
();

(
-
1,1)

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

Lines should
never

pass through a vertex.

2D Triangles

glBegin(
GL_TRIANGLES
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

2D Triangles

glBegin(
GL_TRIANGLES
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.2,.6);


glVertex2f(.6,1.);


glVertex2f(
-
.2,.6);


glVertex2f(.2,.6);


glVertex2f(.6,1.);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);




glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

Lines should
never

pass through a vertex.

2D Triangle Strip

glBegin(
GL_TRIANGLE_STRIP
);


glVertex2f(
-
.6,1.);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(
-
.6,
-
.6);


glVertex2f(
-
.6,
-
1.);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.2,.6);


glVertex2f(.6,.6);


glVertex2f(.6,1.);

glEnd();

(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

2D Triangle Strip

glBegin(
GL_TRIANGLE_STRIP
);


glVertex2f(
-
.6,1.);


glVertex2f(.6,1.);


glVertex2f(
-
.2,.6);


glVertex2f(.2,.6);


glVertex2f(
-
.2,
-
.6);


glVertex2f(.2,
-
.6);


glVertex2f(.6,
-
1.);


glVertex2f(.6,
-
.6);

glEnd();



(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

First two vertices prime the pump,

then every new vertex creates a triangle

connecting it to the previous two vertices

2D Triangle Fan

glBegin(
GL_TRIANGLE_FAN
);


glVertex2f(
-
.2,.6);


glVertex2f(
-
.6,.6);


glVertex2f(
-
.6,1.);


glVertex2f(.6,1.);


glVertex2f(.2,.6);


glVertex2f(.2,
-
.6);


glVertex2f(
-
.2,
-
.6);

glEnd();



(
-
1,
-
1)

(1,
-
1)

(1,1)

(
-
1,1)

First two vertices prime the pump,

then every new vertex creates a triangle

connecting it to the previous vertex and

the first vertex

Assigning Color

glColor3f(0,0,1);


glBegin(GL_POLYGON);


glVertex2f(
-
1,1);


glVertex2f(
-
1,
-
1);


glVertex2f(1,
-
1);

glEnd();

glColor3f(1,0,0);

glBegin(GL_POLYGON);


glVertex2f(
-
1,1);


glVertex2f(
-
1,
-
1);


glVertex2f(1,
-
1);

glEnd();


glColor3f(0,0,0);

glBegin(GL_LINE_LOOP);


glVertex2f(
-
1,1);


glVertex2f(
-
1,
-
1);


glVertex2f(1,
-
1);

glEnd();


glBegin(GL_POLYGON);


glColor3f(0,1,0);


glVertex2f(
-
1,1);



glColor3f(0,0,1);


glVertex2f(
-
1,
-
1);



glColor3f(1,0,0);


glVertex2f(1,
-
1);

glEnd();

Paying with 3D coordinates:


Draw 8 vertices of a cube


Center point (0,0,0)


Cube size = 2




Task
6:Cube
vertices

Result

Task
7:Cube edges

Make some changes in Task 6 such that:


Draw cube edges


Each edge is drawn as separate line


Result

Task
7:Cube edges


v2

Make some changes in Task 7 such that:


Draws a connected group of line segments
from the first
vertex
to the last
,
then back to the first.

Task 8:

Cube Size Parameterization

Write function to


Draw a cube with size

а


In loop make a cube size to change
randomly in predefined ranges


Task
9:Concentric
Cubes

Draw Concentric Cubes


Use a loop to draw 10 cubes with the same
center point and different sizes

Result

Task
10:

Cube
Center Parameterization

Add new parameter to the function for
drawing a cube


Coordinates of the center point


Test this function by drawing 3 cubes next
to each other

Result

Task 10:

Cube Center
Parameterization
-

v2

Draw


Big size cube and next to each of its sides
10 smaller cubes with decreasing sizes

Result

Questions?