Computer Graphics Zhen Jiang West Chester University
Topics • Curves • 2D and 3D • Clipping • Projection and shadow • Animation
Curves • Parametric cubic polynomial curves • Interpolation (interpolating polynomials) • Bezier Curve
Curves Where is the position for the next point? K=4 K=3 K=2 K=1
Curves Where is the position for the next point? K=4 K=3 K=2 K=1
Parametric cubic polynomial curves • P(u)=c0+c1u+c2u2+c3u3 = uTc • Where uT = [1, u, u2, u3] and cT= [c0, c1, c2, c3 ]
Interpolation Where is the position for any point on this curve? K=4 K=3 K=2 K=1
Interpolation • P0=p(0) = c0 P1=p(1/3) P2=p(2/3) P3=p(1) = c0+c1+c2+c3 • pT=[p0,p1,p2,p3], A = • M=A-1= • c=Mp • P(u)=uTMp=b(u)p • where b(u) = [b0(u), b1(u), b2(u), b3(u), ] 1, 0, 0, 0 1, 1/3, (1/3)2, (1/3)3 1, 2/3, (2/3)2, (2/3)3 1, 1, 1, 1 [ ] 1, 0, 0, 0 -5.5, 9, -4.5, 1 9, -22.5, 18, -4.5 -4.5, 13.5, -13.5, 4.5 [ ]
Interpolation • B0(u)=-9/2(u-1/3)(u-2/3)(u-1) • B1(u)=27/2(u-2/3)u(u-1) • B2(u)=-27/2(u-1/3)u(u-1) • B3(u)=9/2(u-1/3)(u-2/3)u
Interpolation • Example • pT=[p0,p1,p2,p3], where p0= (0,0), p1=(1,1), p2,=(2,3), p3 =(3, 6) • (X,Y) when u=0? • B0(0)=1, B1(0)=0, B2(0)=0, B3(0)=0 • Since P(u)=b(u)p, X=b(u)Xp, Y=b(u)Yp, where XpT= [0,1,2,3] and YpT= [0,1,3,6]. • X=[1,0,0,0] [0,1,2,3] T=[1,0,0,0][ ]=0 and Y=0; 0 1 2 3
Interpolation • Example • (X,Y) when u=1? • B0(0)=0, B1(0)=0, B2(0)=0, B3(0)=1 • Since P(u)=b(u)p, X=b(u)Xp, Y=b(u)Yp, where XpT= [0,1,2,3] and YpT= [0,1,3,6]. • X=[ ][ ]= and Y= [ ][ ]= ; 0 1 3 6 0 1 2 3 0,0,0,1 3 0,0,0,1 6
Interpolation • Example • (X,Y) when u=3? • B0(0)=-56, B1(0)=189, B2(0)=-216, B3(0)=84 • Since P(u)=b(u)p, X=b(u)Xp, Y=b(u)Yp, where XpT= [0,1,2,3] and YpT= [0,1,3,6]. • X=[ ][ ]= • Y= [ ][ ]= 0 1 2 3 -56,189,-216,84 9 0 1 3 6 45 -56,189,-216,84
Bezier Curve • Two endpoints • p0(x0,y0) origin endpoint, source • p3(x3,y3) destination endpoint • Two control points • p1(x1,y1) • p2(x2,y2) • t form 0 to 1 • New point p(x(t), y(t)) • p(t)=c0+c1t+c2t2+c3t3 • Where c0=p0, c1=3(p1-p0), c2=3(p2-p1)-c1, c3=p3-p0-c1-c2.
/* Three control point Bezier interpolation mu ranges from 0 to 1, start to end of the curve */ XYZ Bezier3(XYZ p1,XYZ p2,XYZ p3,double mu) { double mum1,mum12,mu2; XYZ p; mu2 = mu * mu; mum1 = 1 - mu; mum12 = mum1 * mum1; p.x = p1.x * mum12 + 2 * p2.x * mum1 * mu + p3.x * mu2; p.y = p1.y * mum12 + 2 * p2.y * mum1 * mu + p3.y * mu2; p.z = p1.z * mum12 + 2 * p2.z * mum1 * mu + p3.z * mu2; return(p); }
/* Four control point Bezier interpolation mu ranges from 0 to 1, start to end of curve */ XYZ Bezier4(XYZ p1,XYZ p2,XYZ p3,XYZ p4,double mu) { double mum1,mum13,mu3; XYZ p; mum1 = 1 - mu; mum13 = mum1 * mum1 * mum1; mu3 = mu * mu * mu; p.x = mum13*p1.x + 3*mu*mum1*mum1*p2.x + 3*mu*mu*mum1*p3.x + mu3*p4.x; p.y = mum13*p1.y + 3*mu*mum1*mum1*p2.y + 3*mu*mu*mum1*p3.y + mu3*p4.y; p.z = mum13*p1.z + 3*mu*mum1*mum1*p2.z + 3*mu*mu*mum1*p3.z + mu3*p4.z; return(p); }
/* General Bezier curve Number of control points is n+1 0 <= mu < 1 IMPORTANT, the last point is not computed */ XYZ Bezier(XYZ *p,int n,double mu) { int k,kn,nn,nkn; double blend,muk,munk; XYZ b = {0.0, 0.0, 0.0}; muk = 1; munk = pow(1-mu,(double)n); for (k=0;k<=n;k++) { nn = n; kn = k; nkn = n - k; blend = muk * munk; muk *= mu; munk /= (1-mu); while (nn >= 1) { blend *= nn; nn--; if (kn > 1) { blend /= (double)kn; kn--; } if (nkn > 1) { blend /= (double)nkn; nkn--; } } /*end of while*/ b.x += p[k].x * blend; b.y += p[k].y * blend; b.z += p[k].z * blend; } /*end of for*/ return(b); }
2D and 3D (Transformation) • Coordinate system • Translation (p’=p+d) • (0,0) by d(1,2) • (1,2) by d(2,4) • (3,6) by d(-3,-6) • Rotation p’ = [ ] p = [ ] [ ] -(3,0) by =90˚ • Scaling p’= r p (r > 1, big one; r < 1, small one) P (x’,y’) P (x,y) cos -sin Sin cos cos -sin Sin cos x y
2D and 3D (Transformation) • Mixed d For example, P’= r(P+d), where =[ ] ! What will it be if P’= rP+d, r(P+d), (rP+d), r(P+d), or rP+d? ! Undo if P’= r(P+d), P’’=P= ’(1/rP’-d), where ’=[ ] If P’’’= ’(1/r)P’-d, is P’’’=P’’=P? How about ’(1/r)(P’-d), (1/r)’P’-d, , …, ? P cos -sin Sin cos r cos sin -sin cos
2D and 3D (Transformation) • Translation (p’=p+d) • (0,0,0) by d(1,2,3) • (1,2,3) by d(2,4,6) • (3,6,9) by d(-3,-6,-9) • Rotation p’ = R p ( Rz =[ ], Rx =[ ], Ry =[ ], • Scaling p’= r p (r > 1, big one; r < 1, small one) • Mixed • 0 0 • 0 cos -sin • 0 sin cos cos -sin 0 sin cos 0 0 0 1 cos 0 sin 0 1 0 -sin 0 cos
2D and 3D (Transformation) Y Y P P Rz() Rx() x x P Ry() Z Z
2D and 3D (Transformation) • 45 degree about the line through origin (0,0,0) and the point(1,2,3) with a fixed point of (4,6,5): glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glTranslatef(4.0, 6.0, 5.0); glRotatef(45.0, 1.0, 2.0, 3.0); glTranslatef(-4.0, -6.0, -5.0);
2D and 3D (Transformation) Y’ Y P’ Y P’ X’ P1 P X Z’ X P1= P+d Z Z
2D and 3D (Transformation) P’1 Y’ Y’ P’ Y (1,2,3) (0,0,0) Y X’ X’ P2 P1 Z’ Z’ X X P2= Rz P1= Rz(P+d) Z Z
2D and 3D (Transformation) P’2 P’1 Y’ Y’ X P3 Y X’ X’ Y P2 Z’ Z’ X Z P3= Rx P2= RxRz(P+d) Z
2D and 3D (Transformation) P’3 Y Y’ X X Y Y P3 X’ X P’2=?P’3 P’1=?P’2 Z’ Z P’=?P’1 Need solution? Check “undo” in 2Ds. Z Z P’3= Ry(45) P3= Ry(45)RxRz(P+d)
Clipping
Clipping
Clipping (6,18) (22,18) (2,10) (19,9) (6,6) (22,6) (14,4) (2,2) (19,2)
Clipping • Step 1: Start from a vertex • If it is a point inside window, save it as a vertex in the new polygon; status=1; • Otherwise, status=0. • Step 2: Pick the edge starting from this vertex until there is no new vertex of this polygon • If it has an intersection [0,1) with any edge of window • status=!status, save the intersection as a vertex for the new polygon; • If status==1, save the endpoint of this segment as a vertex for new polygon; • Repeat step 2, start from the endpoint of this segment. • If it has no intersection with any edge of window • If status ==1, save the endpoint of this segment as a vertex for new polygon; • Repeat step 2, start from the endpoint of this segment. • Step 3: Connect all the vertices of the new polygon
Clipping • Does a segment from A(x1,y1) to B(x2,y2) have an intersection with an edge from P(x3,y3) to Q(x4,y4)? yup • = (x3-x1)/(x2-x1) y= (1-)y1+ y2 x3=x4 0 ≤ ≤1 && ylo ≤ y ≤yup I=(1-)A+ B, 0 ≤ ≤1 ylo • = (y3-y1)/(y2-y1) x= (1-)x1+ x2 xmin xmax y3=y4 0 ≤ ≤1 && xmin ≤ x ≤xmax