9장 곡선과 곡면 한림대학교 정보통신공학부 송 창근

Download Report

Transcript 9장 곡선과 곡면 한림대학교 정보통신공학부 송 창근

9장 곡선과 곡면
한림대학교
정보통신공학부
송 창근
목차
•
•
•
•
•
•
•
•
•
•
•
•
곡선과 곡면의 표현
설계 기준들
매개 변수형 3차 다항식 곡선
보간법
Hermite 곡선과 곡면
Bezier 곡선과 곡면
3차 B-스플라인 (Cubic B-spline)
일반적인 B-스플라인
곡선과 곡면의 렌더링
Uta 찻주전자
대수 곡면
OpenGL에서의 곡선과 곡면
9.6 Bezier Curves and
Surface
그림 9.16 접선의 근사
9.6.1 Bezier Curves
Cubic Parametric polynomial
P(u )  c0  c1u  c2u  c3u
2
3
  ck u
k 0
T 
u c
k
3
1
 
 u 
u 2
u 
 3
u 
 c0 
c 
  1
c
c2 
 
 c3 
9.6.1 Bezier Curves
4개의 control points: P0 P1 P2 P3
p0  P(0)  c0
보간점들
*
p3  P(1)  c0  c1  c2  c3
p(u )  c1  2c2u  3c3u 2
p1  p0
 3( p1  p0 )  c1
1
3
p  p2
p(1)  3
 3( p3  p2 )  c1  2c2  3c3
1
3
p(0) 
9.6.1 Bezier Curves
C=MBP, Bezier geometry matrix
c0  p0
c1  3 p1  3 p0
c2  3 p2  6 p1  3 p0
c3   p0  3 p1  3 p2  p3
0
0
c0   1
 c   3 3
0
1
 
 c2   3  6 3
  
c3    1 3  3
0  p0 
0  p1 
0  p2 
 
1  p3 
9.6.1 Bezier Curves
p0 , p1 , p2 , p3 , p4 , p5 , p6 , p7 ,..., pn
T
p(u )  u M B p
 b(u ) p
T
where


c  MB p
0
0
1
 3 3
0
T
b(u )  M B u  
 3 6 3

 1 3  3
0
0
0

1
T
1
u 
 
u 2 
 3
u 
9.6.1 Bezier Curves
1  3 3  1   1 
0 3  6 3   u 
 
b(u )  
2
0 0


3 3 u 

 3 
0
1  u 
0 0
1  3u  3u 2  u 3   (1  u ) 3 


2
3 
2
3u  6u  3u  3u (1  u ) 



2
3
 3u  3u
 3u 2 (1  u )

 

3
3
u

  u

9.6.1 Bezier Curves
Blending
함수
 (1  u ) 3 

2
3u (1  u ) 

b(u ) 
3u 2 (1  u )


3
 u

d=3인 경우
These 4 polynomials are one case of the Bernstein
polynomial
d!
bk ,d (u ) 
u k (1  u ) d k
k!(d  k )!
9.6.1 Bezier Curves
d!
bk ,d (u ) 
u k (1  u ) d k
k!(d  k )!
(1)
(2)
0  bid (u)  1
d
b
i 0
id
(u )  1
3
p (u )   bi (u ) pi
i 0
By (1) & (2), p(u) is a
convex sum
bo(u)
b1(u)
b3(u)
b2(u)
그림 9.17 Bezier 삼차에 대한 배합 다항식
그림 9.18 convex hull과 bezier 다항식
9.6.2 Bezier Surface
Patches
그림 9,19 Bezier 곡면 단편
9.6.2 Bezier Surface Patches

P  [ pij ]
4ⅹ4 array of control points
The corresponding Bezier Patch is
T
T
p(u, v)   bi (u)b j (v) Pij  u M B pM B v
3
3
i 0 j 0
P00 , P03 , P30 , P33 의 점은 보간함
Consider the corner for u=v=0
P(0,0)  p00
P
(0,0)  3( p10  p00 )
u
P
(0,0)  3( p01  p00 )
v
P
(0,0)  9( p00  p01  p10  p11 )
uv
Twist
twist
그림 9,20 Bezier 곡면 단편의 구석에서의 꼬임
9.7 Cubic B-Spline
• Not require the polynomial to interpolate any of these
points
그림 9.21 중간의 두 점들 사이에 하나의 곡선을 정의하고 있는 네 개의 점
9.7.1 The Cubic B-spline Curve
그림 9.21 중간의 두 점들 사이에 하나의 곡선을 정의하고 있는
네 개의 점
9.7.1 The Cubic B-spline Curve
• C2 continuity at the join points with a cubic
• As u goes from 0 to 1, we span only the distance
between the middle two control points.
{ pi 3 , pi  2 , pi 1 , pi }  pi  2 , pi 1  q(u )
{ pi  2 , pi 1 , pi , pi 1}  pi 1 , pi  p(u )
{ pi 1 , pi , pi 1 , pi  2 }  pi , pi 1
T

p (u )  u M s p
T

q (u )  u M s q
 Pi  2 
p 
  i 1 
p
 pi 


 pi 1 
 Pi 3 
p 
  i 2 
q
 pi 1 


 pi 
1
p (0)  q (1)  ( pi  2  4 pi 1  pi )
6
1
p(0)  q(1)  ( pi  pi  2 )
2
T 
p(u )  u c
where


c  Ms p
1
p(0)  c0  c0  ( pi  2  4 pi 1  pi )
6
1
p(0)  c1  c1  ( pi  pi  2 )
2
1
p(1)  c0  c1  c2  c3  ( pi  2  4 pi 1  pi )
6
1

p (1)  c0  2c2  3c3  ( pi 1  pi 1 )
2


c  Ms p
Ms :B-Spline Geometry Matrix
4
1
c0 
1
c 
 3 0
3
1
1
  
 c2  6  3  6 3
 

 1 3  3
c3 
0  pi  2 



0  pi 1 
0  pi 


1  pi 1 
Blending function b(u)


(1  u )3


2
3
1  4  6u  3u 
T
b(u )  M s u 
6 1  3u  3u 2  3u 3 


3
u


(1)
0  bi (u )  1
3
(2)
 b(u )  1
i 0
• C2 continuity. Smooth at the join points
• 3 times the work as compared with Bezier or
interpolating cubics
그림 9,23 스플라인 곡선에 대한 컨벡스헐
9.7.2 B-스플라인과 기저함수
단일 제어점의 총기여도는 Bi (u ) pi
기에서 Bi 는 아래와 같다.
로 쓰여질 수 있고, 여
u i2
0
b (u  2) i  2  u  i  1
 0

i 1  u  i
b1 (u  1)
Bi (u )  
i  u  i 1
b2 (u )
b3 (u  1) i  1  u  i  2


u i2
0
9.7.2 B-스플라인과 기저함수
제어점 p0 ,..., pm 의 집합이 주어졌을 때 아래와 같은 하나
의 수식으로 전체 스플라인을 기술할 수 있다.
m 1
p (u )   Bi (u  i ) pi
i 1
그림 9.24 스플라인 기저 함수
9.7.3 스플라인 곡면
3
p(u, v)  
i 0
3
 b (u)b (v) p
j 1
i
j
그림 9.26 스플라인 곡면 단편
ij
9.8 일반적인 B-스플라인
• M+1 개의 제어점의 p0 , p1 ,..., pm 집합을 가정하자. 일반적
인 근사 문제는 구간 umin  u  umax 사이에서 정의되는 부드럽
고, 어떤 의미에서 제어점들과 가까운 함수p(u)  [ x(u), y(u), z (u)]
를 찾는 것이다.
• 아래와 같은 매듭점(knot)이라고 하는 값들의 집합 {u k }
umin  u0  u1  ...  un  umax
•스플라인에서 함수 p(u)는 매듭점들 사이의 d 차 다항식
이다
d
p(u )   c jk u j
j 0
uk  u  uk 1
9.8.1 순환적으로 정의된
B-스플라인
기저함수 또는 배합함수들의 집합을 사용해서 스플라인을
정의하는 것이다.
m
p (u )   Bid (u ) pi
i 0
Bid (u ) : 매듭점을 제외하고는 d 차 다항식이고, 구간의
바깥쪽에서 0 이다.
Cox-deBoor 순환에 의하여 정의되는 스플라인 집합
1, uk  u  uk 1
Bk 0  
 0, otherwise
u  uk
uk  d  u
Bkd 
Bk ,d 1 (u ) 
Bk 1,d 1 (u )
uk  d 1  uk
uk  d  uk 1
Bk 0
한 개의 구간에서 상수값, 다른 구간에서 0
Bk1
두 개의 구간에서 일차식, 다른 구간에서 0
Bk 2
세 개의 구간에서 이차식, 다른 구간에서 0
Bkd
d+1 개의 구간 u k 과
다른 구간에서 0
u k d 1
에서 d 차식,
• At the knots, there is Cd-1 continuity
• The Convex hull property holds because
m
B
i 0
id
(u )  1
and
0  Bid (u )  1
• d-1 “extra” knot values : the recursion requires u0
and un+d to define spline from u0 and un+1
그림 9.27 처음 세 개의 기저 함수
9.8.2 Uniform Splines
• Knot sequence {0,1,2, …, n}
• Between knots k and k+1, we use the control points
pk 1 , pk , pk 1 , pk  2
• We have a curve defined for only the interval u-1
and u=n-1.
9.8.2 Uniform Splines
그림 9.28 균일 B-스플라인
Periodic: use the periodic nature of the
control point data to define the spline
그림 9.29 주기적인 균일 B-스플라인
9.8.3 Nonuniform B-spline
• Open spline
• If a knots has multiplicity d+1, the B-spline
of degree d must interpolate the points.
Ex) For cubic B-spline,
{0,0,0,0,1,2,,…, n-1,n,n,n,n}
• One solution to the problem of the spline
not having sufficient data to span the
desired interval is to repeat knots at the
ends.
9.8.4 NURBS
• Nonuniform rational B-spline curve
• Retain the properties such as Convex
hull, Continuity
• Use the weights wi to increase /
decrease the importance of the
particular control points.
• It is handled correctly in perspective
view.
n
B (u ) wi pi
1

i 0 i , d
p(u ) 
q(u ) 
n
w(u )
 Bi,d (u)wi
i 0
9.9 Rendering of Curves and
Surfaces
n
p (u )   ci u i ,0  u  1
i 0
• Horner’s method : n 번의 +/- and *’s
p(u)  c0  u(c1  u(c2  u(...  cnu)))
• If the points {ui} are uniformly spaced, we can use
the method of forward difference to evaluate p(uk )
using O(n) +/- and no *’s.
( 0) p (uk )  p (uk )
(1) p(uk )  ( 0) p(uk 1 )  ( 0) p(uk )  p(uk 1 )  p(uk )
( m 1) p (uk )  ( m ) p (uk 1 )  ( m ) p (uk )
If uk 1  uk  h
is constant, then we can show that
If p(u) is a polynomial of degree n,
constant for all k
( n ) p (u k )
is
그림 9.30 전향 차분 표의 구성
그림 9.31 전향 차분표의 사용
( m 1)

p(uk 1 )  
(m)
( m 1)
p(uk )  
p(uk )
9.9.2 Recursive Subdivision of Bezier
Polynomials
• Rendering Methos based on Recursive Subdivision
-use of the convex hull
- never requires explicit evaluation of the polynomial
• We can break the curve into two separate poly l(u), r(u)
each valid over one-half of the original interval.
-l(u) traces the left half of p(u), and r(u) the right
half of p(u).
- l(u) and r(u) has 4 control points {l0, l1, l2, l3} and
{r0, r1, r2, r3}
-The convex hulls for l and r must lie inside the
convex hull for p (variation-diminishing property)
그림 9.32 컨벡스 헐과 제어점들
• We can test the convex hull for flatness by measuring
the derivation of I1 and I2 from the line segmant
connecting I0 and I3. If they are not close, we can divide
l into two halves and test the two new convex hull for
flatness.
그림 9.33 분할 곡선의 구성
l 0  p0
r3  p3
1
l1  ( p0  p1 )
2
1
r2  ( p2  p3 )
2
1
1
l2  (l1  ( p1  p2 ))
2
2
1
1
r1  (r2  ( p1  p2 ))
2
2
1
l3  r0  (l2  r1 )
2
9.9.3 Rendering of other Polynomial
Curves by Subdivision
• Consider a cubic Bezier curve
p(u )  u M B p
T
Where MB is the Bezier geometry Matrix
• The Efficiency of the Bezier subdivision algorithm is
such that we usually are better off converting another
curve form to Bezier form and then using the
subdivision
9.9.3 Rendering of other Polynomial
Curves by Subdivision
•
The any polynomial can be written as
p(u )  u Mq
T
1
q  M MB p
• For the conversion between cubic B-spline and
cubic Bezier curves, it is
1
0
1
1
Ms MB 
6 0

0
4 1 0
4 2 0
2 4 0

1 4 1
p (u )  u M s q
T
q  M s1M B p
9.9.4 Subdivision of Bezier
Surfaces
그림 9.34 삼차 Bezier 곡면
16 control points. Each 4 points in a row and column
그림 9.35 첫 번째 분할 후의 제어점들
• First, we apply our curve-subdivision to the 4
curves determined by the 16 control points in the u
direction.
• For each of u = 0, 1/3, 2/3, 1, we create two
groups of 4 control points, with the middle point
shared by each group
7 points along each
original curve
그림 9.36 두 번째 분할 후의 제어점들
• We now subdivide in the v direction using these
points. Consider the rows of constant v, where v is
one of 0, 1/3, 2/3, 1. There are 7 groups of 4 points
• Each time creating two groups of 4 points, again
with the middle point shared.
그림 9.36
그림 9.37 분할된 사분면
• Each quadrant contains 16 points that are the
control points for a subdivided Bezier surface.
• 곡면의 평평도(flatness)를 측정하는 작업이 곡선에 비
하여 매우 어렵다. 따라서, 대부분의 경우 subdivision의
횟수를 미리 지정해 준다.
9.10 The Utah Teapot
그림 9.38 렌더링된 찻주전자
( A wire frame at 3 levels of subdivision)
9.10 The Utah Teapot
• An example of recursive subdivision of a set of cubic
Bezier patches
• Created at the University of Utah by M. Newell for
testing various rendering algorithms
• Used for 20 years in the graphics community
• consists of the control points for 32 bicubic Bezier
patches, 306 vertices.
- body (12 patches), handle (4 patches), spout ( 4),
lid (8), bottom (4)
A simple Rendering with constant shading
Void draw_patch(point p[4][4])
{
glBegin(GL_QUADS);
glvertex3fv(p[0][0]);
glvertex3fv(p[3][0]);
glvertex3fv(p[3][3]);
glvertex3fv(p[0][3]);
glEnd();
}
Void divide_curve(point c[4], point r[4], point l[4])
{
Int I;
Point t;
For (I=0; I<3; I++)
{
l[2][I]=(t[I] + l[1][I] )/2;
l[0][I]=c[0][I];
r[1][I]=(t[I] + r[2][I] )/2;
r[3][I]=c[3][I];
l[3][I]=r[0][I]=(l[2][I]+r[1][I])/2;
l[1][I]=(c[1][I]+c[0][I])/2;
r[2][I]=(c[2][I]+c[3][I])/2;
t[I]=(l[1][I]+r[1][I])/2;
}
}
Void divide_patch(point p[4][4], int n)
{
Point q[4][4], r[4][4], s[4][4], t[4][4];
Point a[4][4], b[4][4];
Int I,j,k;
If (n==0) draw_patch(p);
Else
{
for (k=0; k<4; k++) divide_curve(p[k], a[k], b[k]);
transpose(a);
transpose(b);
for (k=0; k<4; k++)
{
divide_curve(a[k], q[k], r[k]);
divide_curve(b[k], s[k], t[k]);
}
divide_patch(q, n-1);
divide_patch(r, n-1);
divide_patch(s, n-1);
divide_patch(t, n-1);
}}
9.12 Curves and Surfaces in
OpenGL
• Evaluator : compute values for the
Bernstein polynomials of any order
• We can use evaluator one, two, three, and
four dimensional curves and surfaces.
• We might use one dimensional curves to
define color maps or paths in time for
animation.
• GLU library to provide NURBS
9.12.1 Bezier Curves
• Bezier example program : Bezier.exe
•
glMap1f(GL_MAP1_VERTEX_3, // type of data geberated
0.0f
// lower u range
100.f
// upper u range
3,
// distance between points in the data, stride
nNumberPoints,
// number of control points, 4
&ctrlPoints[0][0]);
// Array of control points
• GL_MAP1_VERTEX_3 :
– generates vertex coord triplet (x, y and z)
• GL_MAP1_VERTEX_4 :
– generates the coord and an alpha components
• Stride : 각 vertex가 3개의 실수들로 표현되므로 이 경우에는 3
이다.
9.12.1 Bezier Curves
• glEnable(GL_MAP1_VERTEX_3)
– Enable the evaluator
• glEvalCoord1f( )
– Takes a single argument : a parametric values along the curve
– This function then evaluates the curve at this value and calls
glVertex internally for that points
– By looping through the domain of the curve and calling
glEvalCoord to produce vertices.
– glBegin (GL_LINE_STRIP)
for(i=0; I <= 100; I++)
{
glEvalCoord1f(I);
}
glEnd();
Evaluating a curve
• glMapGrid와 glEvalMesh의 사용
– glEvalCoord1f의 사용 대신에 좀 더 쉬운 방법이
있다.
– glMapGrid1d (100, 0.0, 100.0) : tells OpenGL to
create an evenly spaced grid of points(100)
over the u domain (from 0.0 to 100.0)
– glEvalMesh1(GL_LINE, 0,100): connect the dots
using the primitive specified(GL_LINE)
A 3D Surface
• Create a Bezier Surface : BEZ3D.EXE
– Creating a 3D Bezier surface is much like the
2D version
glMap2f(GL_MAP2_VERTEX_3, // Type of data generated
0.0,
// Lower u range
10.0
// Upper u range
3,
// Distance between points in the data, stride
3,
// Dimension in u direction (order)
0.0,
// Lower v range
10.0,
// Upper v range
9,
// Distance between points in the data, stride
3,
// Dimension in v direction (order)
&ctrlPoints[0][0][0]); // array of control points
A 3D Surface
• glEnable(GL_MAP2_VERTEX_3) : Enable the
evaluator
• glMapGrid2f(10, 0.0, 10.0, 0.0, 10.0)
– Map a grid of 10 points from 0 to 10 in u and also in v
• glEvalMesh2(GL_LINE, 0, 10, 0, 10)
– Evaluate the grid, using lines
Lighting and Normal Vector
• BEZLIT.EXE 프로그램
• glMapGrid2f(10, 0.0, 10.0, 0.0, 10.0)
– Map a grid of 10 points from 0 to 10 in u and also in v
• glEvalMesh2(GL_FILL, 0, 10, 0, 10)
– Evaluate the grid, using lines0
– glEnable(GL_AUTO_NORMAL)
9.12.3 NURBS functions
• Creating a NURBS Surface
// NURBS object pointer
GLUnurbsObj *pNurb = NULL;
…
// Setup the NURBS object
pNurb = gluNewNurbsRenderer();
…
• NURBS Properties
// Set sampling tolerance, 곡면을 정의하는 Mesh의 조밀도를 조정함.
gluNurbsProperty(pNurb, GLU_SAMPLING_TOLERANCE, 25.0f)
// Fill to make a solid surface
gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, (Glfloat)GLU_FILL)
• Define the surface
// Begin the NURB definition
// Done with surface
gluBeginSurface(pNurb);
gluEndSurface(pNurb);
// Evaluate the surface
gluNurbsSurface(pNurb,
8, knots,
// No. of knots and knots array u direction
8, knots,
// No. of knots and knots array v direction
4*3,
// Distance between control points in u
3,
// Distance between control points in v
&ctrlpoints[0][0][0],
// Control points
4,4,
// u and v order of surface
GL_MAP2_VERTEX_3);
// Type of surface, 곡면의 형식 혹은 종류 (x,y,z)
Trimming