Presentation is loading. Please wait.

Presentation is loading. Please wait.

2002 by Jim X. Chen George Mason University Transformation and Viewing.1. Plane Example: J2_0_2DTransform.

Similar presentations


Presentation on theme: "2002 by Jim X. Chen George Mason University Transformation and Viewing.1. Plane Example: J2_0_2DTransform."— Presentation transcript:

1

2 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.1. Plane Example: J2_0_2DTransform

3 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.2. 2D TRANSFORMATIONS Translate We have: P’ P d x d y y x

4 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.3. Scale or

5 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.4. Rotate or P’ = RP x’ = rcos(  ); y’ = rsin(  ); x’ = r(cos  cos  – sin  sin  ); y’ = r(sin  cos  + cos  sin  ); r 

6 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.5. Homogeneous coordinates P’ = T+P; P’ = S*P; P’ = R*P; If points are expressed in homogeneous coordinates, all three transformations can be treated as multiplications. That is, P’ = T(d x,d y ) P That is, P’ = S (S x,S y ) P That is, P’ = R(  ) P

7 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.6. // Let’s say the current matrix on matrix[3][3] is M my2dLoadIdentity();// M<=I; my2dTranslatef(float dx, float dy); // M<=MT(dx, dy); my2dRotatef(  ); // M<= MR(  ); my2dScalef(float sx, float sy); // M<=MS(sx, sy); Example: J2_0_2DTransform Float M[3][3]; // Current Matrix multiply Implementation (my2dGL)

8 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.7. Combination of translations and transformation matrix  ' 22 '' 11 ',,,PddTPPddTp yxyx  p ''  Float matrix[3][3]; my2dLoadIdentity(); my2dTranslatef(dx2,dy2); my2dTranslatef(dx1,dy1); transDraw(p); // what is transDraw? transDraw(object); // vertices are transformed first // before rendering transDraw(float x, y) { mult(&x, &y, matrix); // (x, y) is transformed by the matrix Draw(x, y); }  2211,,ddTPddT yxyx p p’ p’’

9 Example: J2_0_2DTransform public void display(GLAutoDrawable drawable) { if (cnt 200) { flip = -flip; } cnt = cnt+flip; gl.glClear(GL.GL_COLOR_BUFFER_BIT); // white triangle is scaled gl.glColor3f(1, 1, 1); my2dLoadIdentity(); my2dScalef(cnt, cnt); transDrawTriangle(vdata[0], vdata[1], vdata[2]); // red triangle is rotated and scaled gl.glColor3f(1, 0, 0); my2dRotatef((float)cnt/15); transDrawTriangle(vdata[0], vdata[1], vdata[2]); // green triangle is translated, rotated, and scaled gl.glColor3f(0, 1, 0); my2dTranslatef((float)cnt/100, 0.0f); transDrawTriangle(vdata[0], vdata[1], vdata[2]); } Copyright @ 2002 by Jim X. Chen George Mason University

10 Transformation and Viewing.9. COMPOSITION OF 2D TRANSFORMATION To rotate about a point P1 1. Translate so that P1 is at the origin 2. Rotate 3. Translate so that the point returns to P1(x1, y1) T(x1, y1)R(  )T(-x1, -y1) 2D Examples Plane Lab Plane Lab x y o    B f C f A f Example J2_1_Clock2d

11 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.10. Example 1: draw a current time clock in 2D space h’=T(c)R(-  )T(-c)h drawHand(c, h’); y y y y x' 1 y' 1 1 1 0 x 0 0 1 y 0 0 0 1  cos  sin 0  sin–  cos 0 0 0 1 1 0 x 0 – 0 1 y 0 – 0 0 1 x 1 y 1 1 =

12 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.11. h’=T(c)R(-  )T(-c)h drawHand(c, h’); Float matrix[3][3]; my2dLoadIdentity(); my2dTranslatef(x0, y0); my2dRotatef(-  ); my2dTranslatef(-x0, -y0); transDraw(c, h); //transVertex(V, V1);

13 J2_1_Clock2d public void display(GLAutoDrawable glDrawable) { my2dLoadIdentity(); my2dTranslatef(c[0], c[1]); my2dRotatef(-hAngle); my2dTranslatef(-c[0], -c[1]); transDrawClock(c, h); } Copyright @ 2002 by Jim X. Chen George Mason University

14 Transformation and Viewing.13. Example 2: Reshape a rectangular area: T(P 2 )S(s x,s y )T(-P 1 )P After reshaping, the area and all the vertices (or models) in the area go through the same transformation Example: J2_2_Reshape

15 J2_2_Reshape: Mouse Copyright @ 2002 by Jim X. Chen George Mason University public class J2_2_ReshapePushPop extends J2_1_Clock2d implements MouseMotionListener { // the point to be dragged as the lowerleft corner private static float P1[] = {-WIDTH/4, -HEIGHT/4}; // the lowerleft and upperright corners of the rectangle private static float v0[] = {-WIDTH/4, -HEIGHT/4}; private static float v1[] = {WIDTH/4, HEIGHT/4}; // reshape scale value private float sx = 1, sy = 1; ……

16 J2_2_Reshape: Mouse Copyright @ 2002 by Jim X. Chen George Mason University public class J2_2_ReshapePushPop extends J2_1_Clock2d implements MouseMotionListener { …… // when mouse is dragged, a new lowerleft point and scale value for the rectangular area public void mouseDragged(MouseEvent e) { float wd1 = v1[0]-v0[0]; float ht1 = v1[1]-v0[1]; // The mouse location, new lowerleft corner P1[0] = e.getX()-WIDTH/2; P1[1] = HEIGHT/2-e.getY(); float wd2 = v1[0]-P1[0]; float ht2 = v1[1]-P1[1]; // scale value of the current rectangular area sx = wd2/wd1; sy = ht2/ht1; }

17 J2_2_Reshape: display Copyright @ 2002 by Jim X. Chen George Mason University public void display(GLAutoDrawable glDrawable) { // reshape according to the current scale my2dLoadIdentity(); my2dTranslatef(P1[0], P1[1]); my2dScalef(sx, sy); my2dTranslatef(-v0[0], -v0[1]); … }

18 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.17. Robot Arm Robot Arm Example 3: draw an arbitrary 2D robot arm: Example: J2_3_Robot2d

19 Copyright @ 2002 by Jim X. Chen George Mason University

20 y o A B C x y o  A f B’ C’ x y o    B f C f A f x y o   B f C ’ ’ A f Initial position: (A, B, C) Step 1 Step 2Step 3 Final position Method I: x Float matrix[3][3]; my2dLoadIdentity(); // Af=R(a)A; B1=R(a)B; C1=R(a)C; my2dRotatef(  ); transVertex(A, Af); transVertex(B, B1); transVertex(C, C1); Draw (O, Af); my2dLoadIdentity(); // M=T(Af)R(b)T(-Af); my2dTranslatev(Af); my2dRotatef(  ); my2dTranslatev(-Af); //Bf=MB1; C2=MC1 transVertex(B1, Bf); transVertex(C1, C2); Draw(Af, Bf); my2dLoadIdentity(); // M = T(Bf)R(g)T(-Bf); my2dTranslatev(Bf); my2dRotatef(  ); my2dTranslatev(-Bf); transVertex(C2, Cf); Draw(Bf, Cf);

21 C y o A B Step 1 x Copyright @ 2002 by Jim X. Chen George Mason University x y o  C’’ A B’ x y o  C’ A B Step 2 Method II:  A f = R(  )A; B f = R(  )B’ = R(  )T(A)R(  )T(-A)B; C f = R(  )C’’ = R(  )T(A)R(  )T(-A)T(B)R(  )T(-B)C. OpenGL doesn’t return the transformed positions Float matrix[3][3]; my2dLoadIdentity(); my2dRotatef(  ); transDraw(O, A); // I*R(a) // we may consider local coordinates: origin at A my2dTranslatev(A); my2dRotatef(  ); my2dTranslatev(-A); transDraw(A, B); // I*R(a)T(A)R(b)T(-A) // we may consider local coordinates: origin at B my2dTranslatev(B); my2dRotatef(  ); my2dTranslatev(-B); transDraw(B, C); x y o    B f C f A f

22 Copyright @ 2002 by Jim X. Chen George Mason University A f = R(  )A; B f = T(A f )T(-A)B’ =T(A f )R(  )T(-A)B; C f = T(B f )T(-B)C’ =T(B f )R(  )T(-B)C. Float matrix[3][3]; my2dLoadIdentity(); my2dRotatef(  ); transVertex(A, Af); Draw (O, Af); my2dLoadIdentity(); my2dTranslatev(Af); my2dRotatef(  +  ); my2dTranslatev(-A); transVertex(B, Bf); Draw (Af, Bf); my2dLoadIdentity(); my2dTranslatev(Bf); my2dRotatef(  +  ); my2dTranslatev(-B); transVertex(C2, Cf); Draw(Bf, Cf); x y o    B f C f A f Step 3 Final position C y o A B Step 1 x

23 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.22. TRANSFORMATION MATRIX STACK Simulate a real clock? Animate robot arm? Need multiple matrices to save different states? Matrix stack Float matrix[POINTER][3][3]; myPushMatrix(); pointer++; copy the matrix from (pointer – 1); myPopMatrix(); pointer--; multiply

24 Matrix Stack J2_2_Reshape my2dLoadIdentity(); my2dTranslatef(P1[0], P1[1]); my2dScalef(sx, sy); my2dTranslatef(-v0[0], -v0[1]); my2dTranslatef(c[0], c[1]); my2dScalef(1.2f, 1.2f); my2dRotatef(-hAngle); my2dTranslatef(-c[0], -c[1]); transDrawClock(c, h); J2_2_ReshapePushPop my2dLoadIdentity(); my2dTranslatef(P1[0], P1[1]); my2dScalef(sx, sy); my2dTranslatef(-v0[0], -v0[1]); my2dPushMatrix(); my2dTranslatef(c[0], c[1]); my2dRotatef(-hAngle); my2dTranslatef(-c[0], -c[1]); transDrawClock(c, h); my2dPopMatrix(); Copyright @ 2002 by Jim X. Chen George Mason University At this point of program running, the current matrix on the matrix stack is different

25 OpenGL Matrix Stacks & Transformation Copyright @ 2002 by Jim X. Chen George Mason University public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) { super.reshape(drawable, x, y, w, h); //1. specify drawing into only the back_buffer gl.glDrawBuffer(GL.GL_BACK); //2. origin at the center of the drawing area gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrtho(-w / 2, w / 2, -h / 2, h / 2, -1, 1); // matrix operations on MODELVIEW matrix stack gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); //3. interval to swap buffers to avoid rendering too fast gl.setSwapInterval(1); }

26 OpenGL Transformation Implementation my2dLoadIdentity(); transDrawArm(O, A); my2dTranslatef(A[0], A[1]); my2dRotatef(b); my2dTranslatef(-A[0], -A[1]); transDrawArm(A, B); my2dTranslatef(B[0], B[1]); my2dRotatef(g); my2dTranslatef(-B[0], -B[1]); transDrawArm(B, C); gl.glLoadIdentity(); drawArm(O, A); gl.glTranslatef(A[0], A[1], 0.0f); gl.glRotatef(beta, 0.0f, 0.0f, 1.0f); gl.glTranslatef(-A[0], -A[1], 0.0f); drawArm(A, B); gl.glTranslatef(B[0], B[1], 0.0f); gl.glRotatef(gama, 0.0f, 0.0f, 1.0f); gl.glTranslatef(-B[0], -B[1], 0.0f); drawArm(B, C); Copyright @ 2002 by Jim X. Chen George Mason University Example: J2_3_Robot2d Example: J2_4_Robot

27 Copyright @ 2002 by Jim X. Chen George Mason University Transformation and Viewing.26. Homework 1. Build up your own matrix system that includes - Double matrix[POINTER][3][3]; - void my2dLoadIdentity(); - void my2dTranslated(double x, double y); - void my2dRotated(double a); - void my2dScaled(double x, double y); - void myTransVertex(double x, double y, double x1, double y1); - void my2dPushMatrix(); - void my2dPopMatrix(); 2. Use your system to achieve the rotation of your pentagon or other objects in your circle. Then, you add a clock hand at each vertex of your pentagon or objects.

28 Copyright @ 2006 by Jim X. Chen: jchen@cs.gmu.edu 27 HW5: 2012 Fall Class 1.Continue from previous homework; 2.Modify your code: draw a unit-size sphere at the origin; 3.Using OpenGL transformation on MODELVIEW Matrix Stack, rotate, scale, and translate the spheres to the locations in animation; (40%) 4.Use PushMatrix and PopMatrix on the Matrix Stack (40%)


Download ppt "2002 by Jim X. Chen George Mason University Transformation and Viewing.1. Plane Example: J2_0_2DTransform."

Similar presentations


Ads by Google