第6章 3次元形状のモデリング2 CSG (constructive solid geometry) 表現 基本3...
Transcript of 第6章 3次元形状のモデリング2 CSG (constructive solid geometry) 表現 基本3...
第 6 章 3 次元形状のモデリング
第 6章 3次元形状のモデリング
畔上 秀幸
名古屋大学 情報学研究科 複雑系科学専攻
April 3, 2019
1 / 54
第 6 章 3 次元形状のモデリング
はじめに
§6.1 はじめに
(目標) CG で使われる 3次元形状の表現方法について理解する.
2 / 54
第 6 章 3 次元形状のモデリング
3 次元形状表現法の種類
§6.2 3次元形状表現法の種類
1 B-Reps (boundary representation) 表現• 境界面を定義することで 3次元形状を表現する.
2 CSG (constructive solid geometry) 表現• 基本 3次元形状の集合演算によって 3次元形状を表現する.
3 ボクセル (voxel) 表現,オクトリー (octree) 表現• 3次元空間をボクセル (立方体の単位セル) に分割し,3次元形状に含まれるボクセルの集合で 3次元形状を表現する.
4 メタボール (meta-ball) 表現,CSRBF (compactly supported radial basisfunction) 表現
• 基底関数の組み合わせによって 3次元形状を表現する.
3 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
§6.3 B-Reps 表現
定義 6.3.1 (多面体)
4つ以上の平面で囲まれた3次元有界領域を多面体 (Polyhedron) という.多面体は,複数の頂点を結ぶ辺と,その辺に囲まれた面で構成される.
4 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
定義 6.3.2 (B-Reps 表現)
多面体を頂点 (vertex),辺 (edge),面 (face) に対する1 幾何情報
a 頂点の座標値b 辺を表す数式c 面を表す数式
2 位相情報a 辺と頂点の接続情報b 面と辺の接続情報
で表現する方法を B-Reps 表現という.
5 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための必要条件
§ 6.3.1 多面体であるための必要条件
境界を求める演算子を ∂ と表す.図のような 4面体 P に対して,
∂P = △ABC+△CDA+△BDC+△BAD
∂ △ABC =−→AB+
−→BC+
−→CA, · · ·
∂−→AB = −A+ B, · · ·
∂A = 0
が成り立つ.
6 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための必要条件
A
B
C
DP
図 6.1: 4面体 P
7 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための必要条件
多面体であるならば,次の条件が成り立つ.
定理 6.3.3 (多面体であるための必要条件)
多面体 P の境界が多角形 Fi, i ∈ {1, 2, · · · , n}, で構成され, Fi の境界が線分Eij , j ∈ {1, 2, · · · ,mi}, で構成され,Eij の境界が点 Vijk, k ∈ {1, 2} で構成されるとき,P が多面体であるとき,
∂∂P = 0,
∂∂Fi = 0,
∂∂Eij = 0,
∂∂Vijk = 0
が成り立つ.
8 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための必要条件
境界の隣接行列
I0 =(A B C D
1 1 1 1
), I1 =
−→AB
−→BC
−→CA
−→DC
−→BD
−→DA
A −1 0 1 0 0 1
B 1 −1 0 0 −1 0
C 0 1 −1 1 0 0
D 0 0 0 −1 1 −1
I2 =
△ABC △CDA △BDC △BAD−→AB 1 0 0 −1−→BC 1 0 −1 0−→CA 1 −1 0 0−→DC 0 −1 1 0−→BD 0 0 1 −1−→DA 0 1 0 −1
, I3 =
△ABC 1
△CDA 1
△BDC 1
△BAD 1
9 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための必要条件
を用いれば
∂∂P = 0 ⇔ I0I1I2I3 = 0,
∂∂ △ABC = 0 · · · ⇔ I0I1I2 = 0TR4 ,
∂∂−→AB = 0 · · · ⇔ I0I1 = 0T
R6
とかける.
10 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための十分条件
§ 6.3.2 多面体であるための十分条件
次の条件が成り立つならば,多面体 (polyhedron) である.
定理 6.3.4 (Euler の多面体公式)
球と位相同型な多面体では,面の数 f , 辺の数 e, 頂点の数 v に対して,
χ = f − e+ v = 2
が成り立つ.貫通する穴の数 g,面上の穴 (リング) の数 h に対して,
χ = f − e+ v − h = 2− 2g
が成り立つ.
χ は Euler 標数 (Euler characteristic) とよばれる.
11 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための十分条件
定理 6.3.4 より,次のことがいえる.
1 多面体の数 b, 面の数 f , 辺の数 e, 頂点の数 v, 貫通する穴の数 g,面上の穴(リング) の数 h に対して,定理 6.3.4 より
z (x) = a · x = 0 (6.3.1)
が成り立つ.ただし,
a =(1 −1 1 −1 2 −2
)T,
x =(v e f h g b
)Tである.したがって,定理 6.3.4 を満たす x は,上式を満たす 6次元上の超平面上の整数値ベクトル (格子点) の集合である.
2 式 (6.3.1) を満たす独立な x のベクトルは5つである.それらを di,i ∈ {1, 2, · · · , 5}, とかき,Euler 作用素とよぶ.
3 di, i ∈ {1, 2, · · · , 5}, は,式 (6.3.1) を満たす超平面内にあることから,dz/dx = a と直交する.
12 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための十分条件
4 したがって,x は,整数 ni, i ∈ {1, 2, · · · , 5}, に対して
x = n1d1 + n2d2 + n3d3 + n4d4 + n5d5
とかける.
5 例えば
A =(mev mfe mbfv mehg me-kh
d1 d2 d3 d4 d5
)
=
1 0 1 0 01 1 0 1 10 1 1 0 00 0 0 1 −10 0 0 1 00 0 1 0 0
13 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための十分条件
と選べば,
x = An
とかける.ただし,n = (n1, n2, · · · , n5)T である.また,記号
mev, · · · ,me-kh は Euler 作用素に対するニーモニックコード (mnemoniccodes) である.m, k はそれぞれ ”make”, ”kill”, v, e, f, h, g, b はそれぞれ”vertex”, ”edge”, ”face”, ”hole”, ”ring”, ”body” を表す.
4面体を作成する場合は次のようになる.
14 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
多面体であるための十分条件
mbfv mev mev
mfe mev mfe mfe
図 6.2: ニーモニックコードによる 4面体の作成
15 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
集合演算
§ 6.3.3 集合演算
B-Reps 表現における多面体の集合演算は次のように行われる.
1 多面体 A のすべての面と多面体 Bi, i ∈ {1, 2, · · · ,m}, のすべての面の交線を求める.
2 A, Bi, i ∈ {1, 2, · · · ,m}, のすべての辺と求めた交線の交点を求め,交点と辺と面のデータを保存する.
3 集合演算を行い,不要となる頂点,辺,面に消去のマークをつける.
4 消去マークの頂点,辺,面を削除する.
16 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
集合演算
図 6.3: B-Reps 表現における多面体の集合演算
17 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
局所演算
§ 6.3.4 局所演算
B-Reps 表現では次のような局所演算が使われる.
1 挿引演算 (sweep, swing)
2 反転演算 (reflection)
3 面取りa chamfer: 頂点あるいは辺を平面で置き換える.b fillet: 頂点あるいは辺を球面あるいは円筒面で置き換える.
4 せん断 (shear)
5 曲げ (bend)
6 角度付け (angle)
18 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
局所演算
sweep swing reflection
chamfer shear
図 6.4: B-Reps 表現における多面体の集合演算
19 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
位相データベース
§ 6.3.5 位相データベース
位相情報のデータベースには,次のような構造が使われる.1 リスト構造 (list structure)
a 多面体,面,辺は,それぞれを構成する要素のデータをもつ.b 構造は単純であるが,同じデータを重複して記憶する点が不利である.
P
F1 F2 Fn
E1 E2 Em...
V1 V2
...
図 6.5: リスト構造
20 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
位相データベース
2 リング構造 (ring structure)
a 多面体は,それを構成する面を一つ指定する.指定された面はその多面体を構成する面を順に指定して,最初の面に戻るリングを構成する.
b 面は,その面を構成する辺を一つ指定する.指定された辺はその面を構成する辺を順に指定して,最初の辺に戻るリングを構成する.
c 辺は,その辺を構成する頂点を一つ指定する.その頂点はもう一つの頂点を指定して,最初の頂点に戻るリングを構成する.
21 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
位相データベース
P
F1 F2 Fn
E1 E2 Em
V1 V2
...
...
図 6.6: リング構造
22 / 54
第 6 章 3 次元形状のモデリング
B-Reps 表現
位相データベース
3 ウィングド・エッジ・データ構造 (winged edge data structure)
a 各辺から,2つの頂点,2つの面,4つの辺へのポインタをもつ.b 各頂点は辺の一つに対してポインタをもつ.c 各面は辺の一つへのポインタをもつ.d 特徴:構造体の特徴を生かしたデータ構造である.この構造を用いて,時計回り,反時計回りにすべての辺を追跡できる.両方向の追跡により,B-Reps 表現の必要条件をチェックできる.
E pfacenface
pvt
nvt
pcw
ncw
nccw
pccw
E
pfacenface
pvt
nvt
pcw
ncw
nccw
pccw
図 6.7: ウィングド・エッジ・データ構造
23 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
§6.4 CSG 表現
定義 6.4.1 (CSG 表現)
3次元形状をプリミティブ (primitive) とよばれる基本形状の集合演算により表現する方式を CSG 表現という.
24 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
プリミティブの表現
§ 6.4.1 プリミティブ
プリミティブは制約条件を満たす3次元領域として表現される.例えば,円柱は
P (r, h) ={x ∈ R3
∣∣ x21 + x2
2 − r2 ≤ 0, x3 − h ≤ 0, x3 ≤ 0}
と表現される.一般に,プリミティブ Pi, i = 1, 2, · · · ,m, は
Pi ={x ∈ R3
∣∣ fij (x) ≤ 0, j ∈ {1, 2, · · · , ni}}
のように表現される.
25 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
プリミティブの表現
x3
x1
x2
r
h
図 6.1: 円柱
26 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
プリミティブの集合演算
§ 6.4.2 プリミティブの集合演算
3次元形状はプリミティブの集合演算 (Boolean operations) によって表現される (図 6.2 参照.ただし,\ は集合の差演算).
n
n
[
\
図 6.2: CSG 表現
27 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
正規化された集合演算
§ 6.4.3 正規化された集合演算
開領域 A,B ⊂ R2 の集合演算は図 6.3 のようになる.ただし,A = ∂A∪A とする.また,same, diff はそれぞれ外向き法線が同方向,逆方向の違いを表す.
28 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
正規化された集合演算
A B A ∩ B A \ B
B \ A ∂A ∩ B ∂B ∩A ∂A \ B
∂B \ A ∂A ∩ ∂B same ∂A ∩ ∂B diff
図 6.3: 集合演算
29 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
正規化された集合演算
集合演算の誤りを防ぐために,正規化された集合演算が使われる.開あるいは閉領域 A,B ⊂ R2, □ ∈ {∪,∩, \} に対して,
A□∗B = closure (interior (A□B))
で定義される □∗ ∈ {∪∗,∩∗, \∗} を正規化された集合演算という.ただし,closure は境界を含める,interior は境界を除く演算子を表す.
A B A ∩ B A ∩∗ B = A ∩∗ B
図 6.4: 正規化された集合演算
30 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
データベース
§ 6.4.4 データベース
プリミティブのデータベースには,次のような構造が使われる.
1 ID (識別番号)
2 種類
3 幾何正規化データ
4 属性データ
31 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
データベース
図 6.5: プリミティブデータベースの例
32 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
データベース
演算順序のデータベースには,次のような構造が使われる.
1 演算の種類
2 演算を受ける 3次元形状の構成順序へのポインタ
3 演算に入るプリミティブ IDへのポインタ
4 次に演算を受ける構成順序へのポインタ
33 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
アルゴリズム
§ 6.4.5 アルゴリズム
プリミティブのデータベースから必要な情報は次のようにして計算される.
1 あるプリミティブ
Pi ={x ∈ R3
∣∣ fij (x) ≤ 0, j ∈ {1, 2, · · · , ni}}
に対して,ある点 y ∈ R3 の内外判定は
Ifni∩j=1
(fij (y) ≤ 0) is true then 1 else 0
によって行われる.
34 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
アルゴリズム
図 6.6: 内外判定のアルゴリズム
35 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
アルゴリズム
2 ある点 y ∈ R3 からあるプリミティブ
Pi ={x ∈ R3
∣∣ fij (x) ≤ 0, j ∈ {1, 2, · · · , ni}}
の境界までの符号付き距離は
Bi (y) = maxj=1,2,··· ,ni
fij (y)
で求められる.ここで,Bi (x) を境界評価関数 (boundary evaluator)という.
3 ある点 y ∈ R3 からプリミティブ Pk = Pi□Pj , □ ∈ {∪,∩, \}, の境界までの符号付き距離は
Bk (y) =
min {Bi (y) , Bj (y)} for Pk = Pi ∪ Pj
max {Bi (y) , Bj (y)} for Pk = Pi ∩ Pj
max {Bi (y) ,−Bj (y)} for Pk = Pi \ Pj
によって計算される.ただし,Bi (y), Bj (y) は Pi, Pj の境界評価関数とする.
36 / 54
第 6 章 3 次元形状のモデリング
CSG 表現
アルゴリズム
4 Pk の境界 ∂Pk は,すべての j ∈ {1, 2, · · · , nk} に対して
∂Pk ={x ∈ R3
∣∣ Bk (x) = 0, fkj (x) = 0}
で与えられる.
5 fkj (x) と fkl (x), j, l ∈ {1, 2, · · · , nk}, の交線は{x ∈ R3
∣∣ Bk (x) = 0, fkj (x) = 0, fkl (x) = 0}
で与えられる.
6 fkj (x), fkl (x), fkm (x), j, l,m ∈ {1, 2, · · · , nk}, の交点は{x ∈ R3
∣∣ Bk (x) = 0, fkj (x) = 0, fkl (x) = 0, fkm (x) = 0}
で与えられる.
37 / 54
第 6 章 3 次元形状のモデリング
ボクセル表現
§6.5 ボクセル表現
定義 6.5.1 (ボクセル表現)
3次元形状を小さな立方体 (ボクセル, voxel) の集合で表現する方式をボクセル表現と表現という.
図 6.1: ピクセル (左) とボクセル (右)
38 / 54
第 6 章 3 次元形状のモデリング
ボクセル表現
ボクセル表現のデータ量を節約のために次の表現が考案された.
定義 6.5.2 (オクトリー表現)
3次元形状を小さな立方体 (ボクセル, voxel) の集合で表現する.ただし,各ボクセルごとに,次のいずれかに分類する.
1 3次元形状の内部にある(A)
2 3次元形状の外部になる(B)
3 3次元形状の内部と外部にまたがっている(C)
(C) のボクセルに対して,各辺 2等分により 8分割 (オクトリー:8分木) し,上記の分類を (C) のボクセルがなくなるまで繰り返す.
39 / 54
第 6 章 3 次元形状のモデリング
ボクセル表現
図 6.2: オクトリー表現
開発例 : ボリューム CAD(V-CAD), 理化学研究所
40 / 54
第 6 章 3 次元形状のモデリング
メタボール表現
§6.6 メタボール表現
定義 6.6.1 (メタボール表現)
基底関数の組み合わせにより濃度分布を作成し,その閾値による等高面で 3次元形状を表現する方式をメタボール表現という.
図 6.1: メタボール表現
41 / 54
第 6 章 3 次元形状のモデリング
メタボール表現
CSRBF (compactly supported radial basis function) 表現も同様に定義される.開発例 : DigiMeta
42 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
§6.7 OpenGL におけるプリミティブ関数
プリミティブを描く.
program6 1.c
void display(void)
...
/* 光源 */
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
...
glEnable(GL_LIGHTING); /* ライト ON */
...
/* プリミティブ */
glutSolidTorus(0.3, 0.9, 50, 50);
...
43 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
glLightfv()
void glLightfv(GLenum light, GLenum pname,
const GLfloat *params);
• glEnable(GL LIGHTING), glDisable(GL LIGHTING) で光源を設定を有効,無効とする.
• light に光源の番号(GL LIGHT0~GL LIGHTn,n はシステム依存)を設定する
• pname に GL POSITION を指定したとき, params は光源を同次座標(x1, x2, x3, w) で設定する.w = 0 のとき (x1, x2, x3) 方向の平行光線となる.GL DIFFUSE を指定すれば光源の拡散反射光強度(色)が設定可能となる.
• pname に GL DIFFUSE を指定したとき, params は拡散反射光強度を設定する.光源の拡散反射光強度が (R,G,B) なら params の各要素には(R,G,B, 1) を設定する.初期値は (1111).
44 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
glutInitDisplayMode()
void glutInitDisplayMode(unsigned int mode);
• ディスプレイの表示モードを設定する.• mode に GLUT DEPTH を指定して glEnable(GL DEPTH TEST) を指定することで隠面消去が有効となる.
45 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
1 丸型オブジェクト
glutWireCone(), glutSolidCone()
void glutWireCone(radius, height, slices, stacks)
void glutSolidCone(radius, height, slices, stacks)
円錐
glutWireSphere(), glutSolidSphere()
void glutWireSphere(radius, slices, stacks)
void glutSolidSphere(radius, slices, stacks)
球体
46 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
2 特殊型オブジェクト
glutWireTorus(), glutSolidTorus()
void glutWireTorus(innerRadius, outerRadius, nsides, rings)
void glutSolidTorus(innerRadius, outerRadius, nsides, rings)
トーラス
glutWireTeapot(), glutSolidTeapot()
void glutWireTeapot(size)
void glutSolidTeapot(size)
ティーポット
47 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
3 面体オブジェクト
glutWireTetrahedron(),glutSolidTetrahedron()
void glutWireTetrahedron(void)
void glutWireTetrahedron(void)
4面体
glutWireCube(), glutSolidCube()
void glutWireCube(width)
void glutSolidCube(width)
6面体 (立方体)
48 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
glutWireOctahedron(),glutSolidOctahedron()
void glutWireOctahedron(void)
void glutSolidOctahedron(void)
8面体
glutWireDodecahedron(),glutSolidDodecahedron()
void glutWireDodecahedron(void)
void glutSolidDodecahedron(void)
12面体
glutWireIcosahedron(),glutSolidIcosahedron()
void glutWireIcosahedron(void)
void glutSolidIcosahedron(void)
20面体
49 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
ロボットアームを描く.
program6 2.c
void display(void)
...
/* 第 1腕 */
glPushMatrix();
glScalef(0.5, 0.1, 0.1);
glutSolidCube(1.0);
glPopMatrix();
glTranslatef(0.5/2+0.05, 0.0, 0.0);
/* 第 1関節 */
glutSolidSphere(0.05, 10, 10);
...
50 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
図 6.1: ロボットアームの組み立て
51 / 54
第 6 章 3 次元形状のモデリング
OpenGL におけるプリミティブ関数
演習 6.7.1 (ロボットの製作)
プログラム program6 2.c を参考にして図 6.2 のようなロボットを製作せよ.
図 6.2: ロボット
52 / 54
第 6 章 3 次元形状のモデリング
まとめ
§6.8 まとめ
CG で使われる 3次元形状の表現方法についてみてきた.
1 B-Reps 表現では境界面によって多面体が表現される.
2 CSG 表現ではプリミティブの集合演算によって 3次元形状が表現される.
3 ボクセル表現,オクトリー表現では,3次元空間をボクセルの集合で 3次元形状が表現される.
4 メタボール表現,CSRBF 表現では,基底関数の組み合わせによって 3次元形状が表現される.
53 / 54
第 6 章 3 次元形状のモデリング
参考文献
参考文献
[1] 嘉数侑昇, 古川正志.
CAD/CAM/CGのための形状処理工学入門.
森北出版, 1995.
[2] James D. Foley, Steven K. Feiner, Andries van Dam, John F. Hughes, 佐藤義雄 (訳).
コンピュータグラフィックス 理論と実践.
オーム社, 2001.
[3] 千葉則茂, 土井章男.
3次元 CGの基礎と応用.
サイエンス社, 2004.
54 / 54