24
1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

Embed Size (px)

Citation preview

Page 1: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

1

Bezier Curves and Surfaces

© Jeff Parker, Nov 2009

Page 2: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

2

Review

Fill out the course evaluations!

We often wish to draw generate curves

Through selection of arbitrary points

Smooth (many derivatives)

Fast to compute

Easy to deal with

It is hard to get all of these

We will talk about some ideas used to achieve some of these

Page 3: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

3

History

These ideas were developed twice:

Pierre Bézier, at Renault

Paul de Casteljau, at Citroën

Used by people who needed to bend sheet metal or wood to achieve a smooth shape

Page 4: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

4

Background

Given a set of n points (xi, yi) we may be able to define a polynomial that goes through each point.

Lagrange Polynomial

Assumes that we don't have two points with the same x but different ys.

As the number of points rises, the curve can start to wobble to hit each mark.

Page 5: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

5

Reminder

Wrote line segment as weighted sum of endpoints

Can view this as the convex sum of two points

The curves below lie in [0..1], sum to 1

(x, y) = (1− t)v1 + tv2

Page 6: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

6

Bezier Curve

We write a Bezier as the weighted sum of control points

The control points are multiplied by Bernstein polynomials

Convex sum of polynomials with values in [0..1] that sum to 1

Each polynomial pulls curve towards it's control point

(x, y) = (1− t)3v1 + 3t(1− t)2 v2 + 3t 2(1− t)v3 + t 3v4

Page 7: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

7

Terminology

The Bezier interpolates the first and fourth control point

That is, the curve passes through them

The middle two control points draw the curve towards them

Page 8: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

8

De Casteljau's Method

We can compute points on the curve without evaluating polynomials

Can use the midpoints, so only need to shift right

Page 9: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

9

De Casteljau

Let's spell out what this means

Notation differs from figure

r0 = (1−u)p0 +u ⋅ p1

r1 = (1−u)p1 +u ⋅ p2

r2 = (1−u)p2 +u ⋅ p3

s0 = (1−u)r0 +u ⋅r1s1 = (1−u)r1 +u ⋅r2

t0 = (1−u)s0 +u ⋅s1

Page 10: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

10

Expand one level

r0 = (1−u)p0 +u ⋅ p1

r1 = (1−u)p1 +u ⋅ p2

r2 = (1−u)p2 +u ⋅ p3

s0 = (1−u)r0 +u ⋅r1= (1−u)((1−u)p0 +u ⋅ p1)+u ⋅((1−u)p1 +u ⋅ p2 )

= (1−u)2 p0 + 2u(1−u)p1 +u2 ⋅ p2

s1 = (1−u)2 p1 + 2u(1−u)p2 +u2 ⋅ p3

Page 11: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

11

Expand last level

t0 = (1−u)s0 +u ⋅s1

s0 = (1−u)2 p0 + 2u(1−u)p1 +u2 p2

s1 = (1−u)2 p1 + 2u(1−u)p2 +u2 p3

t0 = (1−u)3 p0 + 3u(1−u)2 p1 + 3u2(1−u)p2 +u3 p3

Page 12: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

12

Recursive Drawing Algorithm

We can take four control points

Recursively subdivide, just using shifts

Get two Beziers, with 7 control points

Curve lies inside the convex hull

Continue until the convex hull is one pixel wide

At each step, subcurves

are shorter

are much less wide

Can make this formal

Page 13: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

13

Hermite Polynomial

Sometimes we want to avoid sharp corners

Can define the slope at the endpoints

Hermite Polynomials use a new blending functions to define curve

Page 14: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

14

Hermite Polynomial

H0(u) = (1+ 2u)(1−u)2 = 2u3 − 3u2 +1

H1(u) = u(u −1)2 = u3 − 2u2 +u

H2(u) = −u2(u −1) = u3 −u2

H 3(u) = u2 (3− 2u) = −2u3 + 3u2

Page 15: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

15

Hermite Polynomial

q(u) = p0H0 (u)+ (p1 + p0 )H1(u)+ ( p3 + p2 )H2 (u)+ p3H 3(u)

H0(u) = (1+ 2u)(1−u)2 = 2u3 − 3u2 +1

H1(u) = u(u −1)2 = u3 − 2u2 +u

H2(u) = −u2(u −1) = u3 −u2

H 3(u) = u2 (3− 2u) = −2u3 + 3u2

Page 16: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

16

Catmull-Rom

We can get a similar effect with Bezier curves

One way of auto-generating the right slopes to a set of interpolated points was introduced by Catmull and Rom

Idea is to use slope between previous and next point as the slope at the current point.

If distance between points is uneven, can overshoot

Page 17: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

17

Interactive Websites to try

Bill Casselman's Bezier Applet

http://www.math.ubc.ca/people/faculty/cass/gfx/bezier.html

Wikepedia Animation

http://en.wikipedia.org/wiki/Bezier_curve

Edward A. Zobel's Animation

http://id.mind.net/~zona/mmts/curveFitting/bezierCurves/bezierCurve.html

POV-Ray Cyclopedia Tutorial

http://www.spiritone.com/~english/cyclopedia/bezier.html

Andy Salter's Spline Tutorial

http://www.doc.ic.ac.uk/%7Edfg/AndysSplineTutorial/index.html

Evgeny Demidov's Interactive Tutorial

http://ibiblio.org/e-notes/Splines/Intro.htm

Page 18: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

18

Splines

Make everything a central control point

(Image is of a traditional spline used in boat building)

Page 19: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

19

Basis Functions

iB (u) =

0

0b (u + 2)

1b (u +1)2b (u)

3b (u −1)

0

⎪ ⎪ ⎪

⎪ ⎪ ⎪

u < i − 2

i − 2 ≤ u < i −1

i −1 ≤ u < ii ≤ u < i +1

i +1≤ u < i + 2

u ≥ i + 2

In terms of the blending polynomials

Page 20: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

20

In OpenGL

We could evaluate these by hand, given the formulas above.

It is simpler to use Evaluators, provided by OpenGL

Evaluators provide a way to use polynomial or rational polynomial mapping to produce vertices, normals, texture coordinates, and colors. The val-ues produced by an evaluator are sent to further stages of GL processing just as if they had been presented using glVertex, glNormal, glTexCoord, and glColor commands, except that the generated values do not update the current normal, texture coordinates, or color.

All polynomial or rational polynomial splines of any degree (up to the maximum degree supported by the GL implementation) can be described using evaluators. These include almost all splines used in computer graphics: B-splines, Bezier curves, Hermite splines, and so on. (From the man page)

Page 21: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

21

Bezier Curve

void drawCurve() {

int i;

GLfloat pts[4][3];

/* Copy the coordinates from balls to array */

for (i = 0; i < 4; i++) {

pts[i][0] = (GLfloat)cp[i]->x;

pts[i][1] = (GLfloat)wh - (GLfloat)cp[i]->y;

pts[i][2] = (GLfloat)0.0;

}

// Define the evaluator

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &pts[0][0]);

/* type, u_min, u_max, stride, num points, points */

glEnable(GL_MAP1_VERTEX_3);

setLineColor();

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 30; i++)

/* Evaluate the curve when u = i/30 */

glEvalCoord1f((GLfloat) i/ 30.0);

glEnd();

Page 22: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

22

bteapot.c

// vertices.h

GLfloat vertices[306][3]={{1.4 , 0.0 , 2.4}, {1.4 , -0.784 , 2.4},

{0.784 , -1.4 , 2.4}, {0.0 , -1.4 , 2.4}, {1.3375 , 0.0 , 2.53125},

{1.3375 , -0.749 , 2.53125}, {0.749 , -1.3375 , 2.53125}, {0.0 , -1.3375 , 2.53125},

{1.4375 , 0.0 , 2.53125}, {1.4375 , -0.805 , 2.53125}, {0.805 , -1.4375 , 2.53125},

...

// patches.h

int indices[32][4][4]={{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},

{4, 17, 18, 19, 8, 20, 21, 22, 12, 23, 24, 25, 16, 26, 27, 28},

{19, 29, 30, 31, 22, 32, 33, 34, 25, 35, 36, 37, 28, 38, 39, 40},

...

Page 23: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

23

bteapot.c

/* 32 patches each defined by 16 vertices, arranged in a 4 x 4 array */

/* NOTE: numbering scheme for teapot has vertices labeled from 1 to 306 */

/* remnent of the days of FORTRAN */

#include "patches.h"

void display(void)

{

int i, j, k;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(1.0, 1.0, 1.0);

glLoadIdentity();

glTranslatef(0.0, 0.0, -10.0);

glRotatef(-35.26, 1.0, 0.0, 0.0);

glRotatef(-45.0, 0.0, 1.0, 0.0);

/* data aligned along z axis, rotate to align with y axis */

glRotatef(-90.0, 1.0,0.0, 0.0);

Page 24: 1 Bezier Curves and Surfaces © Jeff Parker, Nov 2009

24

bteapot.c

for(k=0;k<32;k++)

{

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &data[k][0][0][0]);

for (j = 0; j <= 8; j++)

{

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 30; i++)

glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);

glEnd();

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 30; i++)

glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);

glEnd();

}

}

glFlush();

}