第9章自由曲面の表現 - 名大の授業 (NU OCW)はじめに. . . . . . . . . . . ....
Transcript of 第9章自由曲面の表現 - 名大の授業 (NU OCW)はじめに. . . . . . . . . . . ....
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
.
.
. ..
.
.
第 9章 自由曲面の表現
畔上 秀幸
名古屋大学 情報科学研究科 複雑系科学専攻
May 24, 2012
1 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.1 はじめに
(目標) CG で使われる自由曲面を作成するための技術について理解する.
2 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.2 自由曲面とは
ここでは,自由曲面を次のように定義する..定義 9.1 (自由曲面)..
.
. ..
.
.
平面や円筒面,球面では表現できない曲面を自由曲面 (free-formsurface) という.
3 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
パラメトリック表現
§9.2.1 パラメトリック表現任意の曲線は,1変数による関数で表現できる.
..1 a, b ∈ R3 を固定して,ξ ∈ R を変数とすれば,
p (ξ) = a+ ξb
は,直線を表す.
»=0»
a
b
x1
x2
x3
図 1: 直線のパラメトリック表現
4 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
パラメトリック表現
§9.2.1 パラメトリック表現 (cnt.)
..2 a, b, c ∈ R3, |b| = |c| = 1, b · c = 0, r ∈ R を固定して,θ ∈ [−π, π]を変数とすれば,
p(θ) = a+ r cos θb+ r sin θc
は円を表す.
µ={¼
µ
µ=¼
a
x1
x2
x3
b
cr µ
図 2: 円のパラメトリック表現
5 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
パラメトリック表現
§9.2.1 パラメトリック表現 (cnt.)
任意の曲面は,2変数による関数で表現できる...1 a, b, c ∈ R3, |b| = |c| = 1, b · c = 0, を固定して,ξ = (ξ1, ξ2)
T ∈ R2 ((·)T は転置を表す) を変数とすれば,
p (ξ) = a+ ξ1b+ ξ2c
は平面を表す.
»1
»2
a
b
c
x1
x2
x3
図 3: 平面のパラメトリック表現
6 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
パラメトリック表現
§9.2.1 パラメトリック表現 (cnt.)
..2 a, b, c,d ∈ R3, |b| = |c| = |d| = 1, b · c = 0, b · d = 0, c · d = 0,r, h ∈ R, r > 0, h > 0, を固定して,(θ, ξ) ∈ [−π, π]× [0, h] を変数とすれば,
p(θ, ξ) = a+ r cos θb+ r sin θc+ ξd
は円筒面を表す.
7 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
パラメトリック表現
§9.2.1 パラメトリック表現 (cnt.)
»
µ={¼µ
µ=¼
x3
x1
x2
a
b
c
d
図 4: 円筒面のパラメトリック表現
8 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ
自由曲面を表現するために次のように定義される曲線セグメントあるいは曲面パッチが使われる..定義 9.2 (曲線セグメントと曲面パッチ)..
.
. ..
.
.
全体の曲線あるいは曲面を複数の曲線あるいは曲面を接続して表現するとき,単位となる曲線を曲線セグメント (curve segment),曲面を曲面パッチ (surface patch) という.
曲線あるいは曲面を生成する際に次の点が課題となる.
..1 曲線あるいは曲面を思いどおりに制御できるか.
..2 複数の曲線セグメントや曲面パッチを滑らかに接続できるか.
9 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ (cnt.)
曲線の制御を容易にするために,点列から曲線を生成する方法が用いられる.以下,d ∈ {2, 3} を Euclid 空間の次元,[0, 1] あるいは [0, 1]
2
を曲線セグメントや曲面パッチの定義領域,n, n1, n2 ∈ N を曲線あるいは曲面を構成する関数の次数,m,m1,m2 ∈ N を曲線セグメントや曲面パッチの数を表すことにする.ただし,[0, 1] = {ξ ∈ R | 0 ≤ ξ ≤ 1},(0, 1) = {ξ ∈ R | 0 < ξ < 1}, (0, 1] = {ξ ∈ R | 0 < ξ ≤ 1} とかくことにする.
10 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ (cnt.)
.定義 9.3 (制御点)..
.
. ..
.
.
曲線あるいは曲面を点列を変数として構成するとき,その点列を制御点(control points),点列が作る多角形を制御多角形 (control polygon) という.
q1
q2
q3
q4
図 5: 制御点と制御多角形
11 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ (cnt.)
.定義 9.4 (曲線セグメントの一般式)..
.
. ..
.
.
q1, · · · , qm ∈ Rd を制御点とする.ξ ∈ [0, 1] に対して
p (ξ) =∑
i∈{1,··· ,m}
ϕi (ξ) qi
を曲線セグメントの一般式という.ここで,ϕ1, · · · , ϕm : R → R はξ ∈ [0, 1] に対して ∑
i∈{1,··· ,m}
ϕi (ξ) = 1 (9.1)
を満たす関数とする.
12 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ (cnt.)
(注)
..1 定義 9.4 で使われた関数 ϕi (ξ) は CG ではブレンディング関数(blending function) とよばれる.数値解析では基底関数 (basisfunction) とよばれる.
..2 (9.1) の条件は,全ての制御点が同じ点 q = qi, i ∈ {1, · · · ,m}, のとき,p (ξ) = q となることを保証する.
13 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ (cnt.)
.定義 9.5 (曲面パッチの一般式)..
.
. ..
.
.
q11, · · · , qm1m2 ∈ R3 を制御点とする.ξ = (ξ1, ξ2)T ∈ [0, 1]
2 に対して
p (ξ) =∑
i∈{1,··· ,m1}
∑j∈{1,··· ,m2}
ϕ1i (ξ1)ϕ2j (ξ2) qij
を曲面パッチの一般式という.ここで,ϕ11, · · · , ϕ2m2 : R → R はξ ∈ [0, 1] に対して∑
i∈{1,··· ,m1}
ϕ1i (ξ) = 1,∑
j∈{1,··· ,m2}
ϕ2j (ξ) = 1
を満たす関数とする.
14 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
曲線セグメントと曲面パッチ
§9.2.2 曲線セグメントと曲面パッチ (cnt.)
q11q21
q31
q41
q12
q13q14
q24
q34
q44q42q43
q22
q32
q23
q33
図 6: 制御点と曲面パッチ
15 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線
これ以降,ブレンディング関数を具体的に与えたときのいくつかの代表的な曲線についてみていこう.まず,Bezier 曲線についてみてみる.以下,d ∈ {2, 3} を Euclid 空間の次元,n ∈ N を Bezier 曲線の次数を表すことにする.Bezier 曲線では,Bernstein 基底関数をブレンディング関数に用いる.
.定義 9.6 (Bernstein 基底関数)..
.
. ..
.
.
ξ ∈ [0, 1], i ∈ {1, · · · , n+ 1}, ξ ∈ [0, 1] に対して
bi,n (ξ) = nCi−1 (1− ξ)n−(i−1)
ξi−1
=n!
(i− 1)! (n− {i− 1)}!(1− ξ)
n−(i−1)ξi−1
を n 次の Bernstein 基底関数 (Bernstein basic function) あるいはBernstein 多項式 (Bernstein polynomial) という.
16 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
Bezier 曲線は次のように定義される..定義 9.7 (Bezier 曲線)..
.
. ..
.
.
b1,n, · · · , bn+1,n を n 次の Bernstein 基底関数,q1, · · · , qn+1 ∈ Rd を制御点とするとき,ξ ∈ [0, 1] に対して
p (ξ) =∑
i∈{1,··· ,n+1}
bi,n (ξ) qi
を n 次の Bezier 曲線 (Bezier curves) という.
Bezier 曲線はブレンディング関数の条件を満たす.実際,∑i∈{1,··· ,n+1}
bi,n (ξ) = {(1− ξ) + ξ}n = 1
が成り立つ.
17 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
»0 10.5
0
1
0.5
b1,3
b2,3 b3,3
b4,3
図 7: 3次の Bernstein 基底関数
18 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
Bezier 曲線は,制御点 q1, · · · , qn+1 ∈ Rd を用いて
p (ξ) =∑
i∈{1,··· ,n+1}
bi,n (ξ) qi
となる.
q1
q2 q3
q4
q1
q2
q3
q4
図 8: 3次の Bezier 曲線
19 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
Bezier 曲線は次の特徴をもつ.
..1 Bezier 曲線の包絡線 (envelope) は凸閉包性 (convex hull property)をもつ.すなわち,ξ ∈ [0, 1] に対して∑
i∈{1,··· ,n+1}
bi,n (ξ) = 1, bi,n (ξ) > 0
が成り立つ.この性質は,2つの立体の干渉チェックに利用される.
20 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
q1
q2 q3
q4
q1
q2
q3
q4
図 9: Bezier 曲線の凸閉包性
21 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
..2 制御多角形と曲線は類似する.a 制御多角形を滑らかにした形状となる.b 端点を通る.p (0) = q1, p (1) = qn+1
c 端点における ξ に対する微分は端点に隣接した制御点の位置で決まる.実際,後で示す命題 9.1 より,1階微分について
dp (0)
dξ= n (q2 − q1) , (9.2)
dp (1)
dξ= n (qn+1 − qn) (9.3)
が成り立つ.さらに,2階微分について
d2p (0)
dξ2= n (n− 1) {(q3 − q2)− (q2 − q1)} , (9.4)
d2p (1)
dξ2= n (n− 1) {(qn+1 − qn)− (qn − qn−1)} (9.5)
が成り立つ.
22 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
q1
q2
q3
q4(q3{q2){(q2{q1)
図 10: Bezier 曲線の微分と制御点の関係
23 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.).命題 9.1 (Bezier 曲線の微分)..
.
. ..
.
.
p : [0, 1] → R を Bezier 曲線とする.このとき
dp (ξ)
dξ= n
∑i∈{1,··· ,n}
bi,n−1 (ξ) (qi+1 − qi)
がなりたつ.
(証明) Bezier 曲線は
p (ξ) =∑
i∈{1,··· ,n+1}
bi,n (ξ) qi =∑
i∈{1,··· ,n+1}nCi−1 (1− ξ)n−(i−1) ξi−1qi
= nC0 (1− ξ)n q1 + nC1 (1− ξ)n−1 ξq2 + nC2 (1− ξ)n−2 ξ2q3+
· · ·+ nCnξnqn+1
とかける.そこで,
dp (ξ)
dξ= n (−1) nC0 (1− ξ)n−1 q1 + (n− 1) (−1) nC1 (1− ξ)n−2 ξq2
24 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
+ nC1 (1− ξ)n−1 q2 + (n− 2) (−1) nC2 (1− ξ)n−3 ξ2q3
+ 2 nC2 (1− ξ)n−2 ξq3 + · · ·+ n nCnξn−1qn+1
= n{(
n−1C0 (1− ξ)n−1 q2 − n−1C0 (1− ξ)n−1 q1
)+
(n−1C1 (1− ξ)n−2 ξq3 − n−1C1 (1− ξ)n−2 ξq2
)+ · · ·+
(n−1Cn−1ξ
n−1qn+1 − n−1Cn−1ξn−1qn
)}= n
∑i∈{1,··· ,n}
n−1Ci−1 (1− ξ)n−1−(i−1) ξi−1 (qi+1 − qi)
= n∑
i∈{1,··· ,n}
bi,n−1 (ξ) (qi+1 − qi)
を得る. �
25 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
..3 Bezier 曲線を 2つの Bezier 曲線に分割することができる.p : [0, 1] → R を Bezier 曲線として,ある η ∈ [0, 1] に対して,
qi,0 (η) = qi i ∈ {1, · · · , n+ 1}qi,j (η) = (1− η) qi,j−1 (η) + ξqi+1,j−1 (η)
i ∈ {1, · · · , n+ 1} , j ∈ {1, · · · , n}q1,n (η) = p (η)
が成り立つ.ここで,qi,j (η) は,図 11 のように,制御多角形の各辺を η : (1− η) に内分した点で構成される.この関係を用いてBezier 曲線を η : (1− η) に分割する方法を De Casteljau (ド・カステリョ) のアルゴリズム (De Casteljau’s algorithm) という.
26 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
q1,3(´)
q1,2(´)
q2,2(´)
q2,1(´)
q3,1(´)
q3,0(´)=q3
q4,0(´)=q4
q2,0(´)=q2
q1,0(´)=q1
q1,1(´)
図 11: Bezier 曲線の分割
27 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
..4 2つの Bezier 曲線を連続性を保って接続することができる.a 2つの Bezier 曲線の端点を一致させると C0 級 (曲線の長さ方向の座標に対する 0階微分が連続) となる.
b (9.2) と (9.3) より,さらに,接続している端点とその隣の制御点が同じ直線上におくと C1 級となる.
c (9.4) と (9.5) より,さらに,図 12 のように,ξ に対する 2階微分のベクトルが同じ方向となるように接続している端点とその隣およびその隣の制御点をおくと C2 級となる.
q3
q4=r1q2
q1
r2
r3
r4
図 12: Bezier 曲線の接続
28 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
..5 Bezier 曲線の形状を変えずに次数を上げることができる.n 次のBezier 曲線は
p (ξ) =∑
i∈{1,··· ,n+1}
bi,n (ξ) qi =∑
i∈{1,··· ,n+1}nCi−1 (1− ξ)
n−(i−1)ξi−1qi
=∑
i∈{1,··· ,n+1}
{(1− ξ) + ξ} nCi−1 (1− ξ)n−(i−1)
ξi−1qi
=∑
i∈{1,··· ,n+1}nCi−1
{(1− ξ)
n+1−(i−1)ξi−1
+ (1− ξ)n−(i−1)
ξ(i−1)+1}qi
=∑
i∈{2,··· ,n+1}
(1− ξ)n+1−(i−1)
ξi−1(nCi−1qi + nC(i−1)−1qi−1
)+ (1− ξ)
n+1q1 + ξn+1qn+1
29 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.3 Bezier 曲線 (cnt.)
とかける.一方,n+ 1 次の Bezier 曲線を
p′ (ξ) =∑
i∈{1,··· ,n+2}
bi,n+1 (ξ) q′i
=∑
i∈{1,··· ,n+2}n+1Ci−1 (1− ξ)
n+1−(i−1)ξi−1q′
i
とおく.p (ξ) = p′ (ξ) となるためには,
n+1Ci−1q′i = nCi−1qi + nC(i−1)−1qi−1 (9.6)
q′1 = q1, q′
n+2 = qn+1
であればよいことになる.(9.6) は
q′i =
(1− i− 1
n+ 1
)qi +
i− 1
n+ 1qi−1
とかくこともできる.30 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
有理 Bezier 曲線
§9.3.1 有理 Bezier 曲線
これまで Bezier 曲線についてみてきたが,実は,Bezier 曲線では円や楕円などの円錐曲線を正確に表現することができない.それを克服するために,有理 Bezier 曲線が考案された..定義 9.8 (有理 Bezier 曲線)..
.
. ..
.
.
b1,n, · · · , bn+1,n を n 次の Bernstein 基底関数,q1, · · · , qn+1 ∈ Rd を制御点,w1, · · · , wn+1 ∈ R を重みとするとき,ξ ∈ [0, 1] に対して
p (ξ) =
∑i∈{1,··· ,n+1} bi,n (ξ)wiqi∑i∈{1,··· ,n+1} bi,n (ξ)wi
を n 次の有理 Bezier 曲線 (Rational Bezier curves) という.
31 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
有理 Bezier 曲線
§9.3.1 有理 Bezier 曲線 (cnt.)
有理 Bezier 曲線を用いれば円錐曲線が表現できることをみてみよう.円錐曲線とは,関数表現
f (x) = c11x21 + 2c12x1x2 + c22x
22 + 2c13x1 + 2c23x2 + c33
=(x1 x2 1
)c11 c12 c13c12 c22 c23c13 c23 c33
x1
x2
1
= 0
を満たす x = (x1, x2)T ∈ R2 で構成された 2次曲線である.このよう
な円錐曲線は,2次の有理 Bezier 曲線を用いて
p (ξ) =b1,2q1 + b2,2w2q2 + b3,2q3
b1,2 + b2,2w1 + b3,2
とかける. ここで,
32 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
有理 Bezier 曲線
§9.3.1 有理 Bezier 曲線 (cnt.)
..1 w2 = 0 ならば直線
..2 w2 ∈ (0, 1) ならば楕円曲線
..3 w2 = 1 ならば放物線
..4 w2 > 1 ならば双曲線
となる.また,図 13 (b) のように制御点を選んだとき,
w2 = cos θ
とおけば,円弧となる [1].
33 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
有理 Bezier 曲線
§9.3.1 有理 Bezier 曲線 (cnt.)
q3
w2=10q2
q1
w2=1
w2=1/p2
w2=0
w2={1/2
w2={1/p2
q3
q2
q1
µ µ
(a) 円錐曲線 (b) 円弧
図 13: 2次の有理 Bezier 曲線による円錐曲線
34 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲線
§9.3.2 OpenGL による Bezier 曲線
OpenGL によって Bezier 曲線を描くために必要となる関数について説明する.
35 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲線
§9.3.2 OpenGL による Bezier 曲線 (cnt.)
.glMap1f()..
.
. ..
.
.
void glMap1f(GLenum target, GLfloat u1, GLfloat u2,
GLint stride, GLint order, const GLfloat *points);
• target: 1次元エバリュエータで生成する値の種類を指定する.• GL MAP1 VERTEX 3 (頂点座標 x, y, z)• GL MAP1 VERTEX 4 (頂点座標 x, y, z, w)• GL MAP1 COLOR 4 (R, G, B, A) , GL MAP1 INDEX (カラー指標)• GL MAP1 NORMAL (法線座標)• GL MAP1 TEXTURE COORD 1~4 (テクスチャ座標)
• u1, u2: glEvalCoord1f で使用する変数 u の範囲 (例:u1 = 0.0, u2= 1.0)
• stride: 制御点の座標がメモリされている間隔 (GLfloat 数)
• order: 制御点の数 (次数+ 1)
• points: 制御点配列のポインタ
36 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲線
§9.3.2 OpenGL による Bezier 曲線 (cnt.)
実際の描画では,図 14 のようなサンプリング点を次の関数で計算し,折れ線を描いていく..glEvalCoord1f()..
.
. ..
.
.
void glEvalCoord1f(GLfloat u);
エバリュエータ(glMap1f)で計算する座標 u を指定する.
q3
q2
q1
»=1
q4
»=0
図 14: Bezier 曲線の制御点とサンプリング点
37 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲線
§9.3.2 OpenGL による Bezier 曲線 (cnt.)
.glPointSize()..
.
. ..
.
.
void glPointSize(GLfloat size) ;
描画する点の直径を指定する.初期値は 1.0 である.
38 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲線
§9.3.2 OpenGL による Bezier 曲線 (cnt.)
Bezier 曲線を描く..program9 1.c..
.
. ..
.
.
...
static GLfloat ctrlpoint[4][3] = {{-1.5, -1.8, 0.0}, /* 制御点の決定 */
...
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoint[0][0]);
/* 1次元エバリュエータの定義 */
...
glBegin(GL_LINE_STRIP);
for(ii1=0; ii1<=30; ii1++){
glEvalCoord1f((GLfloat)ii1/30.0);
/* サンプリング点を指定 */
}
glEnd();
...
39 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲線
§9.3.2 OpenGL による Bezier 曲線 (cnt.)
図 15: OpenGL で描かれた Bezier 曲線
40 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
Bezier 曲線の特徴と問題点
§9.3.3 Bezier 曲線の特徴と問題点
次の B-スプライン曲線に移る前に,Bezier 曲線の特徴と問題点についてみておこう.Bezier 曲線は次の特徴をもつ.
..1 制御点の移動が曲線全体に影響する.
..2 曲線の次数を決めると制御点の数が決められてしまう.
したがって,次のような問題が生ずる.
..1 セグメント数を少なくして,次数を上げれば,高次の振動が発生しやすくなる.
..2 セグメント次数を多くすれば,接続条件の扱いが煩雑になる.
41 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線
Bezier 曲線はいくつかの問題点をもっていた.B-スプライン曲線(B-spline curves) はそれらの問題点をもたない曲線である.B は基底(basis) の意味で,スプラインは雲形定規の意味で使われている.以下,d ∈ {2, 3} を Euclid 空間の次元,n ∈ N を B-スプライン曲線の次数,m ∈ N を基底関数の数 (制御点の数) を表すことにする.
42 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
B-スプライン曲線の定義を示そう.Bezier 曲線のセグメントに対するパラメータ ξ ∈ [0, 1] に対応して,B-スプライン曲線ではノット (knot)ξ1 ≤ · · · ≤ ξn+m+1 を定義して,ξ ∈ [ξ1, ξn+m+1] とおく.i ∈ {1, · · · ,m} に対して図 16 のような j ∈ {0, · · · , n} 次の基底関数bi,j を次のように定義する.
1
»»i+1»i »i+2 »i+3 »i+4
bi,0
bi,1
bi,2
bi,3
図 16: B-スプライン曲線の基底関数
43 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
.定義 9.9 (B-スプライン基底関数)..
.
. ..
.
.
i ∈ {1, · · · ,m}, j ∈ {0, · · · , n}, ξ ∈ [ξi, ξi+n+1] に対して
bi,0 (ξ) =
{1 ξ ∈ [ξi, ξi+1)
0 ξ /∈ [ξi, ξi+1),
bi,j (ξ) =ξ − ξi
ξi+j − ξibi,j−1 (ξ) +
ξi+j+1 − ξ
ξi+j+1 − ξi+1bi+1,j−1 (ξ) (9.7)
を j 次の B-スプライン基底関数という.ただし,(9.7) において,分母ξi+j − ξi, ξi+j+1− ξi+1 が 0 (重複ノット) のときは,その項を 0 とおく.
(9.7) は Cox-de Boor の漸化式とよばれる.
44 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
»»1 »2 »3 »4 »5 »6 »7 »8
b1,2 b2,2 b3,2 b4,2 b5,2
n = 2, m = 5
»»1 »2 »3 »4 »5 »6 »7 »8
b1,3 b2,3 b3,3 b4,3
n = 3, m = 4
図 17: ノットと B-スプライン基底関数
45 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
bi,n を用いて,B-スプライン曲線を次のように定義する..定義 9.10 (B-スプライン曲線)..
.
. ..
.
.
b1,n, · · · , bm,n を n 次の B-スプライン基底関数,q1, · · · , qm ∈ Rd を制御点とするとき,ξ ∈ [ξ1, ξn+m+1] に対して
p (ξ) =∑
i∈{1,··· ,m}
bi,n (ξ) qi
を n 次の B-スプライン曲線 (B-spline curves) という.
46 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
ノット ξ1, · · · , ξn+m+1 の配置と B-スプライン曲線の関係は次のようになる.
..1 ノット ξ1, · · · , ξn+m+1 が等間隔に配置されているとき,一様(uniform) ノットとよび, B-スプライン曲線の端点と制御点 q1,qm は一致しない (図 18).
..2 ノットの両端で n+ 1 個のノットが重複しているとき,すなわちξ1 = · · · = ξn+1, ξm+1 = · · · = · · · = ξn+m+1 のとき,開一様(open uniform) ノットとよび,B-スプライン曲線の端点と制御点q1, qm は一致する (図 19).図 19 (b) のときの B-スプライン基底関数を図 20 に示す.この図の b1,3, · · · , b4,3 は図 7 の 3次のBernstein 基底関数と一致する (証明してみよ).すなわち,3次のBezier 曲線と一致する.
..3 ノットの中間で n 個のノットが重複しているとき,すなわちξi = · · · = ξi+n−1 のとき,B-スプライン曲線と制御点が一致し,カスプ (cusp) となる (図 21).
47 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
q3
q2
q1
q5q4
q1 q4
q3q2
n = 2, m = 5, n = 3, m = 4,{ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8} {ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8}
= {0, 1, 2, 3, 4, 5, 6, 7} = {−3,−1, 1, 3, 5, 7, 9, 11}
図 18: 一様ノットの B-スプライン曲線 (d = 2)
48 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
q3
q2
q1
q5q4
q1 q4
q3q2
n = 2, m = 5, n = 3, m = 4,{ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8} {ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8}
= {0, 0, 0, 1, 2, 3, 3, 3} = {0, 0, 0, 0, 1, 1, 1, 1}
図 19: 開一様ノットの B-スプライン曲線 (d = 2)
49 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
111000
»1 »2 »3 »4 »5 »6 »7 »8
10
1
»
b1,3 b4,3
b2,3 b3,3
b4,0
b3,1 b4,1
b2,2 b4,2b3,2
n = 3, m = 4, {ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8} = {0, 0, 0, 0, 1, 1, 1, 1}
図 20: 開一様ノットの B-スプライン基底関数 (d = 2)
50 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
q3
q2
q1
q2q1
n = 2, m = 5, {ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8} = {0, 1, 2, 3, 3, 4, 5, 6}
図 21: 中間ノットを重ねた B-スプライン曲線 (d = 2)
51 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.4 B-スプライン曲線 (cnt.)
B-スプライン曲線は次の特徴をもつ.
..1 制御点の数 m は,n+ 1 以上であればいくつでもよい.複数のセグメントにまたがって曲線が定義される.n << m ととれば,制御点の移動による影響はその制御点の回り n+ 1 個のセグメントに限定される.
..2 ξ ∈ [ξ1, ξn+m+1] に対して凸閉包性∑i∈{1,··· ,m}
bi,n (ξ) ≤ 1, bi,n (ξ) > 0
が成り立つ.
..3 セグメント間は n− 1 階微分まで連続となる.
..4 ノットベクトルにノットを挿入し,曲線と形状を変えないように新しいノットベクトルを持つ曲線を求めることができる (Oslo アルゴリズムとよばれる [1]).
52 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
NURBS 曲線
§9.4.1 NURBS 曲線
これまで B-スプライン曲線についてみてきたが,B-スプライン曲線でも円や楕円などの円錐曲線を正確に表現することができない.それを克服するために,非一様な有理 B-スプライン (Non-Uniform RationalB-Spline) 曲線を NUEBS 曲線が考案された..定義 9.11 (NURBS 曲線)..
.
. ..
.
.
b1,n, · · · , bm,n を n 次の B-スプライン基底関数,q1, · · · , qm ∈ Rd を制御点,w1, · · · , wm ∈ R を重みとするとき,ξ ∈ [ξ1, ξn+m+1] に対して
p (ξ) =
∑i∈{1,··· ,n+1} bi,n (ξ)wiqi∑i∈{1,··· ,n+1} bi,n (ξ)wi
を n 次の NURBS 曲線 (NURBS curves) という.
NURBS 曲線は,中間ノットを多重化することによって複数の曲線を接続したような曲線も1セグメントで表せるなど,表現力の高さが評価されて,IGES (Initial Graphics Exchange Specification) に取り入れられた.
53 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
NURBS 曲線
§9.4.1 NURBS 曲線 (cnt.)
2次の B-スプライン基底関数を使って円錐曲線が描けることをみてみよう.ノットと重みを
{ξ1, · · · , ξ12} = {0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4}
{w1, · · · , w9} =
{1,
1√2, 1,
1√2, 1,
1√2, 1,
1√2, 1
}とおき,図 22 のように制御点を配置すれば,円が描ける.
54 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
NURBS 曲線
§9.4.1 NURBS 曲線 (cnt.)
q3
q2q9=q1
q5 q4
q7
q8
q6
図 22: 2次の B-スプライン曲線による円
55 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線
OpenGL によって NURBS 曲線を描くために必要となる関数について説明する..gluNewNurbsRenderer()..
.
. ..
.
.
GLUnurbs* gluNewNurbsRenderer(void);
NURBS オブジェクトのポインタを作成する.
56 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.)
.gluNurbsProperty()..
.
. ..
.
.
void gluNurbsProperty(GLUnurbs* nurb, GLenum property,
GLfloat value);
• nurb: NRUBS オブジェクトを指定する.• property: 属性を指定する.
• GLU SAMPLING TOLERANCE• GLU DISPLAY MODE• GLU CULLING• GLU AUTO LOAD MATRIX• GLU PARAMETRIC TOLERANCE• GLU SAMPLING METHOD• GLU U STEP, GLU V STEP• GLU NURBS MODE EXT
57 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.)
.
.
. ..
.
.
• value: 属性の値を指定する.• property に GLU SAMPLING TOLERANCE を指定した場合,サンプリング点の間隔 (ピクセル値,初期値 50.0 ピクセル) を指定する.
• property に GLU DISPLAY MODE を指定した場合,次の描画方法を指定する.
• GLU FILL (多角形の集合として描画,初期値)• GLU OUTLINE PORYGON(多角形の輪郭のみ描画)
58 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.).gluNurbsCurve()..
.
. ..
.
.
void gluNurbsCurve(GLUnurbs* nurb, GLint uknotcount,
GLfloat* uknot, GLint ustride, GLfloat* ctrarray,
GLint uorder, GLenum type);
• nurb: NRUBS オブジェクトを指定する.• uknotcount: ノットベクトルの数を指定する.• uknot: ノットベクトルの配列を指定する.• ustride: 制御点の座標がメモリされている間隔 (GLfloat 数) を指定する.
• ctrarray: 制御点の配列を指定する.• uorder: 曲線の次数 +1 を指定する.• type: 次のエバリュエータ形式を指定する.
• GL MAP1 VERTEX 3:制御点• GL MAP1 VERTEX 4:同次座標による制御点
59 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.)
NURBS 曲線で円を描く..program9 2.c..
.
. ..
.
.
...
/* NURBS曲線を描画するための設定 */
NurbsObj = gluNewNurbsRenderer(); /* NURBS オブジェクトを作る */
gluNurbsProperty(NurbsObj, GLU_SAMPLING_TOLERANCE, 3.0); /*
サンプリング数*/
...
gluBeginCurve(NurbsObj);
gluNurbsCurve(NurbsObj, 12, knots, 4, &ctrlpoint[0][0],
3, GL_MAP1_VERTEX_4);
gluEndCurve(NurbsObj);
...
60 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.)
図 23: OpenGL で描かれた NURBS 曲線による円
61 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.)
NURBS曲線を分割する..program9 3.c..
.
. ..
.
.
...
static GLfloat ctrlpoint1[6][4] = {{-2.0, ...
...
static GLfloat ctrlpoint2[7][4] = {{ -2.0, ...
...
static GLfloat ctrlpoint3[4][4] = {{ -2.0-0.1, ...
...
static GLfloat ctrlpoint4[4][4] = {{-0.23+0.1, ...
...
gluBeginCurve(NurbsObj);
gluNurbsCurve(NurbsObj, 10, knots1, 4,
&ctrlpoint1[0][0], 4, GL_MAP1_VERTEX_4);
gluEndCurve(NurbsObj);
...
62 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL よる NURBS 曲線
§9.4.2 OpenGL よる NURBS 曲線 (cnt.)
図 24: OpenGL で描かれた NURBS 曲線による円
63 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.5 Bezier 曲面
ここからは,3次元空間上の曲面について考えよう.Bezier 曲面(Bezier surface) は次のように定義される.
q11q21
q31
q41
q12
q13q14
q24
q34
q44q42q43
q22
q32
q23
q33
図 25: 3次の Bezier 曲面
64 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.5 Bezier 曲面 (cnt.)
.定義 9.12 (Bezier 曲面)..
.
. ..
.
.
b1,n, · · · , bn+1,n を n 次の Bernstein 基底関数,q11, · · · , qn+1n+1 ∈ Rd
を制御点とするとき,ξ = (ξ1, ξ2)T ∈ [0, 1]
2 に対して
p (ξ) =∑
i∈{1,··· ,m1}
∑j∈{1,··· ,m2}
bi,n (ξ1) bj,n (ξ2) qij
を n 次の Bezier 曲面 (Bezier surface) という.
65 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.5 Bezier 曲面 (cnt.)
Bezier 曲面は次の特徴をもつ.
..1 凸閉包性がある.
..2 制御多面体面と曲面は類似する.a 制御多面体面を滑らかにした形状となる.b 4つの端点を通る.c 端点における ξ1 および ξ2 に対する偏微分は端点に隣接した制御点の位置で決まる.実際,1階微分について
∂p
∂ξ1(0, ξ2) = n
∑i∈{1,··· ,m2}
bi,n (ξ2) (q2i − q1i) ,
∂p
∂ξ2(ξ1, 0) = n
∑i∈{1,··· ,m1}
bi,n (ξ1) (qi2 − qi1)
が成り立つ.さらに,2階微分について,隣り合う曲面を滑らかに接続するためには,接続する端点で両立性条件 (compatibility condition)
∂
∂ξ2
∂p
∂ξ1(0, 0) = 9 (q22 − q21 − q12 + q11) ,
66 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.5 Bezier 曲面 (cnt.)
∂
∂ξ2
∂p
∂ξ1(1, 0) = 9 (qn+1 2 − qn+1 1 − qn2 + qn1) ,
∂
∂ξ2
∂p
∂ξ1(0, 1) = 9 (q2n+1 − q2n − q1n+1 + q1n) ,
∂
∂ξ2
∂p
∂ξ1(1, 1) = 9 (qn+1n+1 − qn+1n − qnn+1 + qnn)
を満たすように制御点を配置する必要がある.
67 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
有理 Bezier 曲面
§9.5.1 有理 Bezier 曲面
Bezier 曲面の境界は Bezier 曲線となる.そこで, Bezier 曲線では円錐曲線を正確に表現することができなかったことがここでも問題となる.それを克服するために,有理 Bezier 曲面が考案された..定義 9.13 (有理 Bezier 曲面)..
.
. ..
.
.
b1,n, · · · , bn+1,n を n 次の Bernstein 基底関数,q11, · · · , qn+1n+1 ∈ Rd
を制御点,w11, · · · , wn+1n+1 ∈ R を重みとするとき,ξ = (ξ1, ξ2)
T ∈ [0, 1]2 に対して
p (ξ) =
∑i∈{1,··· ,n+1}
∑j∈{1,··· ,n+1} bi,n (ξ1) bj,n (ξ2)wijqij∑
i∈{1,··· ,n+1}∑
j∈{1,··· ,n+1} bi,n (ξ1) bj,n (ξ2)wij
を n 次の 有理 Bezier 曲面 (Rational Bezier surface) という.
有理 Bezier 曲面は, Bezier 曲面の特徴に加えて,2次曲面を正確に表現できる特徴をもつ.
68 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲面
§9.5.2 OpenGL による Bezier 曲面
OpenGL によって Bezier 曲面を描くために必要となる関数について説明する.
69 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲面
§9.5.2 OpenGL による Bezier 曲面 (cnt.)
.glMap2f()..
.
. ..
.
.
void glMap2f(GLenum target, GLfloat u1, GLfloat u2,
GLint ustride, GLint uorder, GLfloat v1, GLfloat v2,
GLint vstride, GLint vorder, const GLfloat *points);
• target: 2次元エバリュエータで生成する値の種類を指定する.• GL MAP2 VERTEX 3 (頂点座標 x, y, z)• GL MAP2 VERTEX 4 (頂点座標 x, y, z, w)• GL MAP2 COLOR 4 (R, G, B, A) , GL MAP2 INDEX (カラー指標)• GL MAP2 NORMAL (法線座標)• GL MAP2 TEXTURE COORD 1~4 (テクスチャ座標)
• u1, u2, v1, v2 : glEvalCoord2f で使用する変数 u, v の範囲• ustride, vstride : 制御点の座標がメモリされている間隔 (GLfloat 数)
• uorder, vorder : 制御点の数 (次数+ 1)
• points: 制御点配列のポインタ
70 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲面
§9.5.2 OpenGL による Bezier 曲面 (cnt.)
実際の描画では,サンプリング点を次の関数で計算し,平面を描いていく..glEvalCoord2f()..
.
. ..
.
.
void glEvalCoord2f(GLfloat u, GLfloat v);
エバリュエータ(glMap2f)で計算する座標 u, v を指定する.
.glMapGrid2f()..
.
. ..
.
.
void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2,
GLint vn, GLfloat v1, GLfloat v2);
均等な un 間隔で u1 から u2, v1 から v2 まで均等な vn 間隔で 2次元メッシュを定義する.
71 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲面
§9.5.2 OpenGL による Bezier 曲面 (cnt.)
.glEvalMesh2()..
.
. ..
.
.
void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1,
GLint j2) ;
エバリュエータ (glMapGrid2f) で計算する点,線,多角形の種類とグリッドの範囲を指定する.
• mode : GL POINT,GL LINE,GL FILL を設定する.• i1, i2, j1, j2 : 最初と最後の整数値を指定する.
72 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲面
§9.5.2 OpenGL による Bezier 曲面 (cnt.)
Bezier 曲面を描く..program9 4.c..
.
. ..
.
.
...
static GLfloat ctrlpoint[4][4][3] = { /* 制御点の決定 */
...
/* 2次元エバリュエータ */
glMap2f(GL_MAP2_VERTEX_3, 0.0, 1.0, 3*4, 4,
0.0, 1.0, 3, 4, &ctrlpoint[0][0][0]);
...
glBegin(GL_POLYGON);
glEvalCoord2f((GLfloat)ii2/30.0, (GLfloat)ii1/20.0);
glEvalCoord2f((GLfloat)(ii2+1)/30.0, (GLfloat)ii1/20.0);
glEvalCoord2f((GLfloat)(ii2+1)/30.0, (GLfloat)(ii1+1)/20.0);
glEvalCoord2f((GLfloat)ii2/30.0, (GLfloat)(ii1+1)/20.0);
glEnd();
...
73 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による Bezier 曲面
§9.5.2 OpenGL による Bezier 曲面 (cnt.)
図 26: OpenGL で描かれた Bezier 曲面
74 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
§9.6 NURBS 曲面
最後に,NURBS 曲面 (NURBS surface) を考えよう.NURBS 曲面は次のように定義される..定義 9.14 (NURBS 曲面)..
.
. ..
.
.
b1,n1 , · · · , bm1,n1 , b1,n2 , · · · , bm2,n2 を n1 次および n2 次の B-スプライン基底関数,q11, · · · , qm1m2 ∈ Rd を制御点,w11, · · · , wm1m2 ∈ R を重みとするとき,ξ = (ξ1, ξ2)
T ∈ [ξ11, ξn1+m1+1]× [ξ11, ξn2+m2+1] に対して
p (ξ) =
∑i∈{1,··· ,m1}j∈{1,··· ,m2} bi,n1 (ξ1) bj,n2 (ξ2)wijqij∑i∈{1,··· ,m1}j∈{1,··· ,m2} bi,n1 (ξ1) bj,n2 (ξ2)wij
を n1 次および n2 次の NURBS 曲面 (NURBS surface) という.
NURBS 曲面は,NURBS 曲面の特徴に加えて,2次曲面を正確に表現できる特徴をもつ.また,中間ノットを多重化することで複数の曲面を接続したような曲面を表せる.
75 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による NURBS 曲面
§9.6.1 OpenGL による NURBS 曲面
OpenGL によって NURBS 曲面を描くために必要となる関数について説明する..gluNurbsSurface()..
.
. ..
.
.
void gluNurbsSurface(GLUnurbs* nurb,
GLint sknotcount, GLfloat* sknots, GLint tknotcount,
GLfloat* tknots, GLint sstride, GLint tstride,
GLfloat* control, GLint sorder, GLint torder,
GLenum type);
76 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による NURBS 曲面
§9.6.1 OpenGL による NURBS 曲面 (cnt.)
.
.
. ..
.
.
• nurb: NRUBS オブジェクトを指定する.• sknotcount, tknotcount: u, v 方向のノットの数を指定する.• sknots, tknots: u, v 方向のノットの配列を指定する.• sstride, tstride: u, v 方向の制御点の座標がメモリされている間隔(GLfloat 数) を指定する.
• control : 制御点の配列を指定する.• sorder, torder: u, v 方向の次数を指定する.• type: 曲面の型式を指定する.
• GL MAP2 VERTEX 3 :制御点• GL MAP2 COLOR 4 :同次座標による制御点
77 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による NURBS 曲面
§9.6.1 OpenGL による NURBS 曲面 (cnt.)
実際の描画では,サンプリング点を次の関数で計算し,平面を描いていく..gluBeginSurface()..
.
. ..
.
.
void gluBeginSurface(GLUnurbs* nurb),
void gluEndSurface(GLUnurbs* nurb);
NURBS 曲面の定義の範囲を設定する.
78 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による NURBS 曲面
§9.6.1 OpenGL による NURBS 曲面 (cnt.)
NURBS 曲面を描く..program9 5.c..
.
. ..
.
.
...
static GLfloat ctrlpoint[4][4][3] = { /* 制御点の決定 */
...
gluBeginSurface(NurbsObj);
gluNurbsSurface(NurbsObj, 8, knots, 8, knots, 4*3, 3,
&ctrlpoint[0][0][0], 4, 4, GL_MAP2_VERTEX_3);
gluEndSurface(NurbsObj);
...
79 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による NURBS 曲面
§9.6.1 OpenGL による NURBS 曲面 (cnt.)
図 27: OpenGL で描かれた NURBS 曲面
80 / 81
. . . . . .
はじめに. . . . . . . . . . . .自由曲面とは
. . . . . . . . . . .Bezier 曲線
. . . . . . . . . . .B-スプライン曲線
. . . . . . .Bezier 曲面
. . . . . .NURBS 曲面
OpenGL による NURBS 曲面
参考文献
[1] 鳥谷浩志, 千代倉弘明.3次元 CADの基礎と応用.共立出版, 1991.
[2] 嘉数侑昇, 古川正志.CAD/CAM/CGのための形状処理工学入門.森北出版, 1995.
[3] James D. Foley, Steven K. Feiner, Andries van Dam, John F. Hughes,佐藤義雄 (訳).コンピュータグラフィックス 理論と実践.オーム社, 2001.
[4] 今野晃市.3次元形状処理入門ー3次元 CGと CADへの基礎ー.サイエンス社, 2003.
81 / 81