80
9 章 自由曲面の表現 9 章 自由曲面の表現 畔上 秀幸 名古屋大学 情報学研究科 複雑系科学専攻 April 3, 2019 1 / 80

第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

第 9章 自由曲面の表現

畔上 秀幸

名古屋大学 情報学研究科 複雑系科学専攻

April 3, 2019

1 / 80

Page 2: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

はじめに

§9.1 はじめに

(目標) CG で使われる自由曲面を作成するための技術について理解する.

2 / 80

Page 3: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

§9.2 自由曲面とは

ここでは,自由曲面を次のように定義する.

定義 9.2.1 (自由曲面)

平面や円筒面,球面では表現できない曲面を自由曲面 (free-form surface) という.

3 / 80

Page 4: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

パラメトリック表現

§9.2.1 パラメトリック表現任意の曲線は,1つの媒介変数による関数が返す点の集合として表現される.

1 a, b ∈ R3 を固定して,ξ ∈ R を媒介変数とすれば,

p (ξ) = a+ ξb

は,直線を表す.

»=0»

a

b

x1

x2

x3

図 9.1: 直線のパラメトリック表現

4 / 80

Page 5: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

パラメトリック表現

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 µ

図 9.2: 円のパラメトリック表現

5 / 80

Page 6: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

パラメトリック表現

任意の曲面は,2つの媒介変数による関数で表現できる.

1 a, b, c ∈ R3, |b| = |c| = 1, b · c = 0, を固定して,ξ = (ξ1, ξ2)T ∈ R2 ((·)T

は転置を表す) を媒介変数とすれば,

p (ξ) = a+ ξ1b+ ξ2c

は平面を表す.

»1

»2

ab

c

x1

x2

x3

図 9.3: 平面のパラメトリック表現

6 / 80

Page 7: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

パラメトリック表現

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

は円筒面を表す.

»

µ={¼µ

µ=¼

x3

x1

x2

a

b

cd

図 9.4: 円筒面のパラメトリック表現

7 / 80

Page 8: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

§9.2.2 曲線セグメントと曲面パッチ

自由曲面を表現するために次のように定義される曲線セグメントあるいは曲面パッチが使われる.

定義 9.2.2 (曲線セグメントと曲面パッチ)

全体の曲線あるいは曲面を複数の曲線あるいは曲面を接続して表現するとき,単位となる曲線を曲線セグメント (curve segment),曲面を曲面パッチ (surfacepatch) という.

曲線あるいは曲面を生成する際に次の点が課題となる.

1 曲線あるいは曲面を思いどおりに制御できるか.

2 複数の曲線セグメントや曲面パッチを滑らかに接続できるか.

8 / 80

Page 9: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

曲線の制御を容易にするために,点列から曲線を生成する方法が用いられる.以下,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} とかくことにする.

9 / 80

Page 10: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

定義 9.2.3 (制御点)

点列を用いて曲線あるいは曲面を定義するとき,その点列を制御点 (controlpoints),点列が作る多角形を制御多角形 (control polygon) という.

q1

q2

q3

q4

図 9.5: 制御点と制御多角形

10 / 80

Page 11: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

定義 9.2.4 (曲線セグメントの一般式)

q1, · · · , qm ∈ Rd を制御点とする.ξ ∈ [0, 1] に対して

p (ξ) =∑

i∈{1,··· ,m}

ϕi (ξ) qi

を曲線セグメントの一般式という.ここで,ϕ1, · · · , ϕm : R → R は ξ ∈ [0, 1] に対して ∑

i∈{1,··· ,m}

ϕi (ξ) = 1 (9.2.1)

を満たす関数とする.

11 / 80

Page 12: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

(注)

1 定義 9.2.4 で使われた関数 ϕi (ξ) は CG ではブレンディング関数 (blendingfunction) とよばれる.数値解析では基底関数 (basis function) とよばれる.

2 (9.2.1) の条件は,全ての制御点が同じ点 q = qi, i ∈ {1, · · · ,m}, のとき,p (ξ) = q となることを保証する.

12 / 80

Page 13: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

定義 9.2.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

を満たす関数とする.

13 / 80

Page 14: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

自由曲面とは

曲線セグメントと曲面パッチ

q11q21

q31

q41

q12

q13q14

q24

q34

q44q42

q43

q22

q32

q23

q33

図 9.6: 制御点と曲面パッチ

14 / 80

Page 15: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

§9.3 Bezier 曲線

これ以降,ブレンディング関数を具体的に与えたときのいくつかの代表的な曲線についてみていこう.まず,Bezier 曲線についてみてみる.以下,d ∈ {2, 3}を Euclid 空間の次元,n ∈ N を Bezier 曲線の次数を表すことにする.Bezier 曲線では,Bernstein 基底関数をブレンディング関数に用いる.

定義 9.3.1 (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) という.

15 / 80

Page 16: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

Bezier 曲線は次のように定義される.

定義 9.3.2 (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

が成り立つ.

16 / 80

Page 17: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

»0 10.5

0

1

0.5

b1,3

b2,3 b3,3

b4,3

図 9.1: 3次の Bernstein 基底関数

17 / 80

Page 18: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

Bezier 曲線は,制御点 q1, · · · , qn+1 ∈ Rd を用いて

p (ξ) =∑

i∈{1,··· ,n+1}

bi,n (ξ) qi

となる.

q1

q2 q3

q4

q1

q2

q3

q4

図 9.2: 3次の Bezier 曲線

18 / 80

Page 19: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

Bezier 曲線は次の特徴をもつ.

1 Bezier 曲線の包絡線 (envelope) は凸閉包性 (convex hull property) をもつ.すなわち,ξ ∈ [0, 1] に対して∑

i∈{1,··· ,n+1}

bi,n (ξ) = 1, bi,n (ξ) > 0

が成り立つ.この性質は,2つの立体の干渉チェックに利用される.

19 / 80

Page 20: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

q1

q2 q3

q4

q1

q2

q3

q4

図 9.3: Bezier 曲線の凸閉包性

20 / 80

Page 21: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

2 制御多角形と曲線は類似する.a 制御多角形を滑らかにした形状となる.b 端点を通る.p (0) = q1, p (1) = qn+1

c 端点における ξ に対する微分は端点に隣接した制御点の位置で決まる.実際,後で示す命題 9.3.3 より,1階微分について

dp (0)

dξ= n (q2 − q1) , (9.3.1)

dp (1)

dξ= n (qn+1 − qn) (9.3.2)

が成り立つ.さらに,2階微分について

d2p (0)

dξ2= n (n− 1) {(q3 − q2)− (q2 − q1)} , (9.3.3)

d2p (1)

dξ2= n (n− 1) {(qn+1 − qn)− (qn − qn−1)} (9.3.4)

が成り立つ.

21 / 80

Page 22: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

q1

q2

q3

q4

(q3{q2){(q2{q1)

図 9.4: Bezier 曲線の微分と制御点の関係

22 / 80

Page 23: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

命題 9.3.3 (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

23 / 80

Page 24: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

とかける.そこで,

dp (ξ)

dξ= n (−1) nC0 (1− ξ)n−1 q1 + (n− 1) (−1) nC1 (1− ξ)n−2 ξq2

+ 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)

を得る. □

24 / 80

Page 25: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

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 (η) は,図 9.5 のように,制御多角形の各辺をη : (1− η) に内分した点で構成される.この関係を用いて Bezier 曲線をη : (1− η) に分割する方法を De Casteljau (ド・カステリョ) のアルゴリズム (De Casteljau’s algorithm) という.

25 / 80

Page 26: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

q1,3(´)

q1,2(´)

q2,2(´)

q2,1(´)

q3,1(´)

q3,0(´)=q3

q4,0(´)=q4

q2,0(´)=q2

q1,0(´)=q1

q1,1(´)

図 9.5: Bezier 曲線の分割

26 / 80

Page 27: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

4 2つの Bezier 曲線を連続性を保って接続することができる.a 2つの Bezier 曲線の端点を一致させると C0 級 (曲線の長さ方向の座標に対する 0階微分が連続) となる.

b (9.3.1) と (9.3.2) より,さらに,接続している端点とその隣の制御点が同じ直線上におくと C1 級となる.

c (9.3.3) と (9.3.4) より,さらに,図 9.6 のように,ξ に対する 2階微分のベクトルが同じ方向となるように接続している端点とその隣およびその隣の制御点をおくと C2 級となる.

q3

q4=r1q2

q1

r2

r3

r4

図 9.6: Bezier 曲線の接続

27 / 80

Page 28: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

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

28 / 80

Page 29: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

とかける.一方,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.3.5)

q′1 = q1, q′

n+2 = qn+1

であればよいことになる.(9.3.5) は

q′i =

(1− i− 1

n+ 1

)qi +

i− 1

n+ 1qi−1

とかくこともできる.

29 / 80

Page 30: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

有理 Bezier 曲線

§9.3.1 有理 Bezier 曲線

これまで Bezier 曲線についてみてきたが,実は,Bezier 曲線では円や楕円などの円錐曲線を正確に表現することができない.それを克服するために,有理Bezier 曲線が考案された.

定義 9.3.4 (有理 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) という.

30 / 80

Page 31: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

有理 Bezier 曲線

有理 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

とかける.

31 / 80

Page 32: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

有理 Bezier 曲線

ここで,

1 w2 = 0 ならば直線

2 w2 ∈ (0, 1) ならば楕円曲線

3 w2 = 1 ならば放物線

4 w2 > 1 ならば双曲線

となる.また,図 9.7 (b) のように制御点を選んだとき,

w2 = cos θ

とおけば,円弧となる [1].

32 / 80

Page 33: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

有理 Bezier 曲線

q3

w2=10q2

q1

w2=1

w2=1/p

2

w2=0

w2={1/2

w2={1/p

2q3

q2

q1

µ µ

(a) 円錐曲線 (b) 円弧

図 9.7: 2次の有理 Bezier 曲線による円錐曲線

33 / 80

Page 34: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

OpenGL による Bezier 曲線

§9.3.2 OpenGL による Bezier 曲線

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: 制御点配列のポインタ

34 / 80

Page 35: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

OpenGL による Bezier 曲線

実際の描画では,図 9.8 のようなサンプリング点を次の関数で計算し,折れ線を描いていく.

glEvalCoord1f()

void glEvalCoord1f(GLfloat u);

エバリュエータ(glMap1f)で計算する座標 u を指定する.

35 / 80

Page 36: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

OpenGL による Bezier 曲線

q3

q2

q1

»=1q4

»=0

図 9.8: Bezier 曲線の制御点とサンプリング点

glPointSize()

void glPointSize(GLfloat size) ;

描画する点の直径を指定する.初期値は 1.0 である.

36 / 80

Page 37: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

OpenGL による Bezier 曲線

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();

...

37 / 80

Page 38: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

OpenGL による Bezier 曲線

図 9.9: OpenGL で描かれた Bezier 曲線

38 / 80

Page 39: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲線

Bezier 曲線の特徴と問題点

§9.3.3 Bezier 曲線の特徴と問題点

次の B-スプライン曲線に移る前に,Bezier 曲線の特徴と問題点についてみておこう.Bezier 曲線は次の特徴をもつ.

1 制御点の移動が曲線全体に影響する.

2 曲線の次数を決めると制御点の数が決められてしまう.

したがって,次のような問題が生ずる.

1 セグメント数を少なくして,次数を上げれば,高次の振動が発生しやすくなる.

2 セグメント次数を多くすれば,接続条件の扱いが煩雑になる.

39 / 80

Page 40: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

§9.4 B-スプライン曲線

Bezier 曲線はいくつかの問題点をもっていた.B-スプライン曲線 (B-splinecurves) はそれらの問題点をもたない曲線である.B は基底 (basis) の意味で,スプラインは雲形定規の意味で使われている.以下,d ∈ {2, 3} を Euclid 空間の次元,n ∈ N を B-スプライン曲線の次数,m ∈ N を基底関数の数 (制御点の数) を表すことにする.

40 / 80

Page 41: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

B-スプライン曲線の定義を示そう.Bezier 曲線のセグメントに対するパラメータ ξ ∈ [0, 1] に対応して,B-スプライン曲線ではノット (knot)ξ1 ≤ · · · ≤ ξn+m+1 を定義して,ξ ∈ [ξ1, ξn+m+1] とおく.i ∈ {1, · · · ,m} に対して図 9.1 のような j ∈ {0, · · · , n} 次の基底関数 bi,j を次のように定義する.

1

»»i+1»i »i+2 »i+3 »i+4

bi,0

bi,1

bi,2

bi,3

図 9.1: B-スプライン曲線の基底関数

41 / 80

Page 42: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

定義 9.4.1 (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.4.1)

を j 次の B-スプライン基底関数という.ただし,(9.4.1) において,分母ξi+j − ξi, ξi+j+1 − ξi+1 が 0 (重複ノット) のときは,その項を 0 とおく.

(9.4.1) は Cox-de Boor の漸化式とよばれる.

42 / 80

Page 43: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

»»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

図 9.2: ノットと B-スプライン基底関数

43 / 80

Page 44: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

bi,n を用いて,B-スプライン曲線を次のように定義する.

定義 9.4.2 (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) という.

44 / 80

Page 45: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

ノット ξ1, · · · , ξn+m+1 の配置と B-スプライン曲線の関係は次のようになる.

1 ノット ξ1, · · · , ξn+m+1 が等間隔に配置されているとき,一様 (uniform)ノットとよび, B-スプライン曲線の端点と制御点 q1, qm は一致しない (図9.3).

2 ノットの両端で n+ 1 個のノットが重複しているとき,すなわちξ1 = · · · = ξn+1, ξm+1 = · · · = · · · = ξn+m+1 のとき,開一様 (openuniform) ノットとよび,B-スプライン曲線の端点と制御点 q1, qm は一致する (図 9.4).図 9.4 (b) のときの B-スプライン基底関数を図 9.5 に示す.この図の b1,3, · · · , b4,3 は図 9.1 の 3次の Bernstein 基底関数と一致する (証明してみよ).すなわち,3次の Bezier 曲線と一致する.

3 ノットの中間で n 個のノットが重複しているとき,すなわちξi = · · · = ξi+n−1 のとき,B-スプライン曲線と制御点が一致し,カスプ(cusp) となる (図 9.6).

45 / 80

Page 46: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

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}

図 9.3: 一様ノットの B-スプライン曲線

46 / 80

Page 47: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

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}

図 9.4: 開一様ノットの B-スプライン曲線 (d = 2)

47 / 80

Page 48: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

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}

図 9.5: 開一様ノットの B-スプライン基底関数 (d = 2)

48 / 80

Page 49: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

q3

q2

q1

q2q1

n = 2, m = 5, {ξ1, ξ2, ξ3, ξ4, ξ5, ξ6, ξ7, ξ8} = {0, 1, 2, 3, 3, 4, 5, 6}

図 9.6: 中間ノットを重ねた B-スプライン曲線 (d = 2)

49 / 80

Page 50: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

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]).

50 / 80

Page 51: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

NURBS 曲線

§9.4.1 NURBS 曲線

これまで B-スプライン曲線についてみてきたが,B-スプライン曲線でも円や楕円などの円錐曲線を正確に表現することができない.それを克服するために,非一様な有理 B-スプライン (Non-Uniform Rational B-Spline) 曲線を NURBS 曲線が考案された.

定義 9.4.3 (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) という.

51 / 80

Page 52: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

NURBS 曲線

NURBS 曲線は,中間ノットを多重化することによって複数の曲線を接続したような曲線も1セグメントで表せるなど,表現力の高さが評価されて,IGES(Initial Graphics Exchange Specification) に取り入れられた.

52 / 80

Page 53: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

NURBS 曲線

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

}とおき,図 9.7 のように制御点を配置すれば,円が描ける.

53 / 80

Page 54: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

NURBS 曲線

q3

q2q9=q1

q5 q4

q7

q8

q6

図 9.7: 2次の B-スプライン曲線による円

54 / 80

Page 55: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

§9.4.2 OpenGL よる NURBS 曲線

OpenGL によって NURBS 曲線を描くために必要となる関数について説明する.

gluNewNurbsRenderer()

GLUnurbs* gluNewNurbsRenderer(void);

NURBS オブジェクトのポインタを作成する.

55 / 80

Page 56: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

gluNurbsProperty()

void gluNurbsProperty(GLUnurbs* nurb, GLenum property,

GLfloat value);

• nurb: NURBS オブジェクトを指定する.• 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

56 / 80

Page 57: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

• value: 属性の値を指定する.• property に GLU SAMPLING TOLERANCE を指定した場合,サンプリング点の間隔 (ピクセル値,初期値 50.0 ピクセル) を指定する.

• property に GLU DISPLAY MODE を指定した場合,次の描画方法を指定する.

• GLU FILL (多角形の集合として描画,初期値)• GLU OUTLINE PORYGON(多角形の輪郭のみ描画)

57 / 80

Page 58: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

gluNurbsCurve()

void gluNurbsCurve(GLUnurbs* nurb, GLint uknotcount,

GLfloat* uknot, GLint ustride, GLfloat* ctrarray,

GLint uorder, GLenum type);

• nurb: NURBS オブジェクトを指定する.• uknotcount: ノットベクトルの数を指定する.• uknot: ノットベクトルの配列を指定する.• ustride: 制御点の座標がメモリされている間隔 (GLfloat 数) を指定する.• ctrarray: 制御点の配列を指定する.• uorder: 曲線の次数 +1 を指定する.• type: 次のエバリュエータ形式を指定する.

• GL MAP1 VERTEX 3:制御点• GL MAP1 VERTEX 4:同次座標による制御点

58 / 80

Page 59: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

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);

...

59 / 80

Page 60: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

図 9.8: OpenGL で描かれた NURBS 曲線による円

60 / 80

Page 61: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

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);

...

61 / 80

Page 62: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

B-スプライン曲線

OpenGL よる NURBS 曲線

図 9.9: OpenGL で描かれた NURBS 曲線による円

62 / 80

Page 63: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

§9.5 Bezier 曲面

ここからは,3次元空間上の曲面について考えよう.Bezier 曲面 (Beziersurface) は次のように定義される.

q11q21

q31

q41

q12

q13q14

q24

q34

q44q42

q43

q22

q32

q23

q33

図 9.1: 3次の Bezier 曲面

63 / 80

Page 64: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

定義 9.5.1 (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) という.

64 / 80

Page 65: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

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) ,

65 / 80

Page 66: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

∂ξ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)

を満たすように制御点を配置する必要がある.

66 / 80

Page 67: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

有理 Bezier 曲面

§9.5.1 有理 Bezier 曲面

Bezier 曲面の境界は Bezier 曲線となる.そこで, Bezier 曲線では円錐曲線を正確に表現することができなかったことがここでも問題となる.それを克服するために,有理 Bezier 曲面が考案された.

定義 9.5.2 (有理 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次曲面を正確に表現できる特徴をもつ.

67 / 80

Page 68: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

OpenGL による Bezier 曲面

§9.5.2 OpenGL による Bezier 曲面

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: 制御点配列のポインタ

68 / 80

Page 69: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

OpenGL による Bezier 曲面

実際の描画では,サンプリング点を次の関数で計算し,平面を描いていく.

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次元メッシュを定義する.

69 / 80

Page 70: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

OpenGL による Bezier 曲面

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 : 最初と最後の整数値を指定する.

70 / 80

Page 71: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

OpenGL による Bezier 曲面

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();

...

71 / 80

Page 72: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

Bezier 曲面

OpenGL による Bezier 曲面

図 9.2: OpenGL で描かれた Bezier 曲面

72 / 80

Page 73: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

NURBS 曲面

§9.6 NURBS 曲面

最後に,NURBS 曲面を考えよう.NURBS 曲面は次のように定義される.

定義 9.6.1 (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次曲面を正確に表現できる特徴をもつ.また,中間ノットを多重化することで複数の曲面を接続したような曲面を表せる.

73 / 80

Page 74: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

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);

74 / 80

Page 75: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

NURBS 曲面

OpenGL による NURBS 曲面

• nurb: NURBS オブジェクトを指定する.• 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 :同次座標による制御点

75 / 80

Page 76: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

NURBS 曲面

OpenGL による NURBS 曲面

実際の描画では,サンプリング点を次の関数で計算し,平面を描いていく.

gluBeginSurface()

void gluBeginSurface(GLUnurbs* nurb),

void gluEndSurface(GLUnurbs* nurb);

NURBS 曲面の定義の範囲を設定する.

76 / 80

Page 77: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

NURBS 曲面

OpenGL による NURBS 曲面

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);

...

77 / 80

Page 78: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

NURBS 曲面

OpenGL による NURBS 曲面

図 9.1: OpenGL で描かれた NURBS 曲面

78 / 80

Page 79: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

NURBS 曲面

OpenGL による NURBS 曲面

演習 9.6.2 (NURBS 曲面)

program9 5.c を参考にして,図 9.2 のような曲面を作成せよ.

図 9.2: 図 9.1 の曲面を延長した曲面

79 / 80

Page 80: 第9章自由曲面の表現第9 章自由曲面の表現 自由曲面とは パラメトリック表現 x9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現される.

第 9 章 自由曲面の表現

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.

80 / 80