• Stanford Lucy と Asian Dragon

    大規模点群からの面張りの若干の改良。http://graphics.stanford.edu/data/3Dscanrep/からダウンロードできるデータを使用。もともと三角形や多角形のデータ形式(PLY形式)だが頂点だけを拾い集めて、その無秩序な点群から面を再構成しようというものです。しかし「ルーシー」はとても巨大なデータなので手持ちのパソコンでは全く扱えない。(というかCCTLの作りが悪いのですけど)そこで点群を間引いて再構築することにした。以前に耐久実験的(35万点)にやったことはあるが17時間という途方も無い時間を要したが今回は少しばかり高速化を計った。結果 的に全ての演算に要した時間は7時間であった。

    点群の点数は1千400万点もあってメモリと時間が持たないので点数は間引いて35万点にしてします。言って見ればスカスカの状態である。
    画像はクリックで大きく表示できます。
    ついでにアジアン・ドラゴンも試して見た。

    画像はクリックで大きく表示できます。
    よく見るとフィッティングがうまくいっていない所もあるがこのモデルもオリジナルの点群を間引いているので(と若干言い訳をしておきたい、もっとも言い訳する前に間引かずにフィッティングできないので悲しいが)

    しかし、現在すこし考えているのはCADで扱えるB-SplineとかNURBS曲面で構成できないかと考えている。こっちの方が何かと便利かも知れない。とくにパラメータライゼーションは必要ないのでテクスチャ等はそれほど苦無く行えると思う。そこでアルゴリズムだが、(実装が)簡単なものとして有力候補を挙げておくと、
    min |P[i] - S(ui, vi)|^2 を解く方法である。実装は一見簡単そうであるが問題はこの式自体である。思いつくのは最小値問題をニュートンラプソン法か何かで求めるという事になるだろが...考えただけで嫌になる。もっと安直に済ませるなら最適化手法(例えばSA法、GA法)を使えば難しい事を考えなくても確実に解を見つけられるだろうがこの方法は多分、数百点が限界だろう。(注:SA法、GA法が悪いのでは無く私の実装がショボイからでもある)
    そうなるとやはり収束計算(ニュートンラプソン法とか)を使うことになる。手順は例えば、

    (1)(ui, vi) 0 <= i < N を適当に決める
    (2)F(u, v) = | P[] - S(u, v) |^2 = P[]^2 - 2*P[] S(u,v) + S(u,v)^2 を最小化するために
         dF/du = -2*P[] Su + 2S(u,v) Su = 0
         dF/dv = -2*P[] Sv + 2S(u,v) Sv = 0
         から Sの形を決める。
    (3) Su (S(u,v) - P[] ) = 0, Sv (S(u,v) - P[] ) = 0 から 新たな (ui, vi) を生成する。=>(2)

    この繰り返しで(2)の評価が十分点群を通過したと判断できたら止める。
    と、まぁこんな具合になる。あぁ安直過ぎるぅーー、がこれしか思いつかない、というか誰だってこう考えるだろう。
    しかし、こうして作った曲面は想像を絶する形状かもしれない、なぜなら「点群を通過しなさい」というかなり緩い条件での計算だからだ。まず間違いなくそうなるだろう。これを回避するには滑らかさの指標を制約条件として組み入れないといけない。そこで幾何的な滑らかさ指標として、

    W=∫∫ |Suu|^2 + 2|Suv|^2 + |Svv|^2 du dv (これも滑らかという条件での常套手段だろう。)

    が最小となるように制約する。ん...さらに難しくなってきた。以前にも書いたが制約条件が入ると最適化問題はとたんに難しくなる。考えるのは止めよう!!こうなったらペナルティー法を使うしかない。(2)式に次のように制約項を付加してやる。

    (2)’ F(u,v) + θW(u,v)  θ->∞ を最小化する。

    と、ある程度方針は頭の中にはあるがここまで「実装して検証して」を考えるとやる気が急激に失せてしまうのだ。長期の連休が来てまだその気があったらやろうと思っている程度なわけで。

    (オマケ)
    画像はクリックで大きく表示できます。
    こちらはPLYを読み込んだだけです。
    ※これら計算結果はWCCTLによって得られたものです

2005年07月16日 20時42分37秒

inserted by FC2 system