8. 自由曲線・曲面
1. 概論
2. ベジエ曲線・曲面
1. ベジエ曲線・曲面の数学
2. OpenGLによる実行
3. NURBS1. スプライン関数
2. Bスプライン曲線・曲面
3. NURBS曲線・曲面
4. OpenGLによる実行
8.1 自由曲線と曲面の概要
陽関数
陰関数
パラメータ表現された3次元曲線
パラメータ表現は,x,y,x毎のパラメータによる陽関数表現
形状普遍性・座標独立性
曲線上の点を直接に計算可能
多価の曲線も表現可能
低次の多項式は,計算と操作が容易な関数
曲線は短い区間で定義された低次(3次)の多項式を結合して表現される
xfy xgzxfy ,
0, yxf 0,,,0,, zyxgzyxf
tzztyytxx ,,
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 = ax3+bx2+cx+dと表現できる。しかし、座標関数では、ひとつの y 値に対し複数の x が求まる可能性がある。そこで、座標
位置を P として、時間 t の関数として表わす。すると前式は
P(t) = at3+bt2+ct+d (t=0 →1) ---[1]と表現できる。
時間の関数にすることで、その経路を一筆書きでなぞるような表現になり、ある時間 t が経過後の位置は
必ず一意に求められるようになる
8.2 ベジエ曲線と曲面
ベジエ曲線と曲面の数学
1.8
0001010012331122
1
3
2
1
0
23
QQQQ
ttttP
3.81
2.81
111
000
Qp
Qp
e
e
5.8
000100
322322
1
4.8
0001010012331122
1
3
2
1
0
23
11
00
1
0
23
QQQQ
pppppppppp
ttt
QQpQQp
ttttP
e
e
8.2 ベジエ曲線と曲面
ベジエ曲線と曲面の数学
7.8
23
1
1
211
6.8
33
22
21
20
1
1
0
0
3210
tppttX
tpttXtpttX
tpttX
QQQQ
tXtXtXtXtPe
e
9.8101
8.8
,
0,
tttjn
tB
QtBtP
jjnnj
n
jjnj
ベジエ曲線の重み付け関数であるバーンスタイン多項式t=0ではB0,3(t)のみ0でないため曲線はQ0を補完するt=1ではB3,3(t)のみ0でないため曲線はQ4を補完する
8.2 ベジエ曲線と曲面
ベジエ曲線と曲面の数学
12.81
11.81
10.8,
,
,
0 0,,
jjnnj
iinmi
m
i
n
jijnjmi
vvjn
vB
uuim
uB
QvBuBvuP
13.8,
,
,1
,0
10
11110
00100
,,1,0
vB
vBvB
QQQ
QQQQQQ
uBuBuBvuP
nn
n
n
mnmm
n
n
mmmm
8.2 ベジエ曲線と曲面
ベジエ曲線と曲面の数学
8.2 ベジエ曲線と曲面
OpenGLによるベジエ曲線の生成と表示
1. ベジエ曲線のパラメータtの範囲と制御点群の座標値を関数glMap1f()に与え
2. 関数glEvalCoord1f()でベジエ曲線上のパラメータtに対応する点の座標値が作成され,表示される
• glEvalCoord1f()は,与えられた頂点座標値を表示するglVertex()と同様の機能がある
• glEvalCoord1f()は,頂点の座標値を与える関数glVertex()と同様に,頂点リストを作成する関数glBegin()と関数glEnd()の間で呼出す
OpenGLによるベジエ曲面の生成と表示
1. ベジエ曲面のパラメータu,vのそれぞれの範囲と制御点群(曲面定義ネット)の座標値を関数glMap2f()に与え
2. 関数glEvalCoord2f()でベジエ曲面上ののパラメータu,vn対応する点の座標値が作成され,表示される
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. 曲線の法線ベクトルの計算方法やシェーディングの方法を設定する
3. 関数glMap2f()とglEvalMesh2()によっても同様にベジエ曲面の表示が可能
/* 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-M+2個のBスプライン曲線セグメントで構成される
14.80
,
n
jjMj QtNtP
000,0;
15.80
1
0,1
10,
tNttnoteotherwise
ttttN
jjj
jjj
16.8
;1
1,11
1,1
, tNtttt
tNtt
tttN
M
MjjMj
MjMj
jMj
jMj
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個のノットが存在する
18.8111132
3100009876543210
tttttttttt
8.3 NURBA Bスプライン曲線と曲面
格子状に与えられた制御点ベクトルQ00,Q01,・・・,Q0n,・・・,Qm0,・・・,Qmnとそれぞれの階数が
KとLのBスプライン関数Ni,K(u),N j,L(v)によって生成され
るBスプライン曲面パッチP(u,v)は次式で与えられる
Bスプライン曲面は,局所的な制御点ベクトルによっての
み定義されているため,制御点ベクトルの変更の曲面形状への影響が局所的に限定される
19.8,0 0
,,
m
i
n
jijLjKi QvNuNvuP
20.8,
,
,1
,
10
11110
00100
,,1,0
vN
vNvN
QQQ
QQQQQQ
uNuNuNvuP
Ln
L
Lo
mnmm
n
n
KmKK
8.3 NURBANURBA曲線と曲面
Bスプライン関数を用いた有理多項式による曲線式と曲面式が考案されている
Bスプライン曲線は,制御点Qiに付随する重みwjを導入して次式で表す
有理Bスプライン間曲面は,制御点Qijに付随する重みwijを導入して次式で表す
20
21.8
0,
0,
Mnt
wtN
QwtNtP n
jjMj
n
jjjMj
20,20
22.8,
0 0,,
0 0,,
LnvKmu
wvNuN
QwvNuNvuP m
i
n
jijLjKi
m
i
n
jijijLjKi
8.3 NURBAOpenGL
エバリュエータ
曲線や曲面を発生させるための多項式や有理多項式を計算し,表示する
GLU関数NURBA曲線・曲面の生成と表示は, GLU関数群として構築されている
生成・表示の手順
1. gluNewNurbsRenderer() によりNURBSポインタ the NurbaCurve を得る
2. gluNurbsPoperty() によりNURBS曲線の属性や表示方法を定義する
3. NURBSポインタと,配列knoptsに設定されたノットベクトルと配列controlpointsに設定された制御点群の座標値を関数gluNurbsCurve() に与えて,生成と表示を行う
4. 関数gluNurbsCurve() は,関数gluBeginCurve() と関数gluEndCurve() の間で呼出す
Top Related