ポリゴンメッシュ (2) - 変形と簡略化- 東京大学 精密工学専攻 大竹豊 資料および授業の情報は :

Slides:



Advertisements
Similar presentations
Absolute Orientation. Absolute Orientation の問題 二つの座標系の間における剛体 (rigid body) 変換を復元す る問題である。 例えば: 2 台のステレオカメラから得られた3次元情報の間の関 係を推定する問題。 2 台のステレオカメラから得られた3次元情報の間の関.
Advertisements

原子動力工学特論 課題2 交通電子機械工学専攻 2003310 齋藤 泰治.
初年次セミナー 第13回 2次元グラフィックス(1).
データ解析
豊洲 304教室 15 JULY コンピュータグラフィックス 2008年度版.
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
プログラミング演習3 李 亜民クラス 第2回 ラスタライズ.
CGアニメーションの原理 基本技術 対象物体の動きや変形の設定方法 レンダリング技術
電子情報工学科5年(前期) 7回目(21/5/2015) 担当:古山彰一
ラベル付き区間グラフを列挙するBDDとその応用
プログラミング言語としてのR 情報知能学科 白井 英俊.
4.3 連立1次方程式   Ax = b   (23) と書くことができる。
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
Extremal Combinatorics 14.1 ~ 14.2
IT入門B2 ー 連立一次方程式 ー.
システム開発実験No.7        解 説       “論理式の簡略化方法”.
透視投影(中心射影)とは  ○ 3次元空間上の点を2次元平面へ投影する方法の一つ  ○ 投影方法   1.投影中心を定義する   2.投影平面を定義する
高山建志 五十嵐健夫 テクスチャ合成の新たな応用と展開 k 情報処理 vol.53 No.6 June 2012 pp
(ラプラス変換の復習) 教科書には相当する章はない
3次元での回転表示について.
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
CGと形状モデリング 授業資料 長井 超慧(東京大学)
C 言語について 補足資料 資料および授業の情報は :
データ解析 静岡大学工学部 安藤和敏
3D散歩ゲーム 08A2043 谷口盛海 種田研究室.
CGと形状モデリング 授業資料 長井 超慧(東京大学)
グラフアルゴリズムの可視化 数理科学コース 福永研究室 高橋 優子 2018/12/29.
電界中の電子の運動 シミュレータ作成 精密工学科プログラミング基礎 資料.
ポリゴンメッシュ (1) - データ構造とレンダリングに必要な計算 -
CAD曲線 (ベジエ曲線・Bスプライン曲線)
プログラミング演習I 行列計算と線形方程式の求解
第14章 モデルの結合 修士2年 山川佳洋.
流体の粘性項を 気体分子運動論の助けを借りて、 直感的に理解する方法
第6章 特徴空間の変換 6.1 特徴選択と特徴空間の変換 6.2 特徴量の正規化 平成15年5月23日(金) 発表者 藤井 丈明
6. ラプラス変換.
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
3次元での回転表示について.
Poisson Image Editing SIGGRAPH 2003
デジタル画像とC言語.
CAD曲面 東京大学 精密工学専攻 大竹豊 資料および授業の情報は :
25. Randomized Algorithms
変換されても変換されない頑固ベクトル どうしたら頑固になれるか 頑固なベクトルは何に使える?
関数への道.
建築模型制作支援のための ソフトウェア研究開発
パターン認識特論 担当:和田 俊和 部屋 A513 主成分分析
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
知識科学研究科 知識システム構築論講座 林研究室 佛明 智
4. システムの安定性.
第3章 線形回帰モデル 修士1年 山田 孝太郎.
プログラミング 3 2 次元配列.
サポートベクターマシン Support Vector Machine SVM
補講:アルゴリズムと漸近的評価.
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
第16章 動的計画法 アルゴリズムイントロダクション.
回帰分析(Regression Analysis)
地理情報システム論(総)/ 国民経済計算論(商)
地理情報システム論 第4回 コンピュータシステムおける データ表現(2)
Poisson Image Editing SIGGRAPH 2003
目で見る一次変換 河合塾 数学科 生越茂樹 オゴセ シゲキ.
バネモデルの シミュレータ作成 精密工学科プログラミング基礎 資料.
精密工学科プログラミング基礎 第7回資料 (11/27実施)
パターン認識特論 カーネル主成分分析 和田俊和.
Cプログラミング演習 ニュートン法による方程式の求解.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
3 一次関数 1章 一次関数とグラフ §4 方程式とグラフ         (3時間).
市松模様を使用した カメラキャリブレーション
プログラミング入門2 第5回 配列 変数宣言、初期化について
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

ポリゴンメッシュ (2) - 変形と簡略化- 東京大学 精密工学専攻 大竹豊 資料および授業の情報は : 資料および授業の情報は : http://www.den.t.u-tokyo.ac.jp/ohtake/GeomPro/

今回の授業の目的 ポリゴンメッシュに関して以下を学ぶ 頂点を移動することによる形の変形 三角形の数を減らすことによる簡略化

話の流れ 変形 モーフィング 簡略化

メッシュの変形とは? 頂点を動かすことにより実現される 頂点移動 変形

変形方法の分類 表面形状を直接変形する方法 表面形状と関係なく空間を変形する方法 考え方のみ説明します 簡単なものについてプログラミングをしてみます

曲面を直接変形する手法 形がなるべく変わらないように、 ユーザが指定した制御点の移動を反映する 変形

最も単純な変形手法 ラプラシアンを曲面の局所的な形状として 変形の前後でなるべく同じになるようにする ラプラシアン: 局所的な凹凸情報 ラプラシアンを曲面の局所的な形状として 変形の前後でなるべく同じになるようにする ラプラシアン:   局所的な凹凸情報 制御点 (頂点の部分集合)

変形後の頂点の位置の計算 移動後の位置 {xi} についての連立方程式を解く ラプラシアンの保存について (9つ) 7 8 1 6 3 2 9 制御点の位置について (2つ) 5 4 ポアソン方程式を離散的に解いている

連立方程式の解き方 正規方程式   にて最小二乗解を求める 各座標 x, y, z について個別に3回解く 以下の最小化問題を解くことにあたる

線形方程式の解き方 直接法により疎な連立方程式を解く 行列が対称かつ正定なのでコレスキー分解が可能 制御点の移動毎に方程式を解く必要あり 方程式の右辺だけが変わる (行列は同じ) 行列が対称かつ正定なのでコレスキー分解が可能 TAUCS 2.2 : A Library of Sparse Linear Solvers を利用 行列生成 + 分解 : 2.8 秒 後退代入×3 : 0.18 秒 頂点数 : 25千

アフィン変換を考慮 ラプラシアンを拡大・回転しておくと 以下のようなことも可能

空間変形による変形方法 空間を歪めることにより, 結果として空間に存在する頂点が移動する 元の頂点と空間 変形後の頂点と空間

空間変形の関数 入力 : 変形前の頂点の位置 出力 : 変形後の頂点の位置

単純な変換の例 平行移動 回転移動

単純な空間変形 回転変換や平行移動を 空間の位置によって変える 回転角を増やす 局所的に 平行移動する つまみ変形 ねじり変形

ねじり変形の詳細

つまみ変形の詳細 2次元の場合 移動ベクトル 影響半径 影響の強さ 変形中心

複数でつまむ すべてのつまみ変形を足す

変形の関数 変形のためのデータ //変形ベクトルの数 float (*ver0)[3] ; //変形前の頂点 #define N 2 float t[N][3] = {{0,0,0.75}, {0.5,0,0} }; //変形領域の中心の座標 float c[N][3] = { {0,0,1}, {1,0,0} }; //変形領域の半径 float r[N] = {1.5, 0.4}; float (*ver0)[3] ; //変形前の頂点 float (*ver)[3]; //変形後の頂点 void deform(){ for(int i=0; i<verN; i++){ float s[3] = {0,0,0}; for(int j=0; j<N; j++){ // ここを埋める } ver[i][0] = ver0[i][0] + s[0]; ver[i][1] = ver0[i][1] + s[1]; ver[i][2] = ver0[i][2] + s[2];

課題 1 prog3-2 を使う 変形の関数 “deform” を完成させよ 変形後に口と鼻が付くように 変形のデータ変更せよ 変形後に口と鼻が付くように    変形のデータ変更せよ

話の流れ 変形 モーフィング 簡略化

メッシュモーフィング 2つのメッシュを時間軸において補間する モーフィング前の メッシュ モーフィング後の メッシュ 0.25 0.5 0.25 0.5 0.75 1 時間

単純なモーフィング法 対応するメッシュの頂点を直線的に移動する 三角形は同じであると仮定する t 1-t

プログラム float (*ver0)[3] ; //モーフィング前のメッシュ アニメーションの仕組み void morphing(float t){ } 時間 t を増やす/減らす 全ての頂点に関して を計算する 頂点位置の変更 繰り返す メッシュのレンダリング

課題 2 prog3-3 を使う モーフィングの関数 “morphing” を完成させよ #define されている値 NUM_FRAME は t が 0~1 に変わる間に何コマに分けるかを表す. この値を変更するとどうなるか観察せよ. 時間 t の変化の範囲を -1 ~ 2 に変更すると   どのように変わるか観察せよ

メッシュ簡略化 なるべく形が変わらないように、    メッシュの三角形の数を減らす 約4分の1の三角形数

最も良く用いられる手法 (Garland-Heckbert 法, 1997) 辺を潰すことを繰り返していく 辺を潰す (頂点が1個、三角形2個 が消える) 繰り返し数

単純な手法 格子を使って、頂点をまとめる 単位格子 (セル) に入っている複数の頂点を                ひとつの頂点へまとめる 一つに まとめる

計算方法 各三角形 (A,B,C) において以下を行う 関数 cellVertexID(A) の返り値を A’ へ代入 関数 cellVertexID(B) の返り値を B’ へ代入 関数 cellVertexID(C) の返り値を C’ へ代入 もし A’≠ B’ かつ B’≠ C’ かつ C’≠ A’ ならば     三角形 (A’,B’,C’) を簡略化メッシュへ追加する 関数 cellVertexID(v) : 頂点 v を含むセル C を見つける もしセル C に簡略化後の頂点が未割当なら 簡略化後のメッシュへ 頂点 v を追加する セル C へ 頂点 v を割り当てる セル C に割り当てられている頂点を返す サブ関数

簡略化をする前のデータの初期化 データ 簡略化の処理 次 ページ //セルとその数 verN = 0; #deinfe CELLN 50 int cell[CELLN][CELLN][CELLN] //簡略化前のメッシュ int ver0N; float (*ver0)[3] ; int tri0N; int (*tri0)[3]; //簡略化後のメッシュ int verN; float (*ver)[3] ; int triN; int (*tri)[3]; verN = 0; triN = 0; for(int i=0; i<CELLN; i++) for(int j=0; j<CELLN; j++) for(int k=0; k<CELLN; k++) cell[i][j][k] = -1; 簡略化の処理 for(int i=0; i<tri0N; i++){ int* t0 = tri0[i]; int a = cellVertexID( t0[0] ); int b = cellVertexID( t0[1] ); int c = cellVertexID( t0[2] ); if(a != b && b != c && c != a) addTriangle(a, b, c ); } 次 ページ

サブ関数 int cellVertex(int id){ float* p = ver0[id]; //格子全体の大きさは [-1,1]3 int cx = (int)(CELL*(p[0] + 1.0f)/2.0f); int cy = (int)(CELL*(p[1] + 1.0f)/2.0f); int cz = (int)(CELL*(p[2] + 1.0f)/2.0f); if(cells[cz][cy][cx] < 0){ cells[cz][cy][cx] = numVertices; addVertex( p ); } return cells[cz][cy][cx]; void addTriangle(int a, int b, int c){ } 課題 : 三角形 (a,b,c) を 簡略化後の三角形 tri へ追加 void addVertex(float p[3]){ } 課題 : 頂点 p を 簡略化後の頂点 ver へ追加

課題 3 prog3-4 を使う 簡略化後の頂点・三角形を 追加する関数を完成させよ 簡略化後の頂点・三角形を 追加する関数を完成させよ ‘s’ キーで簡略化後のメッシュが表示される ‘o’ キーで簡略化前のメッシュが表示される 現在の簡略化の計算法においては、各セルに含まれる頂点群のうちで番号が最初のものが簡略化後の頂点になる.改良して、簡略化後の頂点が各セルに含まれる頂点群の平均になるようにせよ. 必要な変数は追加してよい