220 likes | 351 Views
3D Transformations. y. P’. P. x. z. Translation. x’ = x + tx y’ = y + ty z’ = z + tz P = P’ = T = P’ = T . P. x y z 1. x’ y’ z’ 1. 1 0 0 tx 0 1 0 ty 0 0 1 tz 0 0 0 1. y. x. z. Rotation. z-axis rotation x’ = x.cos q – y.sin q
E N D
y P’ P x z Translation x’ = x + tx y’ = y + ty z’ = z + tz P = P’ = T = P’ = T . P x y z 1 x’ y’ z’ 1 1 0 0 tx 0 1 0 ty 0 0 1 tz 0 0 0 1
y x z Rotation z-axis rotation x’ = x.cosq – y.sinq y’ = x.sinq + y.cosq z’ = z R = P’ = R . P cos q -sin q 0 0 sin q cos q 0 0 0 0 1 0 0 0 0 1
y x z y x z Rotation x-axis rotation replace x -> y -> z -> x in z-axis rotation y’ = y.cosq – z.sinq z’ = y.sinq + z.cosq x’ = x R = y-axis rotation replace x -> y -> z -> x in x-axis rotation z’ = z.cosq – x.sinq x’ = z.sinq + x.cosq y’ = y R = 1 0 0 0 0 cos q -sin q 0 0 sin q cos q 0 0 0 0 1 cos q 0 -sin q 0 0 1 0 0 sin q 0 cos q 0 0 0 0 1
Rotation Rotation about an arbitrary axis parallel to a coordinate axis P’ = T-1 . Rx(q) . T. P y x z
Rotation Rotation about an arbitrary axis NOT parallel to a coordinate axis y x z
Rotation Rotation about an arbitrary axis NOT parallel to a coordinate axis 1. Translate so that rotation axis passes through the origin y x z
Rotation Rotation about an arbitrary axis NOT parallel to a coordinate axis 1. Translate so that rotation axis passes through the origin 2. Rotate so that rotation axis coincides with a coordinate axis y x z
Rotation Rotation about an arbitrary axis NOT parallel to a coordinate axis 1. Translate so that rotation axis passes through the origin 2. Rotate so that rotation axis coincides with a coordinate axis 3. Rotate y x z
Rotation Rotation about an arbitrary axis NOT parallel to a coordinate axis 1. Translate so that rotation axis passes through the origin 2. Rotate so that rotation axis coincides with a coordinate axis 3. Rotate 4. Inverse rotation y x z
Rotation Rotation about an arbitrary axis NOT parallel to a coordinate axis 1. Translate so that rotation axis passes through the origin 2. Rotate so that rotation axis coincides with a coordinate axis 3. Rotate 4. Inverse rotation 5. Inverse translation y x z
Scaling S = P’ = S . P wrt a fixed point (xf, yf, zf) : T(xf, yf, zf) . S(sx, sy, sz) . T(-xf, -yf, -zf) sx 0 0 0 0 sy 0 0 0 0 sz 0 0 0 0 1 y x z
x z Reflection 1800 rotation about x-axis a combination of translation and rotation y x z y
y x z Shear 1 0 shx –shx.zref 0 1 shy –shy.zref 0 0 1 0 0 0 0 1 y x z
OpenGL • glTranslate*(tx, ty, tz) • f (float) • d (double) • glRotate* (theta, vx, vy, vz) • (vx, vy, vz) vector defines the orientation of the rotation axis that passes through the coordinate origin • glScale*(sx, sy, sz)
OpenGL • glMatrixMode(GL_MODELVIEW) • sets up the matrix for transformations (4x4 modelview matrix) • glLoadIdentity ( ) • assigns identity matrix to the current matrix • glLoadMatrix*(16-element array) • assigns a 16-element array (in column major order) to the current matrix • glMultMatrix*(16-element array) • postmultiplies a 16-element array (M’) with the current matrix (M) : M <- M.M’
OpenGL glMatrixMode(GL_MODELVIEW); glLoadIdentity ( ); glMultMatrixf(M2); glMultMatrixf(M1); /* M = M2 . M1 */
OpenGL Matrix Stack • Initially stack contains identity matrix • Maximum stack depth is 32 • glGetIntegerv (GL_MAX_MODELVIEW_STACK_DEPTH, stacksize) • returns the number of positions available in the modelview stack • glGetIntegerv (GL_MODELVIEW_STACK_DEPTH, nummats) • returns the number of matrices currently in the stack • glPushMatrix() • copies the current matrix at the top of the stack • glPopMatrix() • destroys the matrix at the top of the stack
OpenGL glMatrixMode(GL_MODELVIEW); glColor3f(0.0, 0.0, 1.0); Recti(50, 100, 200, 150); glColor3f(1.0, 0.0, 0.0); glTranslatef(-200.0, -50.0, 0.0); Recti(50, 100, 200, 150); glLoadIdentity ( ); glRotatef(90.0, 0.0, 0.0, 1.0); Recti(50, 100, 200, 150); glLoadIdentity ( ); glScalef(-0.5, 1.0, 1.0); Recti(50, 100, 200, 150);
OpenGL glMatrixMode(GL_MODELVIEW); glColor3f(0.0, 0.0, 1.0); Recti(50, 100, 200, 150); glPushMatrix(); glColor3f(1.0, 0.0, 0.0); glTranslatef(-200.0, -50.0, 0.0); Recti(50, 100, 200, 150); glPopMatrix(); glPushMatrix(); glRotatef(90.0, 0.0, 0.0, 1.0); Recti(50, 100, 200, 150); glPopMatrix(); glScalef(-0.5, 1.0, 1.0); Recti(50, 100, 200, 150);