8. 自由曲線・曲面

8. 自由曲線・曲面
概論
2. ベジエ曲線・曲面
1.
1.
2.
ベジエ曲線・曲面の数学
OpenGLによる実行
3. NURBS
1.
2.
3.
4.
スプライン関数
Bスプライン曲線・曲面
NURBS曲線・曲面
OpenGLによる実行
8.1 自由曲線と曲面の概要
y  f x 
 陽関数
y  f  x , z  g  x 
f  x, y   0
 陰関数
f x, y , z   0,
g  x, y , z   0
 パラメータ表現された3次元曲線
x  x t ,
y  y t ,
z  z t 
 パラメータ表現は,x,y,x毎のパラメータによる陽関数表現
 形状普遍性・座標独立性
 曲線上の点を直接に計算可能
 多価の曲線も表現可能
 低次の多項式は,計算と操作が容易な関数
 曲線は短い区間で定義された低次(3次)の多項式を結合
して
表現される
8.1 自由曲線と曲面の概要
 2次曲線:2次方程式で表現される(円錐曲線)

円,楕円,双曲線,放物線
 2次曲面:2次方程式で表現される曲面

球面,円柱面,円錐面,放物面,双曲面,双曲放物面
 通常の多項式による曲線は,2次曲面を厳密に表現できない
 2次曲面は,互いに中心投影の関係にある
 2次曲線に対してアフィン変換を行い,その後に射影変換(中心投影)を行い,任意の2次曲面を求める
 2次曲面を厳密に表現する有利多項式
 ファーガソンの曲線セグメントと曲面パッチ
 クーンズのクーンズ曲面パッチ
 ベジエのバーンスタイン基底関数を用いたベジエ曲線セグメントとベジエ曲面パッチ
8.1 自由曲線と曲面の概要
 曲線セグメントと曲面パッチの連続性
 接線までの連続性で,高次の連続性は困難
 リーゼンフェルト
 スプライン基底関数を用いたBスプライン曲線セグメントとBスプライン曲面パッチを考案
 ベジエ曲線セグメントやベジエ曲面パッチと同様に,位置ベクトルのみで生成でき,
接続において高次の連続性が表現できた
 2次曲線や2次曲面の厳密な表現は出来ない
 Bスプライン曲線セグメントとBスプライン曲面パッチを有理化する
 NURBS曲線
 NURBS曲面
 OpenGL
ベジエ曲線と曲面
 NURBS曲線と曲面

8.1 自由曲線と曲面の概要
 ファーガソン曲線
この曲線は始点位置、終点位置と、それらに対する接線 ベクトルの4つのパラメータにより表現できる3次
曲線
曲線のう ねりは、接線ベクトルの大きさで制御し,接線ベクトルを大きくすれば大きくうねり、小さければ、
与えた端点間を短い経路で結ぶ
• 3次曲線の方程式は
y = ax 3+bx 2+cx+d
と表現できる。しかし、座標関数では、ひとつの y 値に対し複数の x が求まる可能性がある。そこで、座標
位置を P として、時間 t の関数として表わす。すると前式は
P(t) = at 3+bt2+ct+d (t=0 →1)
---[1]
と表現できる。
時間の関数にすることで、その経路を一筆書きでなぞるような表現に なり、ある時間 t が経過後の位置は
必ず一意に求められるようになる
8.2 ベジエ曲線と曲面
 ベジエ曲線と曲面の数学
1  Q0 
 2 2 1
  3 3  2  1  Q 
3 2
 1 
P t   t t t 1 
0
0
1
0  Q2 

 
0
0
0  Q3 
1

Q0 e  Q0 

1 
Q0
p
8.1
8.2 
1 
8.3
Q1
p
Q0
1 
 2 2 1


  3 3  2  1 
Q1
3 2


P t   t t t 1 
0
0
1
0   p Q0 e  Q0  



0
0
0    p Q1e  Q1 
1
p
 p  2  p  Q0 
 2 p
 3  2 p  2 p p
Q 
3

p
3 2
 1 
 t t t1
 p
p
0
0  Q2 

 
0
0
0   Q3 
 1
Q1e  Q1 




8.4 
8.5
8.2 ベジエ曲線と曲面
 ベジエ曲線と曲面の数学
 Q0 
Q 
P t   X 0 t  X 1 t  X 2 t  X 3 t  0 e 
 Q1e 
 
 Q1 
 X 0 t   1  t 2 1  2  p t 

2
 X 1 t   pt 1  t 

2
 X 2 t   pt 1  t 

3
 X 3 t   t 3  p   p  2 t 
n
P t    B j ,n t Q j
8.6
8.7 
ベジエ曲線の重み付け関数であるバーンスタイン多項式
t=0ではB0,3(t)のみ0でないため曲線はQ0を補完する
t=1ではB3,3(t)のみ0でないため曲線はQ4を補完する
8.8
j 0
 n
n j
B j ,n t    1  t  t j  0  t  1
 j
8.9 
8.2 ベジエ曲線と曲面
 ベジエ曲線と曲面の数学
m
n
P u , v    Bi ,m u B j , n v Qij
8.10 
i 0 j 0
m
n i
Bi , m u    1  u  u i
i 
n
n j
B j , n v    1  v  v j
 j
8.11
8.12 
 Q00
Q
10
P u , v   B0, m u  B1,m u   Bm ,m u   


Qm 0


Q01
Q11
Qm1
 Q0 n   B0 ,n v 


 Q1n   B1, n v 

  



 Qmn   Bn , n v 
8.13
8.2 ベジエ曲線と曲面
 ベジエ曲線と曲面の数学
8.2 ベジエ曲線と曲面
 OpenGLによるベジエ曲線の生成と表示
ベジエ曲線のパラメータtの範囲と制御点群の座標値を関数
glMap1f()に与え
2. 関数glEvalCoord1f()でベジエ曲線上のパラメータtに対応す
る点の座標値が作成され,表示される
1.
glEvalCoord1f()は,与えられた頂点座標値を表示するglVertex()と同様の機能
がある
• glEvalCoord1f()は,頂点の座標値を与える関数glVertex()と同様に,頂点リス
トを作成する関数glBegin()と関数glEnd()の間で呼出す
•
 OpenGLによるベジエ曲面の生成と表示
ベジエ曲面のパラメータu,vのそれぞれの範囲と制御点群(曲
面定義ネット)の座標値を関数 glMap2f()に与え
2. 関数glEvalCoord2f()でベジエ曲面上ののパラメータu,vn対応
する点の座標値が作成され,表示される
1.
glEvalCoord2f()は,与えられた頂点座標値を表示するglVertex()と同様の機能
がある
 glEvalCoord2f()は,頂点の座標値を与える関数glVertex()と同様に,頂点リス
トを作成する関数glBegin()と関数glEnd()の間で呼出す

8.2 ベジエ曲線と曲面
 ベジエ曲面のシャーディング
1.
2.
3.
照明の属性や局面の材質を定義し
曲線の法線ベクトルの計算方法やシェーディングの方法を設定する
関数glMap2f()とglEvalMesh2()によっても同様にベジエ曲面の表示が可能
/* Bezier curves generate and display 8-1 */
GLfloat controlpoints[4][3]={{-4.0, -4.0, 0.0}, {-2.0, 4.0, 0.0},{2.0, 4.0, 0.0},{4.0, -4.0, 0.0}};
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &controlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
glBegin(GL_LINE_STROIP);
for(i=0; i<=30; ++1){
glEvalCood1f((GLfloat)(i/30.0));
}
glEnd();
8.2 ベジエ曲線と曲面
 ベジエ曲面のシャーディング
1.
照明の属性や局面の材質を定義し
2.
曲線の法線ベクトルの計算方法や
シェーディングの方法を設定する
関数glMap2f()とglEvalMesh2()によっ
ても同様にベジエ曲面の表示が可能
3.
/* Bezier curves generate and display 8-2 */
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &controlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glEnable(GL_AUTO_NORMAL);
glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0);
glEvalMesh2(FL_FILL, 0, 8, 0, 8);
/* Bezier curves generate and display 8-3 */
for(j=o; j<=8; j++){
glBegin(GL_LINE_STRIP);
for(i=0; i<=30; ++i){
glEvalCood2f((GLfloat)(i/30.0), (GLfloat)(j/8.0)));
}
glEnd();
glBegin(GL_LINE_STRIP);
for(i=0; i<=30; ++i){
glEvalCood2f((GLfloat)(i/30.0), (GLfloat)(j/8.0)));
}
glEnd();
8.3 NURBA
 スプライン関数
 制御点群を多項式で近似する場合,長い区間を1つの高次多項式で近
似すると,近似は良くなるが,安定性が低下し,扱う係数が増える
 複数の短い区間位分け,1つの短い区間を低次の多項式で近似する
 Bスプライン曲線と曲面
 n+1 個の制御点ベクトルQ0,Q2,・・・,Qnと,
Bスプライン関数NJ,M(t)から形成される,階数M,次数M-1の
Bスプライン曲線P(t)は,次式で表される
n
P t    N j ,M t Q j
8.14 
j 0
n-M+2個のBスプライン曲線セグメントで構成される
1 t j  t  t j 1 
8.15
N j , 0 t   
0 otherwise 
note ; t j  t j 1  N j ,0 t   0,
0 00
M  1;
N j , M t  
t tj
t j  M 1  t j
N j , M 1 t  
t j M  t
t j  M  t j 1
N j 1, M 1 t 
8.16 
8.3 NURBA
 Bスプライン曲線と曲面
Bスプラインは,m+1個の制御点の列Q0,Q2,・・・
Qm(m≧3)をm-2個の3次多項式曲線セグメント
から構成される曲線で近似する
m=3は特殊な例でただ1つの曲線セグメントP3が
存在し,Q0からQ3までの4つの制御点により
t3≦t<t4の区間で定義される
m≧4となるそれぞれのiに対して,パラメータtiに
おけるPi-1とPiの間の接続点(ノット)が存在する,
t3とtm+1における始点と終点もノットと呼ばれ,合
計m-1個のノットが存在する
t0 t1 t 2 t3 t 4 t5 t6 t7 t8 t9   0 0 0 0 1 2 1111

33

8.18
8.3 NURBA
 Bスプライン曲線と曲面
格子状に与えられた制御点ベクトル
Q 00,Q 01,・・・,Q 0n,・・・,Q m0,・・・,Q mnとそれぞれの階数が
KとLのBスプライン関数Ni,K(u),N j,L(v)によって生成され
るBスプライン曲面パッチP(u,v)は次式で与えられる
m
n
P u , v     N i , K u N j , L v Qij
8.19 
i 0 j  0
Bスプライン曲面は,局所的な制御点ベクトルによっての
み定義されているため,制御点ベクトルの変更の曲面
形状への影響が局所的に限定される
 Q00
Q
10
P u , v   N 0, K u  N1, K u  N m, K u  


Qm 0
Q01
Q11

Qm1
 Q0 n 
 Q1n 



 Qmn 
 N o , L v 
 N v 
 1, L 
  


 N n , L v 
8.20 
8.3 NURBA
 NURBA曲線と曲面
Bスプライン関数を用いた有理多項式による曲線式と曲面式が考案されている
Bスプライン曲線は,制御点Q iに付随する重みwjを導入して次式で表す
n
P t  
 N t w Q
j 0
n
j,M
j
 N t w
j ,M
j 0
j
8.21
j
0t nM 2
有理Bスプライン間曲面は,制御点Q ijに付随する重みw ijを導入して次式で表す
m
P u , v  
n
 N u N v w Q
i,K
j ,L
ij
ij
i 0 j 0
m
n
 N u N v w
i,K
j,L
8.22 
ij
i 0 j 0
0  u  m  K  2, 0  v  n  L  2
8.3 NURBA
 OpenGL
 エバリュエータ
曲線や曲面を発生させるための多項式や有理多項式を計算し,表示す
る
 GLU関数
NURBA曲線・曲面の生成と表示は, GLU関数群として構築されている
 生成・表示の手順
1. gluNewNurbsRenderer() によりNURBSポインタ the NurbaCurve を得る
2. gluNurbsPoperty() によりNURBS曲線の属性や表示方法を定義する
3. NURBSポインタと,配列knoptsに設定されたノットベクトルと配列controlpoints
に設定された制御点群の座標値を関数gluNurbsCurve() に与えて,生成と表
示を行う
4. 関数gluNurbsCurve() は,関数gluBeginCurve() と関数gluEndCurve() の間
で呼出す