Screen Space Mesh
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
----
#contents
----
*Screen Space Mesh [#v6f6fd84]
陰関数曲面から表面を記述する三角形メッシュを抽出する場合,
Marching Cubesに代表されるように3D空間を3Dのグリッド構造...
各セルにおいてメッシュを生成するのが一般的である.
これに対して2Dスクリーン空間でメッシュを生成するのが,
Screen Space Meshes(SSM)¬e{Muller2007:M. Muller, S. Sc...
SSMはパーティクルから生成した閉じた陰関数曲面を対象として...
物体形状を三角形メッシュで表した場合,視点から見えない面(...
このような隠面消去はOpenGLなどの3D APIにおける描画では一...
SSMでは同様の考え方で,そもそも隠面は三角形ポリゴンを作る...
3D空間内のパーティクルを2Dスクリーン空間に投影して生成し...
2Dメッシュを生成,3D空間に逆投影することで視点から見える...
また,デプスマップに対して平滑化フィルタをかけることでメ...
3D Marching Cubesでは計算コストは各軸の分割数nの3乗に比例...
SSMでは2D空間でメッシュを生成するので,nの2乗に比例するだ...
ただし,視点から見えている面しかできないので,
屈折面だと1回の屈折しか考慮できないことには注意.
**入力 [#r4bdac33]
SSMはパーティクルデータを対象としているため,入力はパーテ...
-パーティクル座標 : &ref(ssm.eq1.gif,nolink,70%);
-投影変換行列 : &ref(ssm.eq2.gif,nolink,70%);
さらに,固定パラメータとして以下のものがある.
-スクリーン間隔 : &ref(ssm.eq3.gif,nolink,70%);~
スクリーン空間でのグリッド幅.
-パーティクル半径 : &ref(ssm.eq4.gif,nolink,70%);~
スクリーン空間でのパーティクル半径.
-平滑化係数 : &ref(ssm.eq5.gif,nolink,70%);~
デプスマップ平滑化のフィルタ幅と輪郭平滑化のための反復数.
-デプス閾値 : &ref(ssm.eq6.gif,nolink,70%);~
デプス値のメッシュ化閾値.この閾値以上のデプス値を持つグ...
**手順 [#c86cd97e]
デプスマップを
#ref(ssm.eq7.gif,nolink,70%)
とし,各グリッドでのデプス値を&ref(ssm.eq8.gif,nolink,70%...
グリッド分割数は,スクリーン間隔&ref(ssm.eq9.gif,nolink,7...
#ref(ssm.eq11.gif,nolink,70%)
|&ref(screen_space.jpg,nolink,100%);|
|CENTER:デプスマップ|
以下で&ref(ssm.eq12.gif,nolink,70%);を用いたスクリーンス...
**デプスマップ生成 [#r90e301a]
まず,&ref(ssm.eq8.gif,nolink,70%);を&ref(ssm.eq13.gif,no...
次にすべてのパーティクルの中心座標,半径に投影変換を施す.
まず,中心座標に投影変換行列をかける.
#ref(ssm.eq14.gif,nolink,70%)
さらに&ref(ssm.eq15.gif,nolink,70%);で割ることで[-1, 1]の...
#ref(ssm.eq16.gif,nolink,70%)
&ref(ssm.eq17.gif,nolink,70%);はメッシュ生成の基準に用い...
半径に関しても同様に,
#ref(ssm.eq18.gif,nolink,70%)
&ref(ssm.eq19.gif,nolink,70%);は投影変換行列の各要素であ...
&ref(ssm.eq20.gif,nolink,70%);はすべてのパーティクルで共...
パーティクル中心座標と半径を使ってデプス値を更新する.
#ref(ssm.eq21.gif,nolink,70%)
ここで,
#ref(ssm.eq22.gif,nolink,70%)
ただし,&ref(ssm.eq23.gif,nolink,70%);は,
#ref(ssm.eq24.gif,nolink,70%)
を満たす範囲内のセルである.ここで,&ref(ssm.eq25.gif,nol...
この処理をすべてのパーティクルで行うことでデプスマップが...
**デプスマップ平滑化 [#m666dfe4]
ユーザが設定したフィルタ幅&ref(ssm.eq26.gif,nolink,70%);...
(&ref(ssm.eq27.gif,nolink,70%);の場合,中心となるデプス値...
まず最初に&ref(ssm.eq28.gif,nolink,70%);であるすべてのデ...
次に同様にしてy軸方向にも適用する.
また,,中心デプス値との差が&ref(ssm.eq29.gif,nolink,70%)...
**輪郭ノード検出 [#h8a28cf3]
メッシュの外周となる輪郭部分に属するノードを検出する.
ここでいうノードとは輪郭をまたぐグリッドエッジ(輪郭エッジ...
ここでのグリッドとはMarching Squaresによりメッシュを生成...
デプスマップ用のグリッドとは異なる.ただし,説明を簡単に...
隣接するグリッドのデプス値を比較することで,エッジが輪郭...
単純にデプス値が有限と無限の境が輪郭とすると,
下図のような場合に本来つながっていないところがつながって...
本来赤の実線のようなメッシュを作りたいので,デプス閾値&re...
|&ref(ssm_silhouette.jpg,nolink,100%);|
|CENTER:輪郭でのメッシュ|
デプスマップ生成の際と同様に各パーティクルごとにグリッド...
パーティクル境界と交差するエッジとノード,および,ノード...
求めたエッジが輪郭エッジとなる条件は以下.
-エッジ端点のデプス値の差が&ref(ssm.eq29.gif,nolink,70%);...
デプスマップからデプス値を抽出して上記の判定を行う.
この条件を満たすとき,輪郭エッジ内に1つの輪郭ノードが存在...
さらに,
-&ref(ssm.eq30.gif,nolink,70%); エッジデプス値平均 (下図左)
-エッジにすでに輪郭ノードが格納されていた場合,&ref(ssm.e...
を満たす場合,そのノードを輪郭ノードとしてエッジに格納し...
このとき,輪郭ノードが含まれる輪郭エッジの両端点のデプス...
|&ref(ssm_silhouette_a.jpg,nolink,100%);|&ref(ssm_silhoue...
|>|CENTER:輪郭ノードの選択(2重丸が輪郭ノードとして採用す...
**メッシュ頂点生成 [#z03cb575]
輪郭ノードに加えて,内部の頂点も加えて,メッシュ頂点を算...
頂点を生成するパターンは以下の3つである.
-&ref(ssm.eq13.gif,nolink,70%);でない値を持つグリッドノー...
-両端点のデプス値が&ref(ssm.eq13.gif,nolink,70%);と&ref(s...
-両端点のデプス値が両方とも&ref(ssm.eq32.gif,nolink,70%);...
front vertexの座標,デプス値は輪郭エッジに格納された輪郭...
back vertexの座標は対応するfront vertexと同じであるが,デ...
そのため,隣接するグリッドノードのデプス値の外挿により算...
|&ref(ssm_front_and_back_vertex.jpg,nolink,100%);|
|CENTER:front vertex と back vertex|
**三角形メッシュ生成 [#n0a1203b]
下図参照.三角形間の隙間はそこに輪郭頂点があることを示す.
また,外部輪郭の場合はデプス値が&ref(ssm.eq13.gif,nolink,...
7,11,13,14のケースでは,3層に分かれており,もう一つ back ...
15のケースでは4層で,2つのback vertex を追加する必要があ...
|&ref(ssm_mesh.jpg,nolink,100%);|
|CENTER:三角形メッシュのパターン¬e{Muller2007};|
基本的にはMC法と同じくテーブルを作ってやればよいが,
いくつかの例外処理(追加のback vertexが必要な場合など)は必...
**輪郭平滑化 [#aa79d64f]
各輪郭頂点座標を,隣接頂点と自分自身の座標値の平均値で置...
輪郭の平滑化を行う.ただし,メッシュ生成におけるケース0の...
**3D空間への逆投影 [#f3364436]
スクリーン空間内の2Dメッシュを3D空間に戻す.
各メッシュ頂点に対して,以下の処理を行う.
#ref(ssm.eq33.gif,nolink,70%)
ここで,&ref(ssm.eq34.gif,nolink,70%);であり,
#ref(ssm.eq35.gif,nolink,70%)
**実装結果 [#r9652174]
パーティクルを立方体形状にランダムに発生させて,そのメッ...
#ref(ssm_dmap.jpg,,50%)
左がメッシュ生成した結果で,右がそのデプスマップを示す.
スクリーンの大きさは 640x640 であり,デプスマップのグリッ...
フィルタ幅は3,パーティクル数5000である.
デプスマップ上のメッシュを描画した図を以下に示す.
#ref(ssm.jpg,,50%)
また,生成したメッシュを異なる角度からみた結果は以下.
#ref(ssm2.jpg,,50%)
CPU実装でもデプスマップ解像度が100x100程度ならリアルタイ...
より細かくなって300x300などになってくるとCPU版だと0.15sec...
(Core i7 2.93GHz, GeForce GTX580).
**サンプルコード(GPU実装含む) [#u3982f36]
SSMを実装してみたコードを以下に置く(CUDAによるGPU実装含む...
#ref(rx_ssm.zip);
-ビルドするのに必要なライブラリ
FLTK, freeglut, GLEW, CUDA, boost
各ライブラリについては[[ライブラリのインストール]]を参照.
-簡単な説明&注意事項
--パーティクルを立方体形状にランダムに発生させて,そのメ...
終了行:
----
#contents
----
*Screen Space Mesh [#v6f6fd84]
陰関数曲面から表面を記述する三角形メッシュを抽出する場合,
Marching Cubesに代表されるように3D空間を3Dのグリッド構造...
各セルにおいてメッシュを生成するのが一般的である.
これに対して2Dスクリーン空間でメッシュを生成するのが,
Screen Space Meshes(SSM)¬e{Muller2007:M. Muller, S. Sc...
SSMはパーティクルから生成した閉じた陰関数曲面を対象として...
物体形状を三角形メッシュで表した場合,視点から見えない面(...
このような隠面消去はOpenGLなどの3D APIにおける描画では一...
SSMでは同様の考え方で,そもそも隠面は三角形ポリゴンを作る...
3D空間内のパーティクルを2Dスクリーン空間に投影して生成し...
2Dメッシュを生成,3D空間に逆投影することで視点から見える...
また,デプスマップに対して平滑化フィルタをかけることでメ...
3D Marching Cubesでは計算コストは各軸の分割数nの3乗に比例...
SSMでは2D空間でメッシュを生成するので,nの2乗に比例するだ...
ただし,視点から見えている面しかできないので,
屈折面だと1回の屈折しか考慮できないことには注意.
**入力 [#r4bdac33]
SSMはパーティクルデータを対象としているため,入力はパーテ...
-パーティクル座標 : &ref(ssm.eq1.gif,nolink,70%);
-投影変換行列 : &ref(ssm.eq2.gif,nolink,70%);
さらに,固定パラメータとして以下のものがある.
-スクリーン間隔 : &ref(ssm.eq3.gif,nolink,70%);~
スクリーン空間でのグリッド幅.
-パーティクル半径 : &ref(ssm.eq4.gif,nolink,70%);~
スクリーン空間でのパーティクル半径.
-平滑化係数 : &ref(ssm.eq5.gif,nolink,70%);~
デプスマップ平滑化のフィルタ幅と輪郭平滑化のための反復数.
-デプス閾値 : &ref(ssm.eq6.gif,nolink,70%);~
デプス値のメッシュ化閾値.この閾値以上のデプス値を持つグ...
**手順 [#c86cd97e]
デプスマップを
#ref(ssm.eq7.gif,nolink,70%)
とし,各グリッドでのデプス値を&ref(ssm.eq8.gif,nolink,70%...
グリッド分割数は,スクリーン間隔&ref(ssm.eq9.gif,nolink,7...
#ref(ssm.eq11.gif,nolink,70%)
|&ref(screen_space.jpg,nolink,100%);|
|CENTER:デプスマップ|
以下で&ref(ssm.eq12.gif,nolink,70%);を用いたスクリーンス...
**デプスマップ生成 [#r90e301a]
まず,&ref(ssm.eq8.gif,nolink,70%);を&ref(ssm.eq13.gif,no...
次にすべてのパーティクルの中心座標,半径に投影変換を施す.
まず,中心座標に投影変換行列をかける.
#ref(ssm.eq14.gif,nolink,70%)
さらに&ref(ssm.eq15.gif,nolink,70%);で割ることで[-1, 1]の...
#ref(ssm.eq16.gif,nolink,70%)
&ref(ssm.eq17.gif,nolink,70%);はメッシュ生成の基準に用い...
半径に関しても同様に,
#ref(ssm.eq18.gif,nolink,70%)
&ref(ssm.eq19.gif,nolink,70%);は投影変換行列の各要素であ...
&ref(ssm.eq20.gif,nolink,70%);はすべてのパーティクルで共...
パーティクル中心座標と半径を使ってデプス値を更新する.
#ref(ssm.eq21.gif,nolink,70%)
ここで,
#ref(ssm.eq22.gif,nolink,70%)
ただし,&ref(ssm.eq23.gif,nolink,70%);は,
#ref(ssm.eq24.gif,nolink,70%)
を満たす範囲内のセルである.ここで,&ref(ssm.eq25.gif,nol...
この処理をすべてのパーティクルで行うことでデプスマップが...
**デプスマップ平滑化 [#m666dfe4]
ユーザが設定したフィルタ幅&ref(ssm.eq26.gif,nolink,70%);...
(&ref(ssm.eq27.gif,nolink,70%);の場合,中心となるデプス値...
まず最初に&ref(ssm.eq28.gif,nolink,70%);であるすべてのデ...
次に同様にしてy軸方向にも適用する.
また,,中心デプス値との差が&ref(ssm.eq29.gif,nolink,70%)...
**輪郭ノード検出 [#h8a28cf3]
メッシュの外周となる輪郭部分に属するノードを検出する.
ここでいうノードとは輪郭をまたぐグリッドエッジ(輪郭エッジ...
ここでのグリッドとはMarching Squaresによりメッシュを生成...
デプスマップ用のグリッドとは異なる.ただし,説明を簡単に...
隣接するグリッドのデプス値を比較することで,エッジが輪郭...
単純にデプス値が有限と無限の境が輪郭とすると,
下図のような場合に本来つながっていないところがつながって...
本来赤の実線のようなメッシュを作りたいので,デプス閾値&re...
|&ref(ssm_silhouette.jpg,nolink,100%);|
|CENTER:輪郭でのメッシュ|
デプスマップ生成の際と同様に各パーティクルごとにグリッド...
パーティクル境界と交差するエッジとノード,および,ノード...
求めたエッジが輪郭エッジとなる条件は以下.
-エッジ端点のデプス値の差が&ref(ssm.eq29.gif,nolink,70%);...
デプスマップからデプス値を抽出して上記の判定を行う.
この条件を満たすとき,輪郭エッジ内に1つの輪郭ノードが存在...
さらに,
-&ref(ssm.eq30.gif,nolink,70%); エッジデプス値平均 (下図左)
-エッジにすでに輪郭ノードが格納されていた場合,&ref(ssm.e...
を満たす場合,そのノードを輪郭ノードとしてエッジに格納し...
このとき,輪郭ノードが含まれる輪郭エッジの両端点のデプス...
|&ref(ssm_silhouette_a.jpg,nolink,100%);|&ref(ssm_silhoue...
|>|CENTER:輪郭ノードの選択(2重丸が輪郭ノードとして採用す...
**メッシュ頂点生成 [#z03cb575]
輪郭ノードに加えて,内部の頂点も加えて,メッシュ頂点を算...
頂点を生成するパターンは以下の3つである.
-&ref(ssm.eq13.gif,nolink,70%);でない値を持つグリッドノー...
-両端点のデプス値が&ref(ssm.eq13.gif,nolink,70%);と&ref(s...
-両端点のデプス値が両方とも&ref(ssm.eq32.gif,nolink,70%);...
front vertexの座標,デプス値は輪郭エッジに格納された輪郭...
back vertexの座標は対応するfront vertexと同じであるが,デ...
そのため,隣接するグリッドノードのデプス値の外挿により算...
|&ref(ssm_front_and_back_vertex.jpg,nolink,100%);|
|CENTER:front vertex と back vertex|
**三角形メッシュ生成 [#n0a1203b]
下図参照.三角形間の隙間はそこに輪郭頂点があることを示す.
また,外部輪郭の場合はデプス値が&ref(ssm.eq13.gif,nolink,...
7,11,13,14のケースでは,3層に分かれており,もう一つ back ...
15のケースでは4層で,2つのback vertex を追加する必要があ...
|&ref(ssm_mesh.jpg,nolink,100%);|
|CENTER:三角形メッシュのパターン¬e{Muller2007};|
基本的にはMC法と同じくテーブルを作ってやればよいが,
いくつかの例外処理(追加のback vertexが必要な場合など)は必...
**輪郭平滑化 [#aa79d64f]
各輪郭頂点座標を,隣接頂点と自分自身の座標値の平均値で置...
輪郭の平滑化を行う.ただし,メッシュ生成におけるケース0の...
**3D空間への逆投影 [#f3364436]
スクリーン空間内の2Dメッシュを3D空間に戻す.
各メッシュ頂点に対して,以下の処理を行う.
#ref(ssm.eq33.gif,nolink,70%)
ここで,&ref(ssm.eq34.gif,nolink,70%);であり,
#ref(ssm.eq35.gif,nolink,70%)
**実装結果 [#r9652174]
パーティクルを立方体形状にランダムに発生させて,そのメッ...
#ref(ssm_dmap.jpg,,50%)
左がメッシュ生成した結果で,右がそのデプスマップを示す.
スクリーンの大きさは 640x640 であり,デプスマップのグリッ...
フィルタ幅は3,パーティクル数5000である.
デプスマップ上のメッシュを描画した図を以下に示す.
#ref(ssm.jpg,,50%)
また,生成したメッシュを異なる角度からみた結果は以下.
#ref(ssm2.jpg,,50%)
CPU実装でもデプスマップ解像度が100x100程度ならリアルタイ...
より細かくなって300x300などになってくるとCPU版だと0.15sec...
(Core i7 2.93GHz, GeForce GTX580).
**サンプルコード(GPU実装含む) [#u3982f36]
SSMを実装してみたコードを以下に置く(CUDAによるGPU実装含む...
#ref(rx_ssm.zip);
-ビルドするのに必要なライブラリ
FLTK, freeglut, GLEW, CUDA, boost
各ライブラリについては[[ライブラリのインストール]]を参照.
-簡単な説明&注意事項
--パーティクルを立方体形状にランダムに発生させて,そのメ...
ページ名: