細分割曲面

http://www.quatouch.com/lab/subsrf0.pnghttp://www.quatouch.com/lab/subsrf1.pnghttp://www.quatouch.com/lab/subsrf2.png

細分割曲面を作った。
参照: 株式会社カタッチ / 研究室

細分割曲面とは、基本となる制御メッシュを段階的に細分化していくことで滑らかな曲面を表現する技術だ。上図で言うと、左の図が基本の制御メッシュ、真ん中が制御メッシュを一段階分割したもの、右が二段階分割したもの。制御メッシュを動かすと曲面も追従して滑らかに変形する。
動画: 株式会社カタッチ / 研究室

細分割曲面はCG系では頻繁に使用されているが、CADの分野ではあまり使用されていないようだ。しかし私は、CAD/CAEのようなエンジニアリング系の分野にももう少し細分割曲面が進出してもいいんじゃないか、と思っている。

CADの曲面表現

CG系はポリゴンを扱うことが多いが、CADではデータ形式が違うのである。CADでは次のようなパラメトリック形式で曲面を表現する。
\vec{x}=\vec{f}(u,v)
こう表現するメリットは、数学(幾何学)が適用できることだ。綺麗な数式で表現されているため、パラメータu,vで微分もできる。微分ができれば、垂点計算などでニュートン法なども利用できる。数学・幾何学として体系化された知を利用できるメリットは大きい。

問題点

しかし問題もある。コンピュータでは有限桁の浮動小数点実数で計算するため、必ず計算誤差を生じることだ。また、収束演算も無限に行うことは出来ないのでどこかで打ち切ることになり、これも誤差の原因となる。
たかが誤差、と馬鹿にしてはいけない。
誤差があるために、浮動小数点実数は == で比較することが出来なくなるのである。数学上は値が一致するはずでも、誤差のためにわずかにズレる可能性がある。だから次のようなコードを書くことになる。

double a, b ;
...
// if ( a == b ) { ... }  // NG。計算誤差があるため == で比較してはいけない
if ( fabs( a - b ) < ε ) { ... }  // このように微小な値εを使って判定する

この「微小な値ε」が曲者なのだ。
数学では次の推移則を前提として論理が成り立っている。

a == b, b == c ⇒ a == c

しかし、εが介在するとこの推移則が成立しなくなるのだ。

fabs( a - b ) < ε, fabs( b - c ) < ε ⇒ fabs( a - c ) < ε ・・・必ずしも成立しない!!!

この推移則の破綻は計算に矛盾を生じ、幾何計算は甚大な被害をこうむる。幾何計算に関わるすべての技術者はこの問題に頭を悩ませた経験があるはずだ。

ポリゴンもいいんじゃない?

ポリゴンはこういった誤差の問題を生じにくい。ポリゴン形式ではすべての面が平面で構成され、頂点は隣接面で完全に共有される。したがって誤差を含む座標値の比較演算があまり必要でないのだ。
もちろん問題もある。CADで要求される精度を満たそうとするとデータ量が膨大になる傾向があるのだ。しかし、コンピュータ(ハードウェア)の進歩によってこの辺りの問題は昔よりも軽減されてきている。そろそろエンジニアリング分野でもポリゴンを扱える時代が来るのではないだろうか。