You are on page 1of 9

Chương 5 Hin thcác đối tượng hình hc trong không gian ba chiu

Trong đồ homáy tính khi mun xây dng mt đường cong tng quát khi chưa biết phương

trình toán hc ca nó người ta sdng mt tp hp các đim điu khin cho trước (control

P n , khi đó mt đường cong C được to

ra theo mt trong hai cách sau:

- Ni suy các đim điu khin: C bt đầu ti P0 và đi qua các đim điu khin trung gian

theo thtP 0 , P 1 , P 2 ,

- Xp xcác đim điu khin: C không nht thiết phi đi qua các đim điu khin nhưng

hình dng ca nó được quyết định bi các đim điu khin. Trong chương này ta snghiên cu hai phương pháp cho phép vcác đường và mt cong trong không gian đó là Bezier và B-Spline. Chai phương pháp đều sdng cách ly xp xcác đim điu khin.

1. Đường cong Bezier

points). Gista dùng n+1 đim điu khin P 0 , P 1 , P 2 ,

,

,

P n . C kết thúc ti P n

Lí thuyết đường cong và mt Bezier được phát minh bi mt kĩ sư người Pháp có tên là Pierre Bézier trong quá trình thiết kế mu xe ôtô. Đim mnh ca lí thuyết này là tính ddàng và thun tin trong vic biu din các đường cong và mt cong.

1.1 Cách xây dng đường cong Bezier Gismt đường cong Bezier C được to ra tn+1 đim điu khin P0, P1,

, toạ độ ca mi đim điu khin là Pk(x k , y k , z k ) trong đó 0kn. Tp hp các đim điu khin ta gi là đa giác điu khin (control polygon). Khi đó các đim trên đường cong Bezier C được tính theo công thc:

Pn, kí hiu

n

C(u)=

k = 0

BEZ k,n (u) P k ,

(0u1)

Trong đó hàm BEZ k,n (u)=C(n,k)u k (1-u) n-k =

n !

k

!(

n

k

)!

u k (1-u) n-k

- Để dhình dung ta xét trường hp đơn gin nht khi chcó 2 đim điu khin P 0 và P 1 khi đó các đim thuc đường cong C được xác định bi:

C(u)=BEZ 0,1 .P 0 + BEZ 1,1 .P 1 =(1-u)P 0 + uP 1

Đường cong C lúc này chính là đon thng P 0 P 1 như trong hình v5.1(a)

(0u1)

đ o ạ n th ẳ ng P 0 P 1 nh ư trong hình v

Hình 5.1: Đường cong Bezier

1

Ta thy C(u) là tuyến tính theo tham su và ta gi đó là đường cong Bezier bc 1

- Trường hp có 3 đim điu khin P 0 , P 1 , P 2 như trong hình 5.1(b), ta ddàng tính được:

BEZ

BEZ

BEZ

0,2

1,2

2,2

=(1-u) 2

=2(1-u)u

=u 2

Do đó phương trình ca C là:

C(u)=(1-u) 2 P 0 + 2(1-u)uP 1 + u 2 P 2 C(u) lúc này được gi là đường cong Bezier bc 2

Công thc trên còn được xây dng mt cách tun tnhư sau:

+ Vi mi giá tr0u1 ta tính giá tra(u) gia hai đim P 0 và P 1 a(u)=(1-u)P 0 + uP 1

+ Tính b(u) gia hai đim P 1 và P 2

b(u)=(1-u)P 1 + uP 2

+ Cui cùng tính C(u) gia hai đim a(u) và b(u) C(u)=(1-u)a(u)+ub(u)= (1-u) 2 P 0 + 2(1-u)uP 1 + u 2 P 2

- Tương tkhi có 4 đim điu khin P 0 , P 1 , P 2 , P 3 như trong hình 5.1(c), ta tính được:

BEZ

BEZ

BEZ

BEZ

0,3

1,3

2,3

3,3

=(1-u) 3 =3(1-u) 2 u =3(1-u)u 2 =u 3

Do đó phương trình ca C là:

C(u)=(1-u) 3 P 0 + 3(1-u) 2 uP 1 + 3(1-u)u 2 P 2 +u 3 P 3 C(u) là mt hàm bc 3 theo biến u và được gi là đường cong Bezier bc 3 Công thc trên còn có thxây dng mt cách tun tnhư mô ttrong hình 5.1(c).

1.2 Tính cht ca đường cong Bezier

- Tcông thc xây dng đường cong Bezier ta ddàng nhn xét:

C(0)=P

C(1)=P

0

n

Do đó P 0 và P n chính là đim đầu và đim cui ca đường cong

- Nếu ly đạo hàm bc nht ca C(u) ti đim đầu và đim cui ta có C'(0)=-nP 0 + nP 1 C'(1)=-nP n-1 + nP n Do đó độ dc ti đim đầu ca C(u) nm dc theo đường thng qua hai đim điu khin đầu tiên và độ dc ti đim cui ca C(u) nm dc theo đường thng qua hai đim điu khin cui cùng.

BEZ k,n (u)=1 và BEZ k,n (u)0 do đó mi đim nm trên C(u) đều thuc tp li các

n

- Vì

k = 0

đim điu khin (convex hull of the control points)

- Bc ca đường cong tăng cùng vi số đim điu khin, cthể đường cong Bezier C(u) vi

n+1 đim điu khin là mt đa thc bc n ca u. Do đó khi số đim điu khin ln quá trình tính

toán sphc tp.

1.3 Lnh OpenGL hin thị đường cong Bezier

2

- Trước hết ta phi định nghĩa hàm C(u) bng lnh:

glMap1{fd}(GLenum target, TYPE u1, TYPE u2, GLint stride,GLint order, const TYPE*points); Trong đó target chỉ định kiu dliu ca đim điu khin, có thnhn giá tr

GL_MAP1_VERTEX_3 hoc GL_MAP1_VERTEX_4. Hai tham su1 u2 chkhong giá trca u. Tham sstride chkhong cách (giá trfloating-point) gia hai sliu đim điu khin liên tiếp. Tham sorder có giá trbng bc ca đường Bezier cng thêm 1. Tham spoint chỉ đến mng cha các đim điu khin. Tiếp theo đó sdng lnh glEnable(GLenum target) để kích hot C(u)

- Sau khi định nghĩa hàm C(u) ta dùng lnh glEvalCoord1f(u) thay cho lnh glVertex() để hin thcác đim ca đường cong Bezier

Ví d1: Thc hin chương trình bezcurve.c Ví d2: Thc hin chương trình bezcurveMesh.c Chương trình này ging vi chương trình ngoi trcâu lnh glMapGrid1f(30,0.0,1.0), lnh này chia khong giá trca tham su[0,1] thành 30 khong bng nhau. Sau đó ta sdng lnh glEvalMesh1(GL_LINE, 0, 30) thay thế cho lnh glEvalCoord1f() khi hin thị đường cong. Ví d3: Thc hin chương trình bezcurve2.c

2. Mt cong Bezier

2.1 Cách xây dng mt cong Bezier

Mt cong Bezier là mrng ca đường cong Bezier. Gista có mt mng (n+1)x(m+1)

các đim điu khin P

Khi đó các đim trên mt cong Bezier S được tính theo công thc:

, 0in, 0jm ta gi đó là khi đa din điu khin (control polyhedron).

ij

n m

S(u,v)=

i = 0

j

= 0

BEZ i,n (u)BEZ j,m (v) P ij ,

(0u,v1)

Để có mt cong Bezier tcác đường cong Bezier ta hãy coi mng (n+1)x(m+1) các đim điu khin P như là n+1 mng mt chiu khác nhau, mi mng gm m+1 đim điu khin. Xây dng đường cong Bezier tn+1 mng đim điu khin đó ta sẽ được n+1 đường cong Bezier. Ta

kí hiu đường cong ng vi mng đim điu khin thi là C i , 0in và phương trình tham sca C i là C i (v), 0v1. Nói cách khác vi mi giá tr0v1 ta có n+1 đim nm tương ng trên các đường cong

C i , ta kí hiu tp các đim đó là {C i (v)} i=0

. Nếu ta tiếp tc sdng n+1 đim đó làm đa giác

điu khin ta sthu được mt đường cong Bezier. Tưởng tượng khi v tăng t0 đến 1 ta sẽ được mt lưới các đường cong Bezier, đó chính là mt cong Bezier như minh hotrong hình 5.2.

ij

n

3

1 v 0 Hình 5.2: Xây dựng mặt cong Bezier 2.2 L ệ nh OpenGL
1 v 0 Hình 5.2: Xây dựng mặt cong Bezier
1
v
0 Hình 5.2: Xây dựng mặt cong Bezier

2.2 Lnh OpenGL hin thmt cong Bezier Ta sdng hai lnh glMap2*() và glEvalCoord2*() để định nghĩa và hin thmt cong Bezier. glMap2{fd}(GLenum target, TYPE u1, TYPE u2, GLint ustride, GLint uorder, TYPE v1, TYPE v2, GLint vstride, GLint vorder, TYPE points); Trong đó target ging như trong lnh glMap2*() được sdng trong lnh glEnable(). Hai cp giá tr(u1,u2) và (v1,v2) chỉ định min giá trca hai tham su v. Tham sstride chkhong cách (giá trfloating-point) gia hai sliu đim điu khin liên tiếp. Tham sorder giá trbng bc ca đường Bezier cng thêm 1. Tham spoint chỉ đến mng cha các đim điu khin. Hai tham sustride và vstride xác định khong cách gia hai đim điu khin xét theo tham biến u và tham biến v.Hai tham suorder vorder có giá trbng bc ca đường Bezier xét theo ln lượt tham su v cng thêm 1. Tham spoint chỉ đến mng cha các đim điu khin. glEvalCoord2{fd}(TYPE u, TYPE v); Cho phép hin thcác đim ca mt cong thay cho lnh glVertex*().

Ví d1: Thc hin chương trình bezsurf.c Ví d2: Thc hin chương trình bezmesh.c Ví d3: Thc hin chương trình bezboat.c

3. Đường cong B-spline

Ging như đường cong và mt Bezier, đường cong và mt B-spline cũng sdng phương pháp xp xcác đim điu khin. Đim mnh ca phương pháp B-spline so vi phương pháp Bezier đó là:

- Bc ca đa thc B-spline có ththit lp mt cách độc lp vi slượng các đim điu khin.

4

- B-spline cho phép điu khin cc b(local control) nghĩa là khi ta thay đổi vtrí mt đim điu khin thì vtrí hai đim điu khin lin ksthay đổi tương ng giúp ta có thể điu chnh mt phn nào đó ca đưòng cong và mt cong. Ngược li vi phương pháp Bezier khi ta thay đổi vtrí mt đim điu khin, hình dáng ca cả đường cong hoc mt cong sbthay đổi điu đó gây khó khăn khi ta mun chnh sa hình v. Đim hn chế ca phương pháp B-spline là nó phc tp hơn phương pháp Bezier.

3.1 Cách xây dng đường cong B-spline Gista có n+1 đim điu khin P0, P1,

Pn, kí hiu toạ độ ca mi đim điu khin là

, P i (x i , y i , z i ) trong đó 0in. Tp hp các đim điu khin ta gi là đa giác điu khin (control polygon). Khi đó các đim trên đường cong B-Spline được tính theo công thc:

n

C(u)=

i = 0

N i,m (u) P i ,

t min ut max ,

2mn+1

Ta có thla chn min giá trca tham su. Hàm N i,m (u) được gi là hàm B-spline là mt đa thc có bc là m-1. Giá trca tham sm có thchn là mt trong scác giá trt2 đến n+1. Trong thc tế ta có ththiết lp m=1 nhưng khi đó chhin thcác đim điu khin. Trước khi định nghĩa hàm N i,m (u) ta phi xây dng các khong giá trca tham biến u, hàm N i,m (u) sẽ được định nghĩa trên tng khong đó. Mun vy ta định nghĩa r+1 đim chia

t 0 t 1

được gi là Vecto các đim nút (knot vector). Các đim nút to thành mt dãy skhông gim và có thmt vài đim nút có giá trbng

nhau.

t r , mi đim như vy được gi là mt đim nút. Tp hp các đim nút T={t 0 , t 1,

,t

r

}

Hàm N i,m (u) được định nghĩa mt cách đệ quy theo m như sau:

N

i ,1

(

u

)

=

1

0

u

u t

t

i

[

i

,

t

t

i + 1

i + 1

]

Các hàm B-spline vi m>1 được định nghĩa bi công thc sau

i,m (u)=

N

u

t

i

t

i

+ −1

m

t

i

i,m-1 (u)+

N

t

i + m

u

t

i

+

m

t

i

+1

i+1,m-1 (u)

N

,t i+m trong

vectơ nút. Vy khi i=n ta cn t 0 , t 1,

đầu vectơ nút sao cho khong giá trca tham su được chia thành n+m khong bi n+m+1 đim

chia hay nói cách khác r=n+m. Để dhình dung cách xây dng đường cong B-spline ta xét khi m=1,2,3. + Khi m=1, hàm B-spline N i,1 scó bc bng 0, phương trình đường cong B-spline có dng:

n+m trong véc tơ nút, chính vì lí do đó mà ta phi chn t

Nhìn vào công thc tính trên ta thy để tính được N i,m (u) ta cn các nút t 0 , t 1,

,t

n

C(u)=

i = 0

N i,1 (u) P i =N 0,1 P 0 + N 1,1 P 1 +

+ N n,1 P n (t 0 ut n+1 )

Theo định nghĩa trên ta có khi t 0 ut 1 chcó duy nht hàm N 0,1 =1 còn các hàm B-spline khác đều bng 0 do đó C(u)=P 0 . Tương tnhư vy khi xét ln lượt các khong ca tham su ta thy trên khong [t i , t i+1 ] chcó duy nht hàm N i,1 có giá trbng 1, còn các hàm B-spline khác có giá trbng 0. Vy khi m=1 ta có đường cong C(u) chính là các đim điu khin ri rc. Hình 5.3 dưới đây minh hoạ đồ thca các hàm N i,1 (0i4) và đường cong C(u).

5

Hình 5.3: Đồ th ị các hàm B-spline N i , 1 và đườ ng
Hình 5.3: Đồ th ị các hàm B-spline N i , 1 và đườ ng

Hình 5.3: Đồ thcác hàm B-spline N i,1 đường cong C(u) là các đim điu khin

+ Khi m=2, hàm B-spline N i,2 scó bc bng 1, phương trình đường cong B-spline có dng:

n

C(u)=

i = 0

N i,2 (u) P i =N 0,2 P 0 + N 1,2 P 1 +

Ta xét hàm B-spline đầu tiên N 0,2

0,2 (u)=

N

u

t

0

t

1

t

0

0,1 (u)+

N

t

2

u

t

2

t

1

1,1 (u)

N

+ N n,2 P n (t 1 ut n+1 )

Ta nhn thy N 0,2 được tính da vào N 0,1 và N 1,1 . Hsca N 0,1

u

t

0

t

1

t

0

, đây là phương

trình ca mt hàm sbc nht tăng trên đon [t 0 ,t 1 ], giá trca hàm bng 0 khi u=t 0 và bng 1 khi u=t 1 (ta gi đây là na bên trái ca N 0,2 ). Tương thsca N 1,1 là mt hàm sbc nht gim trên đon [t 1 ,t 2 ], giá trca hàm bng 1 khi u=t 1 và bng 0 khi u=t 2 (ta gi đây là na bên phi ca N 0,2 ). Phương trình ca N 0,2 (u) có thviết li như sau:

 0 u ≤ t 0   u − t 0 t ≤ u
0 u
≤ t
0
u − t
0
t
u
t
0
1
t
− t
( u
)
=
1
0
N 0,2
t
− u
2
t
u
t
1 ≤
2
t
− t
2
1
0 u
≥ t
2
Tổng quát ta có công thức sau:
0 u ≤ t
i
u − t
i
t i t
u
i + 1
t
− t
( u
)
=
i
+
1
i
N i ,2
t
− u
i
+ 2
t
u
t
i
+
1
i
+
2
t
− t
i
+
2
i
+
1
0 u ≥ t
i + 2

6

Hình 5.4(a) minh hoạ đồ thca hàm N 0,2 , hình 5.4(b) minh hoạ đồ thcác hàm N i,2 (0i3)

ạ đồ th ị các hàm N i , 2 (0 ≤ i ≤ 3) Hình

Hình 5.4 Ta nhn thy rng trên đon [t i ,t i+1 ] (1in) có hai na đồ th, na bên trái ca N i,2 và na bên phi ca N i-1,2 . Do đó phương trình ca C(u) trên đon [t i ,t i+1 ] là:

C(u)=

t

i + 1

u

t

i

+ 1

t

i

P i-1 +

u

t

i

t

i

+1

t

i

P

i

Hai hsca P i-1 và P i đều không âm và có tng bng 1 do đó C(u) chính là đon thng

P i-1 P i .

Chng tkhi m=2 đường cong B-spline chính là đường gp khúc P 0 P 1

P n như minh ho

trong hình 5.4(c). + Khi m=3, hàm B-spline N i,3 scó bc bng 2, phương trình đường cong B-spline có dng:

n

C(u)=

i = 0

N i,3 (u) P i =N 0,3 P 0 + N 1,3 P 1 +

Ta xét hàm B-spline đầu tiên N 0,3

0,3 (u)=

N

u

t

0

t

2

t

0

0,2 (u)+

N

t

3

u

t

3

t

1

1,2 (u)

N

+ N n,3 P n (t 2 ut n+1 )

N 0,3 (u) là hàm hp ca hai hàm N 0,2 (u) và N 1,2 (u) trên đon [t 0 ,t 3 ], thay các giá trị đã biết N 0,2 (u) và N 1,2 (u) vào ta có:

N

0,3

(

u

)

=

 0 u ≤ t 0  u − t u − t 0 0
0
u
≤ t
0
u
− t
u
− t
0
0
*
t
u
t
0
1
t
− t
t 1 − t
2
0
0
u
− t
t
− u
t
− u
u
− t
0
2
3
1
*
+ *
t
u
t
1
2
t
− t
t
− t
t
− t
t
− t
2
0
2
1
3
1
2
1
t
− u
t
3
3
* − u
t
u
t
2
3
t
− t
t
− t
3
1
3
2
0
u
≥ t
3

Giá trca hàm N 0,3 (u) hoc là bng 0 hoc là mt hàm bc 2 theo biến u. Tng quát ta có công thc sau:

7

N

i ,3

(

u

)

=

 0 u ≤ t i  u − t u − t i i
0
u ≤ t
i
u − t
u − t
i
i
*
t
u
t
i
i + 1
t
− t
t
− t
i
+
2
i
i +
1
i
u − t
t
− u
t
− u
u − t
i
i + 2
i
+ 3
i + 1
*
+
*
t
t
1 u
≤ +
i
+
i
2
t
− t
t
− t
t
− t
t
− t
i +
2
i
i
+
2
i
+
1
i
+
3
i
+
1
i
+
2
i
+
1
t
− u
t
− u
i + 3
i + 3
*
t
t
2 u
≤ +
i
+
i
3
t
− t
t
− t
i
+
3
i
+
1
i
+
3
i
+
2
0
u ≥ t
i + 3

Hình 5.5(a) minh hoạ đồ thca N 0,3 (u), phn đồ thnm trên trc hoành ta co thchia thành ba phn tm gi là phn bên trái, phn gia và phn bên phi. Hình 5.5(b) minh hocác

đon đồ thkhác 0 ca N i,3 , 0i2, phn bên trái và phn gia ca N 3,3 (u), phn bên trái ca

N 4,3(u) .

N 3 , 3 (u), ph ầ n bên trái c ủ a N 4,3(u) .

Hình 5.5 Xét trên đon [t i ,t i+1 ], 2in bao gm ba phn đồ th: Phn bên trái ca đồ thN i,3 , phn gia ca đồ thN i-1,3 và phn bên phi ca đồ thN i-2,3 . Do đó trên đon [t i ,t i+1 ], 2in ta có:

(

C u

) = 

u   P

t

+ 

t

i + 1

u

*

t

i + 1

u

t

i 1

*

t

i + 1

u

t

i + 2

u

*

u

t

i

P + 

i 1

u

t

i

u

t

i

t

i

+

1

t

i

1

t

i

+ 1

i

i 2

t

i

+

1

t

i

1

t

i

+ 1

t

i

t

i

+

2

t

i

t

i

+

1

t

i

t

i

+

2

t

i

t

i

+

1

t

i

+

*

P

i

Hsca P i-2 là phn bên phi ca N i-2,3 , hsca P i-1 là phn gia ca N i-1,3 , hsca P i là phn bên trái ca N i,3 và tng ba hsnày bng 1 vi mi u thuc [t i ,t i+1 ]. Đồ thj ca C(u)là mt đưòng cong được minh hotrên hình 5.5(c). Ví d: Thc hin chương trình bSpline.c

3.2 Lnh GLU hin thị đường cong B-spline Trước hết ta to mt đối tượng NURBS (Non-Uniform Rational B-Spline) và trvmt con trti mt đối tượng mi bng lnh:

GLUnurbsObj* gluNewNurbsRenderer (void; Thiết lp các thuc tính ca đối tượng NURBS bng lnh:

gluNurbsProperty(GLUnurbsObj *nobj, GLenum property,GLfloat value) (Tham kho các tham svà ý nghĩa trong OpenGL ebook)

8

Bt đầu mt đường cong NURBS bng lnh:

gluBeginCurve (GLUnurbsObj *nobj) Khi to và biu din mt đưòng cong NURBS ta dùng lnh:

gluNurbsCurve (GLUnurbsObj *nobj, GLint uknot_count, GLfloat *uknot, GLint u_stride, GLfloat *ctlarray, GLint uorder, GLenum type) Lnh trên định nghĩa mt đưòng cong NURBS cho đối tượng nobj, tham suknot_count chỉ địng slượng đim nút, con tr*uknot chỉ đến mng cha các nút, tham su_stride chkhong cách gia hai đim điu khin, con tr*ctlarray chỉ đến mng các đim điu khin, tham suorder xác định bc ca các hàm B-spline, tham stype xác định kiu ca các đim điu khin(GL_MAP1_VERTEX_3 hoc GL_MAP1_VERTEX_4) Kết thúc biu din mt đường cong NURBS bng lnh:

gluEndCurve (GLUnurbsObj *nobj)

Ví d: Thc hin chương trình splineCurveOrder3.c, ví dnày to mt đường cong B- spline bc 3 và cho phép di chuyn các đim điu khin cũng như các nút. Ví d: Thc hin chương trình splineCurveOrder4.c, ví dnày to mt đường cong B- spline bc 4 và cho phép di chuyn các đim điu khin cũng như các nút.

4. Mt cong B-spline

4.1 Cách xây dng mt cong B-spline Phương trình mt cong B-spline có dng như sau:

n

u

n

v

S(u,v)= 0 Ni,m1(u)Nj,m2(v)Pij Trong đó Pij là giá trị đim điu khin trong ma trn hai chiu (nu+1)*(nv+1). Các giá trm1-1 và m2-1 thiết lp bc ca các hàm B-spline theo hai biến u và v.

4.2 Lnh GLU hin thmt cong B-spline (NURBS)

Ngoài các lnh ging như khi hin thị đưòng cong NURBS, mt cong NURBS sdng hai lnh sau để bt đầu và kết thúc mt mt cong NURBS

i =

0

j

=

gluBeginSurface (GLUnurbsObj *nobj) gluEndSurface (GLUnurbsObj *nobj) Khi to và biu din mt cong NURBS bng lnh:

gluNurbsSurface (GLUnurbsObj *nobj, GLint uknot_count, GLfloat *uknot, GLint vknot_count, GLfloat *vknot, GLint u_stride, GLint v_stride, GLfloat *ctlarray, GLint uorder, GLint vorder, GLenum type)

Các tham sca lnh tương tnhư lnh gluNurbsCurve().

9