はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . . . 第 9 章 自由曲面の表現 畔上 秀幸 名古屋大学 情報科学研究科 複雑系科学専攻 May 11, 2015 . . . . . . 1 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.1 はじめに (目標) する. CG で使われる自由曲面を作成するための技術について理解 . . . . . . 2 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2 自由曲面とは ここでは,自由曲面を次のように定義する. . 定義 9.2.1 (自由曲面) . 平面や円筒面,球面では表現できない曲面を自由曲面 (free-form surface) という. . . . . . . . 3 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . パラメトリック表現 §9.2.1 パラメトリック表現 任意の曲線は,1 つの媒介変数による関数が返す点の集合として表現 される. 3 1. a, b ∈ R を固定して,ξ ∈ R を媒介変数とすれば, p (ξ) = a + ξb は,直線を表す. x3 b a x2 »=0 » x1 図 9.2.1: 直線のパラメトリック表現 . . . . . . 4 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 は円を表す. x3 r µ c a b x2 µ µ={¼ µ=¼ x1 図 9.2.2: 円のパラメトリック表現 . . . . . . 5 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . パラメトリック表現 §9.2.1 パラメトリック表現 (cnt.) 任意の曲面は,2 つの媒介変数による関数で表現できる. 3 1. a, b, c ∈ R , |b| = |c| = 1, b · c = 0, を固定して, T ξ = (ξ1 , ξ2 ) ∈ R2 ((·)T は転置を表す) を媒介変数とすれば, p (ξ) = a + ξ1 b + ξ2 c は平面を表す. »2 x3 c a b »1 x2 x1 図 9.2.3: 平面のパラメトリック表現 . . . . . . 6 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . パラメトリック表現 §9.2.1 パラメトリック表現 (cnt.) » x3 d c a b x2 µ={¼ µ=¼ µ x1 図 9.2.4: 円筒面のパラメトリック表現 . . . . . . 8 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ 自由曲面を表現するために次のように定義される曲線セグメントある いは曲面パッチが使われる. . 定義 9.2.2 (曲線セグメントと曲面パッチ) . 全体の曲線あるいは曲面を複数の曲線あるいは曲面を接続して表現する とき,単位となる曲線を曲線セグメント (curve segment),曲面を曲面 (surface patch) という. パッチ . 曲線あるいは曲面を生成する際に次の点が課題となる. 1. 曲線あるいは曲面を思いどおりに制御できるか. 2. 複数の曲線セグメントや曲面パッチを滑らかに接続できるか. . . . . . . 9 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ (cnt.) 曲線の制御を容易にするために,点列から曲線を生成する方法が用い 2 られる.以下,d ∈ {2, 3} を Euclid 空間の次元,[0, 1] あるいは [0, 1] を曲線セグメントや曲面パッチの定義領域,n, n1 , n2 ∈ N を曲線あるい は曲面を構成する関数の次数,m, m1 , m2 ∈ N を曲線セグメントや曲面 パッチの数を表すことにする.ただし,[0, 1] = {ξ ∈ R | 0 ≤ ξ ≤ 1}, (0, 1) = {ξ ∈ R | 0 < ξ < 1}, (0, 1] = {ξ ∈ R | 0 < ξ ≤ 1} とかくことに する. . . . . . . 10 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ (cnt.) . 定義 9.2.3 (制御点) . 点列を用いて曲線あるいは曲面を定義するとき,その点列を制御点 (control points),点列が作る多角形を制御多角形 (control polygon) と .いう. q3 q2 q1 q4 図 9.2.5: 制御点と制御多角形 . . . . . . 11 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ (cnt.) . 定義 9.2.4 (曲線セグメントの一般式) . q1 , · · · , qm ∈ Rd を制御点とする.ξ ∈ [0, 1] に対して ∑ p (ξ) = ϕi (ξ) qi i∈{1,··· ,m} を曲線セグメントの一般式という.ここで,ϕ1 , · · · , ϕm : R → R は ξ ∈ [0, 1] に対して ∑ ϕi (ξ) = 1 (9.2.1) i∈{1,··· ,m} .を満たす関数とする. . . . . . . 12 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ (cnt.) (注) 1. 2. 定義 9.2.4 で使われた関数 ϕi (ξ) は CG ではブレンディング関数 (blending function) とよばれる.数値解析では基底関数 (basis function) とよばれる. (9.2.1) の条件は,全ての制御点が同じ点 q = qi , i ∈ {1, · · · , m}, のとき,p (ξ) = q となることを保証する. . . . . . . 13 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ (cnt.) . 定義 9.2.5 (曲面パッチの一般式) . T 2 q11 , · · · , qm1 m2 ∈ R3 を制御点とする.ξ = (ξ1 , ξ2 ) ∈ [0, 1] に対して ∑ ∑ p (ξ) = ϕ1i (ξ1 ) ϕ2j (ξ2 ) qij i∈{1,··· ,m1 } j∈{1,··· ,m2 } を曲面パッチの一般式という.ここで,ϕ11 , · · · , ϕ2m2 : R → R は ξ ∈ [0, 1] に対して ∑ ϕ1i (ξ) = 1, i∈{1,··· ,m1 } ∑ ϕ2j (ξ) = 1 j∈{1,··· ,m2 } .を満たす関数とする. . . . . . . 14 / 82 はじめに 自由曲面とは . . . . . . . . . . . . 曲線セグメントと曲面パッチ B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.2.2 曲線セグメントと曲面パッチ (cnt.) q14 q13 q24 q12 q23 q22 q34 q33 q11 q21 q32 q31 q43 q42 q44 q41 図 9.2.6: 制御点と曲面パッチ . . . . . . 15 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 これ以降,ブレンディング関数を具体的に与えたときのいくつかの代 表的な曲線についてみていこう.まず,B´ezier 曲線についてみてみる. 以下,d ∈ {2, 3} を Euclid 空間の次元,n ∈ N を B´ezier 曲線の次数を 表すことにする. B´ezier 曲線では,Bernstein 基底関数をブレンディング関数に用いる. . 定義 9.3.1 (Bernstein 基底関数) . ξ ∈ [0, 1], i ∈ {1, · · · , n + 1}, ξ ∈ [0, 1] に対して n−(i−1) bi,n (ξ) = n Ci−1 (1 − ξ) ξ i−1 n! n−(i−1) i−1 = (1 − ξ) ξ (i − 1)! (n − {i − 1)}! を n 次の Bernstein 基底関数 (Bernstein basic function) あるいは Bernstein 多項式 (Bernstein polynomial) という. . . . . . . . 16 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) B´ezier 曲線は次のように定義される. . 定義 9.3.2 (B´ezier 曲線) . b1,n , · · · , bn+1,n を n 次の Bernstein 基底関数,q1 , · · · , qn+1 ∈ Rd を制 御点とするとき,ξ ∈ [0, 1] に対して ∑ p (ξ) = bi,n (ξ) qi i∈{1,··· ,n+1} を . n 次の B´ezier 曲線 (B´ezier curves) という. B´ezier 曲線はブレンディング関数の条件を満たす.実際, ∑ n bi,n (ξ) = {(1 − ξ) + ξ} = 1 i∈{1,··· ,n+1} が成り立つ. . . . . . . 17 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) 1 b4,3 b1,3 0.5 0 0 b2,3 b3,3 0.5 » 1 図 9.3.1: 3 次の Bernstein 基底関数 . . . . . . 18 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) B´ezier 曲線は,制御点 q1 , · · · , qn+1 ∈ Rd を用いて ∑ p (ξ) = bi,n (ξ) qi i∈{1,··· ,n+1} となる. q2 q2 q3 q4 q1 q1 q3 q4 図 9.3.2: 3 次の B´ ezier 曲線 . . . . . . 19 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) B´ezier 曲線は次の特徴をもつ. 1. B´ezier 曲線の包絡線 (envelope) は凸閉包性 (convex hull property) をもつ.すなわち,ξ ∈ [0, 1] に対して ∑ bi,n (ξ) = 1, bi,n (ξ) > 0 i∈{1,··· ,n+1} が成り立つ.この性質は,2 つの立体の干渉チェックに利用される. . . . . . . 20 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) q2 q2 q3 q4 q1 q1 q3 q4 図 9.3.3: B´ ezier 曲線の凸閉包性 . . . . . . 21 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) 2. 制御多角形と曲線は類似する. a 制御多角形を滑らかにした形状となる. b 端点を通る.p (0) = q1 , p (1) = qn+1 c 端点における ξ に対する微分は端点に隣接した制御点の位置で決まる. 実際,後で示す命題 9.3.3 より,1 階微分について dp (0) = n (q2 − q1 ) , dξ dp (1) = n (qn+1 − qn ) dξ (9.3.1) (9.3.2) が成り立つ.さらに,2 階微分について d2 p (0) = n (n − 1) {(q3 − q2 ) − (q2 − q1 )} , dξ 2 d2 p (1) = n (n − 1) {(qn+1 − qn ) − (qn − qn−1 )} dξ 2 (9.3.3) (9.3.4) が成り立つ. . . . . . . 22 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) q3 q2 q1 q4 (q 3{q 2){(q 2{q 1) 図 9.3.4: B´ ezier 曲線の微分と制御点の関係 . . . . . . 23 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) . 命題 9.3.3 (B´ezier 曲線の微分) . p : [0, 1] → R を B´ezier 曲線とする.このとき dp (ξ) =n dξ ∑ bi,n−1 (ξ) (qi+1 − qi ) i∈{1,··· ,n} がなりたつ. . (証明) B´ezier 曲線は ∑ p (ξ) = bi,n (ξ) qi = i∈{1,··· ,n+1} ∑ n Ci−1 (1 − ξ)n−(i−1) ξ i−1 qi i∈{1,··· ,n+1} = n C0 (1 − ξ)n q1 + n C1 (1 − ξ)n−1 ξq2 + n C2 (1 − ξ)n−2 ξ 2 q3 + · · · + n Cn ξ n qn+1 とかける.そこで, dp (ξ) = n (−1) n C0 (1 − ξ)n−1 q1 + (n − 1) (−1) n C1 (1 − ξ)n−2 ξq2 dξ . . . . . . 24 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) + n C1 (1 − ξ)n−1 q2 + (n − 2) (−1) n C2 (1 − ξ)n−3 ξ 2 q3 + 2 n C2 (1 − ξ)n−2 ξq3 + · · · + n n Cn ξ n−1 qn+1 {( ) = n n−1 C0 (1 − ξ)n−1 q2 − n−1 C0 (1 − ξ)n−1 q1 ( ) + n−1 C1 (1 − ξ)n−2 ξq3 − n−1 C1 (1 − ξ)n−2 ξq2 ( )} + · · · + n−1 Cn−1 ξ n−1 qn+1 − n−1 Cn−1 ξ n−1 qn ∑ n−1−(i−1) i−1 =n ξ (qi+1 − qi ) n−1 Ci−1 (1 − ξ) i∈{1,··· ,n} =n ∑ bi,n−1 (ξ) (qi+1 − qi ) i∈{1,··· ,n} □ を得る. . . . . . . 25 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) 3. B´ezier 曲線を 2 つの B´ezier 曲線に分割することができる. p : [0, 1] → R を B´ezier 曲線として,ある η ∈ [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.3.5 のように,制御多角形 の各辺を η : (1 − η) に内分した点で構成される.この関係を用い て B´ezier 曲線を η : (1 − η) に分割する方法を De Casteljau (ド・ カステリョ) のアルゴリズム (De Casteljau’s algorithm) という. . . . . . . 26 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) q1,2(´) q2,0(´)=q2 q2,1(´) q3,0(´)=q3 q2,2(´) q1,1(´) q3,1(´) q1,3(´) q4,0(´)=q4 q1,0(´)=q1 図 9.3.5: B´ ezier 曲線の分割 . . . . . . 27 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) 4. 2 つの B´ezier 曲線を連続性を保って接続することができる. a 2 つの B´ezier 曲線の端点を一致させると C 0 級 (曲線の長さ方向の座標 に対する 0 階微分が連続) となる. b (9.3.1) と (9.3.2) より,さらに,接続している端点とその隣の制御点が 同じ直線上におくと C 1 級となる. c (9.3.3) と (9.3.4) より,さらに,図 9.3.6 のように,ξ に対する 2 階微 分のベクトルが同じ方向となるように接続している端点とその隣および その隣の制御点をおくと C 2 級となる. q3 q2 q4=r1 r2 r3 q1 r4 図 9.3.6: B´ ezier 曲線の接続 . . . . . . 28 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) 5. B´ezier 曲線の形状を変えずに次数を上げることができる.n 次の B´ezier 曲線は ∑ ∑ n−(i−1) i−1 bi,n (ξ) qi = ξ p (ξ) = n Ci−1 (1 − ξ) i∈{1,··· ,n+1} = ∑ i∈{1,··· ,n+1} {(1 − ξ) + ξ} n Ci−1 (1 − ξ) i∈{1,··· ,n+1} = ∑ n Ci−1 i∈{1,··· ,n+1} n−(i−1) = + (1 − ξ) ∑ n−(i−1) ξ i−1 qi { n+1−(i−1) i−1 (1 − ξ) ξ } ξ (i−1)+1 qi n+1−(i−1) (1 − ξ) ξ i−1 ( n Ci−1 qi + n C(i−1)−1 qi−1 ) i∈{2,··· ,n+1} n+1 + (1 − ξ) q1 + ξ n+1 qn+1 . . . . . . 29 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3 B´ezier 曲線 (cnt.) とかける.一方,n + 1 次の B´ezier 曲線を ∑ p′ (ξ) = bi,n+1 (ξ) qi′ i∈{1,··· ,n+2} = ∑ n+1 Ci−1 (1 − ξ) n+1−(i−1) ξ i−1 qi′ i∈{1,··· ,n+2} とおく.p (ξ) = p′ (ξ) となるためには, ′ n+1 Ci−1 qi q1′ = q1 , (9.3.5) = n Ci−1 qi + n C(i−1)−1 qi−1 ′ qn+2 = qn+1 であればよいことになる.(9.3.5) は ( ) i−1 i−1 qi′ = 1 − qi + qi−1 n+1 n+1 とかくこともできる. . . . . . . 30 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . 有理 B´ ezier 曲線 §9.3.1 有理 B´ezier 曲線 これまで B´ezier 曲線についてみてきたが,実は,B´ezier 曲線では円 や楕円などの円錐曲線を正確に表現することができない.それを克服す るために,有理 B´ezier 曲線が考案された. . 定義 9.3.4 (有理 B´ezier 曲線) . b1,n , · · · , bn+1,n を n 次の Bernstein 基底関数,q1 , · · · , qn+1 ∈ Rd を制 御点,w1 , · · · , wn+1 ∈ R を重みとするとき,ξ ∈ [0, 1] に対して ∑ i∈{1,··· ,n+1} bi,n (ξ) wi qi p (ξ) = ∑ i∈{1,··· ,n+1} bi,n (ξ) wi を . n 次の有理 B´ezier 曲線 (Rational B´ezier curves) という. . . . . . . 31 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . 有理 B´ ezier 曲線 §9.3.1 有理 B´ezier 曲線 (cnt.) 有理 B´ezier 曲線を用いれば円錐曲線が表現できることをみてみよう. 円錐曲線とは,関数表現 f (x) = c11 x21 + 2c12 x1 x2 + c22 x22 + 2c13 x1 + 2c23 x2 + c33 x1 ( ) c11 c12 c13 = x1 x2 1 c12 c22 c23 x2 = 0 c13 c23 c33 1 T を満たす x = (x1 , x2 ) ∈ R2 で構成された 2 次曲線である.このよう な円錐曲線は,2 次の有理 B´ezier 曲線を用いて p (ξ) = b1,2 q1 + b2,2 w2 q2 + b3,2 q3 b1,2 + b2,2 w1 + b3,2 とかける. ここで, . . . . . . 32 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . 有理 B´ ezier 曲線 §9.3.1 有理 B´ezier 曲線 (cnt.) 1. w2 = 0 ならば直線 2. w2 ∈ (0, 1) ならば楕円曲線 3. w2 = 1 ならば放物線 4. w2 > 1 ならば双曲線 となる.また,図 9.3.7 (b) のように制御点を選んだとき, w2 = cos θ とおけば,円弧となる [1]. . . . . . . 33 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . 有理 B´ ezier 曲線 §9.3.1 有理 B´ezier 曲線 (cnt.) w2=10 q2 w2=1 p w2=1/ 2 q1 q2 q3 w2=0 w2={1/2 p w2={1/ 2 (a) 円錐曲線 µ µ q3 q1 (b) 円弧 図 9.3.7: 2 次の有理 B´ ezier 曲線による円錐曲線 . . . . . . 34 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.2 OpenGL による B´ezier 曲線 OpenGL によって B´ezier 曲線を描くために必要となる関数について 説明する. . . . . . . 35 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.2 OpenGL による B´ezier 曲線 (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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.2 OpenGL による B´ezier 曲線 (cnt.) 実際の描画では,図 9.3.8 のようなサンプリング点を次の関数で計算 し,折れ線を描いていく. . glEvalCoord1f() . void glEvalCoord1f(GLfloat u); エバリュエータ( glMap1f)で計算する座標 u を指定する. . q4 q2 »=1 q1 »=0 q3 図 9.3.8: B´ ezier 曲線の制御点とサンプリング点 . . . . . . 37 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.2 OpenGL による B´ezier 曲線 (cnt.) . glPointSize() . void glPointSize(GLfloat size) ; 描画する点の直径を指定する.初期値は 1.0 である. . . . . . . . 38 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.2 OpenGL による B´ezier 曲線 (cnt.) B´ezier 曲線を描く. . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.2 OpenGL による B´ezier 曲線 (cnt.) 図 9.3.9: OpenGL で描かれた B´ ezier 曲線 . . . . . . 40 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線の特徴と問題点 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.3.3 B´ezier 曲線の特徴と問題点 次の B-スプライン曲線に移る前に,B´ezier 曲線の特徴と問題点につ いてみておこう.B´ezier 曲線は次の特徴をもつ. 1. 制御点の移動が曲線全体に影響する. 2. 曲線の次数を決めると制御点の数が決められてしまう. したがって,次のような問題が生ずる. 1. 2. セグメント数を少なくして,次数を上げれば,高次の振動が発生し やすくなる. セグメント次数を多くすれば,接続条件の扱いが煩雑になる. . . . . . . 41 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 B´ezier 曲線はいくつかの問題点をもっていた.B-スプライン曲線 (B-spline curves) はそれらの問題点をもたない曲線である.B は基底 (basis) の意味で,スプラインは雲形定規の意味で使われている.以下, d ∈ {2, 3} を Euclid 空間の次元,n ∈ N を B-スプライン曲線の次数, m ∈ N を基底関数の数 (制御点の数) を表すことにする. . . . . . . 42 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) B-スプライン曲線の定義を示そう.B´ezier 曲線のセグメントに対する パラメータ ξ ∈ [0, 1] に対応して,B-スプライン曲線ではノット (knot) ξ1 ≤ · · · ≤ ξn+m+1 を定義して,ξ ∈ [ξ1 , ξn+m+1 ] とおく. i ∈ {1, · · · , m} に対して図 9.4.1 のような j ∈ {0, · · · , n} 次の基底関数 bi,j を次のように定義する. 1 bi,0 bi,1 bi,2 bi,3 »i »i+1 »i+2 »i+3 » »i+4 図 9.4.1: B-スプライン曲線の基底関数 . . . . . . 43 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) . 定義 9.4.1 (B-スプライン基底関数) . i ∈ {1, · · · , m}, j ∈ {0, · · · , n}, ξ ∈ [ξi , ξi+n+1 ] に対して { 1 ξ ∈ [ξi , ξi+1 ) bi,0 (ξ) = , 0 ξ∈ / [ξi , ξi+1 ) bi,j (ξ) = ξ − ξi ξi+j+1 − ξ bi,j−1 (ξ) + bi+1,j−1 (ξ) ξi+j − ξi ξi+j+1 − ξi+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 の漸化式とよばれる. . . . . . . 44 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) b1,2 b2,2 b3,2 b4,2 b5,2 » »1 »2 »3 »4 »5 »6 »7 »8 »7 »8 n = 2, m = 5 b1,3 b2,3 b3,3 b4,3 »3 »4 »5 »6 » »1 »2 n = 3, m = 4 図 9.4.2: ノットと B-スプライン基底関数 . . . . . . 45 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) bi,n を用いて,B-スプライン曲線を次のように定義する. . 定義 9.4.2 (B-スプライン曲線) . b1,n , · · · , bm,n を n 次の B-スプライン基底関数,q1 , · · · , qm ∈ Rd を制 御点とするとき,ξ ∈ [ξ1 , ξn+m+1 ] に対して ∑ p (ξ) = bi,n (ξ) qi i∈{1,··· ,m} .を n 次の B-スプライン曲線 (B-spline curves) という. . . . . . . 46 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) ノット ξ1 , · · · , ξn+m+1 の配置と B-スプライン曲線の関係は次のよう になる. 1. 2. 3. ノット ξ1 , · · · , ξn+m+1 が等間隔に配置されているとき,一様 (uniform) ノットとよび, B-スプライン曲線の端点と制御点 q1 , qm は一致しない (図 9.4.3). ノットの両端で n + 1 個のノットが重複しているとき,すなわち ξ1 = · · · = ξn+1 , ξm+1 = · · · = · · · = ξn+m+1 のとき,開一様 (open uniform) ノットとよび,B-スプライン曲線の端点と制御点 q1 , qm は一致する (図 9.4.4).図 9.4.4 (b) のときの B-スプライン 基底関数を図 9.4.5 に示す.この図の b1,3 , · · · , b4,3 は図 9.3.1 の 3 次の Bernstein 基底関数と一致する (証明してみよ).すなわち,3 次の B´ezier 曲線と一致する. ノットの中間で n 個のノットが重複しているとき,すなわち ξi = · · · = ξi+n−1 のとき,B-スプライン曲線と制御点が一致し, カスプ (cusp) となる (図 9.4.6). . . . . . . 47 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) q2 q4 q1 q3 n = 2, m = 5, {ξ1 , ξ2 , ξ3 , ξ4 , ξ5 , ξ6 , ξ7 , ξ8 } = {0, 1, 2, 3, 4, 5, 6, 7} q3 q2 q5 q1 q4 n = 3, m = 4, {ξ1 , ξ2 , ξ3 , ξ4 , ξ5 , ξ6 , ξ7 , ξ8 } = {−3, −1, 1, 3, 5, 7, 9, 11} 図 9.4.3: 一様ノットの B-スプライン曲線 . . . . . . 48 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) q2 q4 q1 q3 n = 2, m = 5, {ξ1 , ξ2 , ξ3 , ξ4 , ξ5 , ξ6 , ξ7 , ξ8 } = {0, 0, 0, 1, 2, 3, 3, 3} q3 q2 q5 q1 q4 n = 3, m = 4, {ξ1 , ξ2 , ξ3 , ξ4 , ξ5 , ξ6 , ξ7 , ξ8 } = {0, 0, 0, 0, 1, 1, 1, 1} 図 9.4.4: 開一様ノットの B-スプライン曲線 (d = 2) . . . . . . 49 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) 1 b4,0 b3,1 b4,1 b2,2 b3,2 b4,2 b4,3 b3,3 b1,3 b2,3 0 »1 0 »2 0 »3 0 »4 1 »5 1 »6 1 »7 1 »8 » n = 3, m = 4, {ξ1 , ξ2 , ξ3 , ξ4 , ξ5 , ξ6 , ξ7 , ξ8 } = {0, 0, 0, 0, 1, 1, 1, 1} 図 9.4.5: 開一様ノットの B-スプライン基底関数 (d = 2) . . . . . . 50 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) q2 q1 q1 q2 q3 n = 2, m = 5, {ξ1 , ξ2 , ξ3 , ξ4 , ξ5 , ξ6 , ξ7 , ξ8 } = {0, 1, 2, 3, 3, 4, 5, 6} 図 9.4.6: 中間ノットを重ねた B-スプライン曲線 (d = 2) . . . . . . 51 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4 B-スプライン曲線 (cnt.) B-スプライン曲線は次の特徴をもつ. 1. 2. 制御点の数 m は,n + 1 以上であればいくつでもよい.複数のセ グメントにまたがって曲線が定義される.n << m ととれば,制御 点の移動による影響はその制御点の回り n + 1 個のセグメントに限 定される. ξ ∈ [ξ1 , ξn+m+1 ] に対して凸閉包性 ∑ bi,n (ξ) ≤ 1, bi,n (ξ) > 0 i∈{1,··· ,m} が成り立つ. 3. 4. セグメント間は n − 1 階微分まで連続となる. ノットベクトルにノットを挿入し,曲線と形状を変えないように新 しいノットベクトルを持つ曲線を求めることができる (Oslo アルゴ リズムとよばれる [1]). . . . . . . 52 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . NURBS 曲線 §9.4.1 NURBS 曲線 これまで B-スプライン曲線についてみてきたが,B-スプライン曲線 でも円や楕円などの円錐曲線を正確に表現することができない.それを 克服するために,非一様な有理 B-スプライン (Non-Uniform Rational B-Spline) 曲線を NUEBS 曲線が考案された. . 定義 9.4.3 (NURBS 曲線) . b1,n , · · · , bm,n を n 次の B-スプライン基底関数,q1 , · · · , qm ∈ Rd を制 御点,w1 , · · · , wm ∈ R を重みとするとき,ξ ∈ [ξ1 , ξn+m+1 ] に対して ∑ i∈{1,··· ,n+1} bi,n (ξ) wi qi p (ξ) = ∑ i∈{1,··· ,n+1} bi,n (ξ) wi を . n 次の NURBS 曲線 (NURBS curves) という. NURBS 曲線は,中間ノットを多重化することによって複数の曲線を 接続したような曲線も1セグメントで表せるなど,表現力の高さが評価 されて,IGES (Initial Graphics Exchange Specification) に取り入れら れた. . . . . . . 53 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . NURBS 曲線 §9.4.1 NURBS 曲線 (cnt.) 2 次の B-スプライン基底関数を使って円錐曲線が描けることをみてみ よう.ノットと重みを {ξ1 , · · · , ξ12 } = {0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4} } { 1 1 1 1 √ √ √ √ {w1 , · · · , w9 } = 1, , 1, , 1, , 1, ,1 2 2 2 2 とおき,図 9.4.7 のように制御点を配置すれば,円が描ける. . . . . . . 54 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . NURBS 曲線 §9.4.1 NURBS 曲線 (cnt.) q6 q5 q3 q7 q8 q4 q9=q1 q2 図 9.4.7: 2 次の B-スプライン曲線による円 . . . . . . 55 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4.2 OpenGL よる NURBS 曲線 OpenGL によって NURBS 曲線を描くために必要となる関数について 説明する. . gluNewNurbsRenderer() . GLUnurbs* gluNewNurbsRenderer(void); NURBS オブジェクトのポインタを作成する. . . . . . . . 56 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4.2 OpenGL よる NURBS 曲線 (cnt.) . gluNurbsProperty() . void gluNurbsProperty(GLUnurbs* nurb, GLenum property, GLfloat value); • nurb: NRUBS オブジェクトを指定する. • property: 属性を指定する. . • • • • • • • • GLU GLU GLU GLU GLU GLU GLU GLU SAMPLING TOLERANCE DISPLAY MODE CULLING AUTO LOAD MATRIX PARAMETRIC TOLERANCE SAMPLING METHOD U STEP, GLU V STEP NURBS MODE EXT . . . . . . 57 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4.2 OpenGL よる NURBS 曲線 (cnt.) . . • value: 属性の値を指定する. • property に GLU SAMPLING TOLERANCE を指定した場合,サンプ リング点の間隔 (ピクセル値,初期値 50.0 ピクセル) を指定する. • property に GLU DISPLAY MODE を指定した場合,次の描画方法を 指定する. • GLU FILL (多角形の集合として描画,初期値) • GLU OUTLINE PORYGON(多角形の輪郭のみ描画) . . . . . . 58 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4.2 OpenGL よる NURBS 曲線 (cnt.) 図 9.4.8: OpenGL で描かれた NURBS 曲線による円 . . . . . . 61 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL よる NURBS 曲線 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.4.2 OpenGL よる NURBS 曲線 (cnt.) 図 9.4.9: OpenGL で描かれた NURBS 曲線による円 . . . . . . 63 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5 B´ezier 曲面 ここからは,3 次元空間上の曲面について考えよう.B´ezier 曲面 (B´ezier surface) は次のように定義される. q14 q13 q24 q12 q23 q22 q34 q33 q11 q21 q32 q31 q43 q42 q44 q41 図 9.5.1: 3 次の B´ ezier 曲面 . . . . . . 64 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5 B´ezier 曲面 (cnt.) . 定義 9.5.1 (B´ezier 曲面) . b1,n , · · · , bn+1,n を n 次の Bernstein 基底関数,q11 , · · · , qn+1 n+1 ∈ Rd T 2 を制御点とするとき,ξ = (ξ1 , ξ2 ) ∈ [0, 1] に対して ∑ ∑ p (ξ) = bi,n (ξ1 ) bj,n (ξ2 ) qij i∈{1,··· ,m1 } j∈{1,··· ,m2 } を . n 次の B´ezier 曲面 (B´ezier surface) という. . . . . . . 65 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5 B´ezier 曲面 (cnt.) B´ezier 曲面は次の特徴をもつ. 1. 2. 凸閉包性がある. 制御多面体面と曲面は類似する. a 制御多面体面を滑らかにした形状となる. b 4つの端点を通る. c 端点における ξ1 および ξ2 に対する偏微分は端点に隣接した制御点の位 置で決まる.実際,1 階微分について ∂p (0, ξ2 ) = n ∂ξ1 ∂p (ξ1 , 0) = n ∂ξ2 ∑ bi,n (ξ2 ) (q2i − q1i ) , i∈{1,··· ,m2 } ∑ bi,n (ξ1 ) (qi2 − qi1 ) i∈{1,··· ,m1 } が成り立つ.さらに,2 階微分について,隣り合う曲面を滑らかに接続 するためには,接続する端点で両立性条件 (compatibility condition) ∂ ∂p (0, 0) = 9 (q22 − q21 − q12 + q11 ) , ∂ξ2 ∂ξ1 . . . . . . 66 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5 B´ezier 曲面 (cnt.) ∂ ∂ξ2 ∂ ∂ξ2 ∂ ∂ξ2 ∂p (1, 0) = 9 (qn+1 2 − qn+1 1 − qn2 + qn1 ) , ∂ξ1 ∂p (0, 1) = 9 (q2 n+1 − q2n − q1 n+1 + q1n ) , ∂ξ1 ∂p (1, 1) = 9 (qn+1 n+1 − qn+1 n − qn n+1 + qnn ) ∂ξ1 を満たすように制御点を配置する必要がある. . . . . . . 67 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . 有理 B´ ezier 曲面 §9.5.1 有理 B´ezier 曲面 B´ezier 曲面の境界は B´ezier 曲線となる.そこで, B´ezier 曲線では円 錐曲線を正確に表現することができなかったことがここでも問題とな る.それを克服するために,有理 B´ezier 曲面が考案された. . 定義 9.5.2 (有理 B´ezier 曲面) . b1,n , · · · , bn+1,n を n 次の Bernstein 基底関数,q11 , · · · , qn+1 n+1 ∈ Rd を制御点,w11 , · · · , wn+1 n+1 ∈ R を重みとするとき, T 2 ξ = (ξ1 , ξ2 ) ∈ [0, 1] に対して ∑ ∑ i∈{1,··· ,n+1} j∈{1,··· ,n+1} bi,n (ξ1 ) bj,n (ξ2 ) wij qij ∑ p (ξ) = ∑ i∈{1,··· ,n+1} j∈{1,··· ,n+1} bi,n (ξ1 ) bj,n (ξ2 ) wij .を n 次の 有理 B´ezier 曲面 (Rational B´ezier surface) という. 有理 B´ezier 曲面は, B´ezier 曲面の特徴に加えて,2 次曲面を正確に 表現できる特徴をもつ. . . . . . . 68 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5.2 OpenGL による B´ezier 曲面 OpenGL によって B´ezier 曲面を描くために必要となる関数について 説明する. . . . . . . 69 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5.2 OpenGL による B´ezier 曲面 (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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5.2 OpenGL による B´ezier 曲面 (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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5.2 OpenGL による B´ezier 曲面 (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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5.2 OpenGL による B´ezier 曲面 (cnt.) B´ezier 曲面を描く. . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による B´ ezier 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.5.2 OpenGL による B´ezier 曲面 (cnt.) 図 9.5.2: OpenGL で描かれた B´ ezier 曲面 . . . . . . 74 / 82 はじめに 自由曲面とは . . . . . . . . . . . . B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.6 NURBS 曲面 最後に,NURBS 曲面 (NURBS surface) を考えよう.NURBS 曲面は 次のように定義される. . 定義 9.6.1 (NURBS 曲面) . b1,n1 , · · · , bm1 ,n1 , b1,n2 , · · · , bm2 ,n2 を n1 次および n2 次の B-スプライ ン基底関数,q11 , · · · , qm1 m2 ∈ Rd を制御点,w11 , · · · , wm1 m2 ∈ R を T 重みとするとき,ξ = (ξ1 , ξ2 ) ∈ [ξ11 , ξn1 +m1 +1 ] × [ξ11 , ξn2 +m2 +1 ] に対 して ∑ i∈{1,··· ,m1 }j∈{1,··· ,m2 } bi,n1 (ξ1 ) bj,n2 (ξ2 ) wij qij p (ξ) = ∑ i∈{1,··· ,m1 }j∈{1,··· ,m2 } bi,n1 (ξ1 ) bj,n2 (ξ2 ) wij を . n1 次および n2 次の NURBS 曲面 (NURBS surface) という. NURBS 曲面は,NURBS 曲面の特徴に加えて,2 次曲面を正確に表 現できる特徴をもつ.また,中間ノットを多重化することで複数の曲面 を接続したような曲面を表せる. . . . . . . 75 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.6.1 OpenGL による NURBS 曲面 (cnt.) 実際の描画では,サンプリング点を次の関数で計算し,平面を描いて いく. . gluBeginSurface() . void gluBeginSurface(GLUnurbs* nurb), void gluEndSurface(GLUnurbs* nurb); NURBS 曲面の定義の範囲を設定する. . . . . . . . 78 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.6.1 OpenGL による NURBS 曲面 (cnt.) 図 9.6.1: OpenGL で描かれた NURBS 曲面 . . . . . . 80 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . NURBS 曲面 . . . . . . . §9.6.1 OpenGL による NURBS 曲面 (cnt.) . 演習 9.6.2 (NURBS 曲面) . .program9 5.c を参考にして,NURBS 曲面を作成せよ. . . . . . . 81 / 82 はじめに 自由曲面とは . . . . . . . . . . . . OpenGL による NURBS 曲面 B´ ezier 曲線 . . . . . . . . . . . B-スプライン曲線 . . . . . . . . . . . B´ ezier 曲面 . . . . . . . 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. . . . . . . 82 / 82
© Copyright 2024 ExpyDoc