コンピュータグラフィックス...

52
コンピュータグラフィックス 基礎 7回 曲線・曲面の表現 形状モデリング 金森 由博

Upload: others

Post on 01-Feb-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

コンピュータグラフィックス基礎

第7回曲線・曲面の表現形状モデリング

金森 由博

Page 2: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

3DCG表示

• 対象物を計算機内で表現する

• 形の定義

• 表面の材質

• 光源

モデリング レンダリング

対象物をディスプレイに表示する 投影(座標変換)

照光(反射・屈折の計算)

今回のテーマ

Page 3: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

3

モデリング

• モデリングとは?• 画面表示したい物体の形,位置,大きさなどをコンピュータ内部のデータとして表現すること

• 出来上がったデータ → モデル

• 目的に応じた適切なモデリングのために・・・• 多面体の表現方法

• 曲線,曲面の表現方法

• 自然物,複雑な形状の表現方法

Page 4: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

4

様々な形状モデリングの例

Page 5: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

5

点群モデル

• 頂点座標だけを記録する• データ表現が単純

• 立体を表現できない

• 3次元形状測定器で得られる

• point cloud (点群)• 後の処理が必要

• 複数データの位置合わせ

• 面の生成

Page 6: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

6

ワイヤーフレームモデル

• 頂点座標,稜線だけを記録する

• データ表現が単純

• 計算が容易• 計算機の性能が低かった時代によく使われた

• 欠点• 裏側も見えてしまう(複雑な形を把握しにくい)

• 形が一意に定まらない場合がある

Page 7: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する
Page 8: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

8

ワイヤーフレームモデルのデータ構造

頂点リストと稜線リスト

Page 9: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

ワイヤフレームモデルの表現

class Vertex {public:Vector3d position;

};

class Edge {public:Vertex *sp;Vertex *ep;

};

class Model {public:std::vector<Vertex*> vertices;std::vector<Edge*> edges;

};

Page 10: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

10

サーフェスモデル

• ワイヤーフレーム+面情報

Page 11: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

11

サーフェスモデルのデータ構造

Page 12: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

サーフェスモデルの表現

class Vertex {public:

Vector3d position;};

class Face {public:

std::vector<Vertex*> vertices;};

class Model {public:

std::vector<Vertex*> vertices;std::vector<Face*> faces;};

Page 13: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

13

ソリッドモデル

• サーフェスモデル+物体の内外を区別する情報

(穴の無いサーフェスモデルで表現することも)

Page 14: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

14

形状の表現法の進化

Page 15: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

15

ソリッドモデルの形状表現

• 建築物や機械部品などを設計するCADの分野で使用される

• 数式で表現される形状を扱うことが多い

• 境界表現• CSG表現• スイープ表現• 局所変形

Page 16: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

境界表現

• 頂点座標と稜線・面の接続関係で立体を表現

Page 17: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

境界表現

• 幾何情報• 形状を定めるための情報

• つまりは頂点の座標値

• 位相情報• 立体表面がどのように構成されているかを定める情報

例• どの頂点とどの頂点が稜線で結ばれているか

• ある面のカドを構成している頂点はどれであるか

• ある面の周囲を構成している稜線はどれであるか

• ある面と隣接する面はどれであるか

• 位相情報をどのようなデータ構造で保持するかには、様々な方法がある(例:ハーフエッジ構造)

Page 18: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

ハーフエッジ構造

近傍の面、頂点、稜線に高速にアクセスできる

Page 19: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

19

CSG(Constructive Solid Geometry)表現

• 立体をプリミティブ(基本立体)と,その組み合わせで表現

• 基本立体の種類,大きさ,位置情報,結合状態をツリー構造で表す

基本立体: 立方体,円柱,多角柱,円錐,球

集合演算: 和集合,積集合,差集合,補集合

Page 20: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

CSGの例

Page 21: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

CSGの例:POV-Rayのシーンファイルの記述

http://www.sato-lab.jp/ml2006/8th.html

Page 22: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

スイープ表現

• 平面図形を一定方向に移動したときの軌跡で立体を表現

• 局所変形との組み合わせで,様々な形状を表現可能

• 平行移動スイープ,回転移動スイープ

Page 23: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

オイラー操作(局所変形)• ソリッドモデルに対する形状操作

• 面や頂点、稜線を増やす操作

• 次のような性質がある• 操作後もオイラー・ポアンカレの公式を常に満たす

• オイラー操作の組み合わせで任意のソリッドモデルを作成できる

(ソリッドモデル=オイラー操作の組み合わせ)

Page 24: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

オイラー・ポアンカレの公式

• オイラー・ポアンカレの公式とは• ソリッドモデルに不変な構成要素の関係式

v - e + f - h = 2 (m - g)頂点数 - 稜線数 + 面数 - 面内ループ数 = 2 (物体数 -貫通穴数) どちらでも成り立つか?

Page 25: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

オイラー操作の例

• L字型立体の生成• 変形1:面の2分割

• 変形2:面の押し出し

Page 26: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

オイラー操作の例

• MEV(Make Edge Vertex):新しい頂点と稜線を追加

• KEV(Kill Edge Vertex):頂点と稜線を削除

• MEF(Make Edge Face):新しい面と稜線を追加

• KEF(Kill Edge Face):面と稜線を削除

Page 27: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

オイラー操作の例

Page 28: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

28

他の表現方法

• ボリューム表現

• 八分木表現

• フラクタル図形

• メタボール

• パーティクル

• 三角形メッシュ

Page 29: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

ボリューム表現

• 立体を3次元の格子状の小立方体(ボクセル)の集合で表す

• 長所• データ構造が単純,集合演算が容易

• 人工的な物体より,自然界の不規則な形状表現に適する

• 短所• データ量が膨大,操作に手間がかかる

Page 30: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

30

ボリュームレンダリング

Page 31: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

31

ボリュームレンダリング

Page 32: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

32

八分木表現

• ボクセルを階層的に,木構造で生成

• 物体が存在するボクセルのみ細かく分割

• 空間量(メモリ)も少なくて済み,高速

3次元画像の八分木表現

Page 33: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

フラクタル図形

• 全体形状がその形状の各部分にも現れるような形状.

• 自己相似形状, 再帰構造• 例)コッホ曲線,ジュリア集合,マンデブロ集合など

Page 34: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

中点変位法

• 中点に起伏量Zを加える操作を繰り返す

• 起伏量Zは,正規分布に従う乱数によって決定

Xm=(X1+X2)/2 、Ym=(Y1+Y2)/2XX = Xm + Z、YY = Ym + Z

Page 35: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

35

中点変位法による画像生成

Page 36: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

36

メタボール

• 立体を球の集まりで表現

• 距離とともに減衰する影響力(関数)を定義し, その重ね合わせで形状を表現

Page 37: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

37

Page 38: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

パーティクル

• 形状が不定で,明確な表面が存在しない物体• 樹木,炎,滝,雲 などの自然物

• 一定の規則に従って生成した多数の粒子で表現• 粒子(パーティクル)の生成,移動,消滅,衝突 の物理的規則が必要

パーティクルで表現した炎と煙

Page 39: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

三角形メッシュ表現

• 三角形の集合で形を表現する• 自然物など数式で表現しにくい形状を扱いやすい

• データ構造がシンプルである

• 面の細かさで精度を調整できる(データ量と精度のトレードオフ)

Page 40: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

課題説明

Page 41: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

OBJViewの動作確認• OBJファイルを表示するアプリケーション

• Windows, Mac で動作するバイナリコードとソースコード付き

Page 42: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

立方体モデルデータの作成

• OBJ形式で立体の形を記述してみる(テキストファイル)

• 記述した形が意図したものになっているか確認する

v 0.0 0.0 100.0………f 1 2 3f 1 3 4……

面の向きが裏になっている場合はグレーで表示される

Page 43: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

OBJ形式とは

• Wavefront社の策定したフォーマット• 数あるフォーマットの1つに過ぎない。これ以外にも様々なフォーマットがある。一長一短。

• キーワード「v」の後に頂点の座標を記す

• キーワード「f」の後に面を構成する頂点番号を記す

• 1行1エントリ

OBJ, 3DS, VRML, X3D, DXF, STL, POV, etc.

Page 44: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

V1 (0, 0, 1)

V2 (2, 0, -1)

V3 (0, 2, 0)

V4(-1, 0, 0)

v 0 0 1v 2 0 -1v 0 2 0v -1 0 0f 3 1 2f 3 4 1f 3 2 4f 1 4 2

頂点番号は1から始まる

Page 45: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

座標系と面の向き

反時計回りに見える向きが表面

OBJViewでは、裏面(内側)は灰色で表示される

Page 46: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

パラメトリック曲面の作成実験頂点座標を2次元配列で保持

#define NUM_U 50 // U方向の分割数

#define NUM_V 50 // V方向の分割数

double x[NUM_U+1][NUM_V+1]; // x 座標

double y[NUM_U+1][NUM_V+1]; // y 座標

double z[NUM_U+1][NUM_V+1]; // z 座標

1つの四角形領域は2つの三角形で表現。それぞれ、{lb, rb,rt}および{lb,rt,lt}に位置する頂点を参照する。

Page 47: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

2つのパラメータu,v(0<=u,v<=1)から生成されるパラメトリック曲面の生成

多くの曲面は2つのパラメータで表現できる(球、トーラス、平行スイープ、回転スイープ)

NUM_V :v方向の分割数 (右の例では6)NUM_U:u方向の分割数 (右の例では8)

頂点の数 = (NUM_V + 1) * (NUM_U + 1)四角形の数 = NUM_V * NUM_U

頂点インデックスの計算

for(int i = 0; i < NUM_U; i++) {for(int j = 0; j < NUM_V; j++) {int lb_index = 左下の頂点番号の計算式int lt_index = 左上の頂点番号の計算式int rb_index = 右下の頂点番号の計算式int rt_index = 右上の頂点番号の計算式

// 三角形を構成する頂点番号を出力// (OBJ形式の場合はインデックスが1から始まる)fprintf(fout, "f %d %d %d¥n", lb_index+1, rt_index+1, lt_index+1);fprintf(fout, "f %d %d %d¥n", lb_index+1, rb_index+1, rt_index+1);

}}

頂点位置の計算lb rb

rtlt

u

v

for(int i = 0; i < NUM_U+1; i++) {for(int j = 0; j < NUM_V+1; j++) {// u と v の値を 0.0 ~ 1.0 に正規化するdouble u = 1.0 / NUM_U * i;double v = 1.0 / NUM_V * j;

// 座標値の設定x[i][j] = uとvで定義されるy[i][j] = uとvで定義されるz[i][j] = uとvで定義される

}}

Page 48: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

数式で表現されるパラメトリック曲面

𝑥𝑥 = 𝑢𝑢𝑦𝑦 = 𝑣𝑣

𝑧𝑧 =1

10sin(8�(𝑢𝑢 − 1/2)2 + (𝑣𝑣 − 1/2)2 π)

(0 ≤ 𝑢𝑢 ≤ 1, 0 ≤ 𝑣𝑣 ≤ 1)

波紋 ガウス関数

⎩⎨

⎧𝑥𝑥 = 𝑢𝑢𝑦𝑦 = 𝑣𝑣

𝑧𝑧 =12

exp�−(𝑢𝑢 − 1/2)2 + (𝑣𝑣 − 1/2)2

0.1�

(0 ≤ 𝑢𝑢 ≤ 1, 0 ≤ 𝑣𝑣 ≤ 1)

Page 49: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

数式で表現されるパラメトリック曲面

�𝑥𝑥 = cos(𝑢𝑢) cos(𝑣𝑣)𝑦𝑦 = sin(𝑢𝑢) cos(𝑣𝑣)

𝑧𝑧 = sin(𝑣𝑣) (0 ≤ 𝑢𝑢 ≤ 2𝜋𝜋,−

𝜋𝜋2≤ 𝑣𝑣 ≤

𝜋𝜋2

)

トーラス

数式を自分で考えてみよう

Page 50: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

自由形状

ベジェ曲線の作図と組み合わせて、様々な曲面を作ってみよう

曲線を回転してできる回転対称な図形

Page 51: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する

先輩たちの作例

Page 52: コンピュータグラフィックス 基礎kanamori.cs.tsukuba.ac.jp/lecture/2019/cg_basics/07/07...6 ワイヤーフレームモデル • 頂点座標,稜線だけを 記録する