2d grafikus rendszerek

32
2D grafikus rendszerek 2D grafikus rendszerek Szirmay-Kalos László

Upload: kyra-burton

Post on 03-Jan-2016

24 views

Category:

Documents


0 download

DESCRIPTION

2D grafikus rendszerek. Szirmay-Kalos László. 2D grafikus editor: GUI, use-case, dinamikus modell. L. LD. L. LU. L. R. MouseLDown első pont MouseLDown második ... MouseLDown n. MouseRDown utolsó. MouseLDownpick? MouseMovemozgat MouseLUpletesz. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 2D grafikus rendszerek

2D grafikus rendszerek2D grafikus rendszerek

Szirmay-Kalos László

Page 2: 2D grafikus rendszerek

2D grafikus editor: 2D grafikus editor: GUI, use-case, dinamikus modellGUI, use-case, dinamikus modell

L

L

L

R

LD

LU

MouseLDown első pontMouseLDown második...MouseLDown n.MouseRDown utolsó

MouseLDown pick?MouseMove mozgatMouseLUp letesz

Page 3: 2D grafikus rendszerek

Funkcionális modellFunkcionális modell

Kép frissités

rasztertár Pixelműveletek

Raszteri-záció

VágásVilág-képtér

Modellezésitranszf.

Világ-lokális mod.

Képtér-világ

Eszköz-képtér

Virtuális világ

TV-1 TM

-1

TV TM

Kurzor(xp, yp)

Kimeneti csővezeték

Bemeneti csővezeték

Eszköz koord.(xe, ye)

kamera

vektorizáció

Page 4: 2D grafikus rendszerek

OsztOsztálydiagramálydiagramWindow

stateMouseLD()MouseLU()

MouseMov()PutPixel()

Camerawindowviewport

ClipWindow()ViewTransform()

Objecttransform

AddPrimitive()GetPrimitive()

Primitivecolor

AddPoint()Vectorize()

Pointx,y

PolylineVectorize()

Curver(t)

Vectorize()

PolygonVectorize()

RenderPrimitiveTransform()

Clip()Draw()

RPointsClip()

Draw()

RPolylineClip()

Draw()

RPolygonClip()

Draw()Bezier

r(t)B-Spline

r(t)

Sceneactobject

InputPipe()

Pick()Render()

tároló

tároló

táro

Op.rendszerfüggő

Controller +View

Colorfloat R, G, B

Rectx,y,w,h

Transformfloat m[3][3]

Page 5: 2D grafikus rendszerek

Kimeneti csővezeték: RenderKimeneti csővezeték: Render

Scene :: Render ( ) { Transform Tv = camera.ViewTransform( ); for each object obj { // prioritás

Transform Tm = obj -> Transform( );Transform Tc = Tm * Tv;for each primitive p of object obj { // prioritás RenderPrimitive * rp = p -> Vectorize( ); rp -> Transform( Tc ); if ( rp -> Clip( camera.ClipWindow ) ) rp -> Draw( );}

}}

Page 6: 2D grafikus rendszerek

Ablak-nézet transzformációAblak-nézet transzformációclass Camera {

Rect Viewport, Window;

Transform ViewTransform( ) {

Transform t =

return t; } Rect ClipWindow( ) { return Viewport; }};

(x, y)w

h

vw/ww 0 0

vh/wh 0

vx-wxvw/ww vy-wyvh/wh 1

Page 7: 2D grafikus rendszerek

VektorizációVektorizáció

class Curve : Primitive {

virtual Point r( float t ) = 0;

RenderPrimitive Vectorize( ) {RPolyLine * polyline = new RPolyLine();for(int i = 0; i <= NVECTOR; i++) { float t = (float)i / NVECTOR; polyline -> AddPoint( r( t ) );}return polyline;

}};

r(ti)

t1= 0, t2 , ... , tn =1

Page 8: 2D grafikus rendszerek

Bezier görbeBezier görbe: : r(t)r(t)

class Bezier : Curve {Point r( float t ) { Point rr(0, 0); int n = npoints – 1;

for(int i = 0; i < npoints; i++) { float Bi = 1; for(int j = 1; j <= i; j++) Bi *= (float)(n-j+1)/j;

Bi *= pow(t, i) * pow(1-t, n-i); rr += points[i] * Bi; } return rr; }};

Bi(t) = t i (1-t)n-i( )n

i

r(t) = Bi(t) ri

Page 9: 2D grafikus rendszerek

RenderPrimitiveRenderPrimitiveclass RenderPrimitive { Point * points; Color color; void Transform( Transform T ) {

for each point i do points[i].Transform( T ); } virtual Bool Clip( Rect cliprect ) = 0; virtual void Draw( ) = 0;};

class RPolyLine : public RenderPrimitive { Bool Clip( Rect cliprect ) { Cohen-Sutherland vágás } void Draw( ) { Szakaszrajzoló algoritmus: PutPixel(X, Y, color) }};class RPolygon : public RenderPrimitive { Bool Clip( Rect cliprect ) { Sutherland-Hodgeman vágás } void Draw( ) { Területkitöltő algoritmus: PutPixel(X, Y, color) }};

Page 10: 2D grafikus rendszerek

Bemeneti csővezeték: pontok Bemeneti csővezeték: pontok beépítése a virtuális világbabeépítése a virtuális világba

Scene :: InputPipeline( int X, int Y ) { if ( !actobject ) actobject = AddObject( ); Transform Tm = actobject -> Transform( ); Transform Tv = camera.ViewTransform( ); Transform Tci = (Tm * Tv).Invert( ); Point p = Point(X, Y).Transform( Tci ); actobject -> GetPrimitive( ) -> AddPoint(p);}

Window :: MouseLD( int X, int Y ) { ... ha az állapot szerint a pontot be kell építeni

scene.InputPipeline( X, Y );scene.Render(); // visszacsatolás

}

Page 11: 2D grafikus rendszerek

Primitív (objektum) kiválasztásaPrimitív (objektum) kiválasztásaScene :: Pick( int X, int Y ) { Rect pickw( X-5, Y-5, X+5, Y+5 ); fordown each object obj { // vissza prioritás

Transform Tm = obj -> Transform( );Transform Tv = camera.ViewTransform( );Transform Tc = Tm * Tv;fordown each primitive p of object obj { RenderPrimitive * rp = p -> Vectorize( ); rp -> Transform( Tc ); if ( rp -> Clip( pickw ) ) { actobj = obj; return; }}

}}

Window :: MouseLD( X, Y ) { ... ha az állapot szerint kiválasztás: scene.Pick( X, Y );}

Page 12: 2D grafikus rendszerek

OpenGL

OperOperációs rendszer illesztésációs rendszer illesztés

transzform Rasztertár

Operációsés ablakozó

rendszer(Windows)

vágás

MouseLD()MouseLU()MouseMov()

PutPixel()

Alkalmazás

raszterizáció

GLUT

Page 13: 2D grafikus rendszerek

GLUT/OpenGLGLUT/OpenGL

Rasztertár

Operációsés ablakozó

rendszer(Windows)

GLUT

OpenGLgrafikushardver

main

DisplayFunc

KeyboadFunc

IdleFunc

alkalmazás

SpecialFunc

ReshapeFunc

MouseFunc

MotionFunc

Ablak létrehozáscallback regisztráció

callback-ek

kimeneti csővezeték

Page 14: 2D grafikus rendszerek

OpenGL szintaxisOpenGL szintaxis

glVertex3dv( … )

Paraméterszám2 - (x, y)3 - (x, y, z), (R, G, B)4 - (x, y, z, h) (R, G, B, A)

Adattípus b - byteub - unsigned bytes - shorti - intf - floatd - double

Vektor vagy skalárv - vektor - skalár

gl könyvtár része

Page 15: 2D grafikus rendszerek

glX, wgl glu

Ablakozó – OpenGL – alkalmazás Ablakozó – OpenGL – alkalmazás elhelyezkedéseelhelyezkedése

hw

applikáció

gl

GLUT

X v. MS-Win

Ablak-kezeléswidgetek

Ablakozó-gl híd

Utility-k,tesszellátorok

Window menedzsment

Page 16: 2D grafikus rendszerek

OpenGL transzformációkOpenGL transzformációk (2D-s (2D-s utánérzés)utánérzés)

xy

z=0h=1

Modelviewmátrix

Projectionmátrix

Homogénosztás

Viewporttranszf.

képernyő

Normalizáltképernyő

-1,-1

1,1TVTM

vágás raszterizáció

Page 17: 2D grafikus rendszerek

OpenGL mOpenGL mátrixátrix OpenGL specifikáció:

Mi:

h

z

y

x

TTTT

TTTT

TTTT

TTTT

h

z

y

x

151173

141062

13951

12840

'

'

'

'

15141312

111098

7654

3210

''''

TTTT

TTTT

TTTT

TTTT

hzyxhzyx

Page 18: 2D grafikus rendszerek

OpenGL/ OpenGL/ GLUT GLUT

inicializálásinicializálás

#include <GL/gl.h>#include <GL/glu.h>#include <GL/glut.h> // download!!!main( int argc, char *argv[] ) { glutInitWindowSize(200, 200); glutInitWindowPosition(100, 100); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB ); glutCreateWindow("Sample Window");

// callback függvények glutKeyboardFunc( Keyboard ); glutDisplayFunc( ReDraw );

// transzformáció glViewport(0, 0, 200, 200); glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluOrtho2D(0., 100., 0., 100.);

// fő hurok glutMainLoop();}

ablak

(0,0)

(100,100)

(100,100)

200

200

Page 19: 2D grafikus rendszerek

Eseménykezelés és rajzolásEseménykezelés és rajzolásvoid ReDraw( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT);}

void Keyboard(unsigned char key, int x, int y) { if (key == ‘d’) {

glColor3d( 0.0, 1.0, 0.0 );glBegin(GL_TRIANGLES);

glVertex2d(10.0, 10.0);glVertex2d(20.0, 100.0);glVertex2d(90.0, 30.0);

glEnd( );glFlush( );

}}

(100,100)ablak

Ablak újrarajzoláskor elveszik!

(0,0)

(200,200)

Page 20: 2D grafikus rendszerek

A háromszög A háromszög újrarajzoláskor újrarajzoláskor

megmaradmegmarad

bool haromszog = false;

void ReDraw( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); if ( haromszog ) {

glColor3d( 0.0, 1.0, 0.0 ); glBegin(GL_TRIANGLES);

glVertex2d(10.0, 10.0); glVertex2d(20.0, 100.0); glVertex2d(90.0, 30.0);

glEnd( ); } glFlush( );}

void Keyboard(unsigned char key, int x, int y) { if (key == 'd') { haromszog = true; ReDraw( ); }}

Page 21: 2D grafikus rendszerek

Nem rajzol Nem rajzol feleslegesenfeleslegesen

sokszorsokszor

bool haromszog = false;

void ReDraw( ) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); if ( haromszog ) {

glColor3d( 0.0, 1.0, 0.0 ); glBegin(GL_TRIANGLES);

glVertex2d(10.0, 10.0); glVertex2d(20.0, 100.0); glVertex2d(90.0, 30.0);

glEnd( ); } glFlush( );}

void Keyboard(unsigned char key, int x, int y) { if (key == 'd') { haromszog = true;

glutPostRedisplay(); }}

Page 22: 2D grafikus rendszerek

2D grafikus editor GLUT/OpenGL-lel2D grafikus editor GLUT/OpenGL-lel

transzformvágás

raszterizációRaszter

műveletekRasztertár

RGB

Operációsés ablakozó

rendszer

GLUTmain

Redraw

MouseDown

MouseMove

DisplayFunc

MouseFunc

MotionFunc

OpenGL

Page 23: 2D grafikus rendszerek

OsztOsztálydiagramálydiagramWindow

stateMouseLD()MouseLU()

MouseMov()PutPixel()

Sceneactobject

InputPipe()Pick()

Render()

CameraClipWindow()

ViewTransform()windowviewport

Objecttransform

AddPrimitive()GetPrimitive()

Primitivecolor

AddPoint()Draw()

Pointx,y

PolylineDraw()

Curver(t)

Draw()

PolygonDraw()

RenderPrimitiveTransform()

Clip()Draw()

RPointListClip()

Draw()

RPolyLineClip()

Draw()

RPolygonClip()

Draw()Bezier

r(t)B-Spline

r(t)

Page 24: 2D grafikus rendszerek

GLUT: inicializálásGLUT: inicializálásmain(argc, argv) { glutInitWindowSize(200, 200); glutInitWindowPosition(100, 100); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB );

glutCreateWindow("2D graphics editor");

glutMouseFunc(MouseDown); // callback glutMotionFunc(MouseMove); glutDisplayFunc(ReDraw);

glutMainLoop(); // fő hurok}

Page 25: 2D grafikus rendszerek

GLUT: eseménykezelésGLUT: eseménykezelésvoid ReDraw( ) { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); window.scene.Render( );}

void MouseDown( int button, int state, int x, int y ) { if (button == GLUT_LEFT && state == GLUT_DOWN)

window.MouseLD(x, y); …}

void MouseMove( int x, int y ) { window.MouseMov(x, y);}

Page 26: 2D grafikus rendszerek

OpenGL RenderOpenGL RenderScene :: Render ( ) { glViewport(camera.viewport.Left(), camera.viewport.Bottom(),

camera.viewport.Width(), camera.viewport.Height());

glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluOrtho2D(camera.window.Left(), camera.window.Right(), camera.window.Bottom(), camera.window.Top()); glMatrixMode( GL_MODELVIEW ); for each object obj { glLoadIdentity(); // 4x4 matrix

glMultMatrixf(obj->Transform());

for each primitive p of object obj { p -> Draw( ); // OpenGL-nek}

}}

ux uy 0vx vy 0ox oy 1

ux uy 0 0vx vy 0 0

0 0 1 0

ox oy 0 1[x, y, 0, 1]

[x, y, 1]

Page 27: 2D grafikus rendszerek

Curve rajzolCurve rajzolás ás

class Curve : Primitive { void Draw( ) { glColor3d( color.R, color.G, color.B );

glBegin( GL_LINE_STRIP );for(int i = 0; i <= NVECTOR; i++) { float t = (float)i / NVECTOR;

Point p = r( t );glVertex2d(p.x, p.y);

}glEnd( );

}};

Page 28: 2D grafikus rendszerek

OpenGL: primitívekOpenGL: primitívek

GL_POINTSGL_LINES

GL_LINE_STRIP

GL_LINE_LOOP GL_POLYGON

GL_TRIANGLE_STRIP

GL_TRIANGLES

GL_TRIANGLE_FAN

GL_QUADS

GL_QUAD_STRIP

Page 29: 2D grafikus rendszerek

HHáziázi//================================================================================// Szamitogepes grafika hazi feladat keret. Ervenyes 2010-tol. // A //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// sorokon beluli reszben celszeru garazdalkodni, mert a tobbit ugyis toroljuk. // A Hazi feladat csak ebben a fajlban lehet. // Tilos:// - mast "beincludolni", illetve mas konyvtarat hasznalni// - faljmuveleteket vegezni (printf is fajlmuvelet!)// ---------------------------------------------------------// Csak az órán elhangzott gl/glu/glut fuggvenyek hasznalhatok: // glBegin, glVertex[2|3]f, glColor3f, glNormal3f, glTexCoord2f, glEnd, glDrawPixels// glViewport, glMatrixMode, glLoadIdentity, glMultMatrixf, gluOrtho2D, // glTranslatef, glRotatef, glScalef, gluLookAt, gluPerspective, // glPushMatrix,glPopMatrix,// glMaterialfv, glMaterialfv, glMaterialf, glLightfv// glGenTextures, glBindTexture, glTexParameteri, glTexImage2D, glTexEnvi, // glShadeModel, // glEnable/Disable a kovetkezokre: GL_LIGHT[0..7],// GL_LIGHTING, GL_NORMALIZE, GL_DEPTH_TEST, GL_CULL_FACE, GL_TEXTURE_2D, GL_BLEND,// // A házi feladat felesleges programsorokat NEM tartalmazhat! //================================================================================

Page 30: 2D grafikus rendszerek

HáziHázi

#include <math.h>#include <stdlib.h>#include <windows.h> #include <GL/gl.h>#include <GL/glu.h>#include <GL/glut.h> // A GLUT-ot le kell tolteni//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// Innentol modosithatod...// Nev : <VEZETEKNEV(EK)> <KERESZTNEV(EK)>, Neptun : <NEPTUN KOD>//--------------------------------------------------------void onInitialization( ) { } // Inicializacio, void onDisplay( ) {// Rajzolas glClearColor(0.1f, 0.2f, 0.3f, 1.0f); // torlesi szin beallitasa glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // kepernyo torles // ... glutSwapBuffers(); // Buffercsere: rajzolas vege}void onKeyboard(unsigned char key, int x, int y) { // Billentyuzet esemeny if (key == 'd') glutPostRedisplay( ); // d beture rajzold ujra a kepet}void onMouse(int button, int state, int x, int y) {// Eger esemeny if (button == GLUT_LEFT && state == GLUT_DOWN); }

void onIdle( ) {// `Idle' esemenykezelo, jelzi, hogy az ido telik long time = glutGet(GLUT_ELAPSED_TIME); // program inditasa ota eltelt ido

}// ...Idaig modosithatod//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Page 31: 2D grafikus rendszerek

Még mindigMég mindig h háziázi// A C++ program belepesi pontja, nem bántani!int main(int argc, char **argv) { glutInit(&argc, argv); // GLUT inicializalasa glutInitWindowSize(600, 600); glutInitWindowPosition(100, 100);

// 8 bites R,G,B,A + dupla buffer + melyseg buffer glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Grafika hazi feladat");

glMatrixMode(GL_MODELVIEW); // A MODELVIEW egysegmatrix glLoadIdentity(); glMatrixMode(GL_PROJECTION); // A PROJECTION egysegmatrix glLoadIdentity();

onInitialization(); // Az altalad irt inicializalas

glutDisplayFunc(onDisplay); // Esemenykezelok regisztralasa glutMouseFunc(onMouse); glutIdleFunc(onIdle); glutKeyboardFunc(onKeyboard); glutMainLoop(); // Esemenykezelo hurok return 0;}

Page 32: 2D grafikus rendszerek