- ベストアンサー
openGLでのグラフィクスの変形について
openGLで表示させたグラフィクスを変形させたいと考えています。 特にいま行いたいことは、「ボールのような球状のものを棒のような先の細いもので突いて凹ませる」というグラフィクスを作成したいのですが、わからなくて困っています。 制御点の考え方を利用すれば、出来るような気もしているのですが、曲面を球状にすることがわからないので行き詰まってしまいました…。 良いサンプルプログラム、またはアイディアがあれば教えていただきたいです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
■(2)+(1)の方法、つまりバブル法で点を(ほぼ)一様に配置し、ドローネー法でつなぐ方法。 球面上に仮想の泡を浮かべ、ある閾値以下の距離にある泡どうしは反発、閾値以上だと引き合うようにします。 この方法では任意の個数のポリゴンを作ることができます。 多くの場合、1つの点を5つまたは6つの3角形が共有しますが、たまに4つだったり7つだったりします。つまりメッシュに綻びが生じます。 これは球面のトポロジー的性質からくるもので、台風の発生原理と通ずるものがあります。 球面のドローネー法 1.適当な3点をとり、それで囲まれる領域を最初の3角形と考える。球面の場合、囲まれる領域が2つ考えられるので、この時点で2つの3角形が認識された。 2.点を順次追加していく。 2-1.追加された点(Dとおく)は、どの3角形の内側にあるか調べる。 2-2.点Dが含まれる3角形がみつかったら、それを3角形ABCとおく。 2-3.3角形ABCを点Dで3分割する。つまり、3角形ABD、BCD、CADができる。 2-4.3角形ABCに対し、 1)辺ABをはさんで隣接する3角形ABC' 2)辺BCをはさんで隣接する3角形A'BC 3)辺CAをはさんで隣接する3角形AB'C を考える。 2-5. 1)辺ABを対角線の一つとする台形ADBC'を考え、もしもう片方の対角線DC'の方が短ければ、長い方を消して短い方につなぎ替える。 2)、3)BDCA'、CDAB'についても同じことをする。 2-6.2へ戻る。 ■精度の高い球面分割ができる(3)は、球面自己組織化マップ(Spherical SOM)と呼ばれています。 この方法で得られるメッシュは1点を5つまたは6つの3角形が共有し(つまりサッカーボール)、最適かつ均一な配置となります。 ただし、点の数が2+10(4^N)で表現できる自然数でなくてはいけません。具体的には、 N=1のとき12個 N=2のとき42個 N=3のとき162個 N=4のとき642個 N=5のとき2562個 N=6のとき10242個 となります。 疲れたのでとりあえずここまで
その他の回答 (2)
- saitoha
- ベストアンサー率81% (9/11)
すみません。補足ですが(2)単独では分割までできないですね(^^; 卑怯なやりかたですが(2)を用いて (ほぼ)一様に分布した点に対して、 距離が一定以上かつ一定以下のものどうしをつないでいく方法があります。 もちろんそれでは3角形じゃないポリゴンが所々できてしまうので、手動で点を追加したりします。
補足
>閉曲面の有限要素近似で、実際にシミュレーションするということでいいでしょうか。 はい! >点の数はどのくらいで、精度はどのくらい必要でしょうか? 精度は出来るだけ正確なものが良いです。 しかし処理時間が遅くなりすぎると少し困ります。 多少は遅くなってもかまいませんが、出来る限りリアルタイムで応答し、その中でより正確なものが良いです。 点の数もリアルタイム性を実現できる範囲であれば、より多い方が正確な描画が出来て良いと思うのですが・・・。 是非、ご教授願いたいです。よろしくお願いいたします。
- saitoha
- ベストアンサー率81% (9/11)
閉曲面の有限要素近似で、実際にシミュレーションするということでいいでしょうか。 点の数はどのくらいで、精度はどのくらい必要でしょうか? 球面の等分割は非常に奥が深く、様々な手法が考案されています。なかでも有力なのは、 (1)球面ドローネー法(ドローネー分割の球面版) (2)バブルメッシュ法(点どうしに斥力と引力を働かせる) (3)正20面体から発展させていく方法(精度が高い) その他らせんを利用した方法等、いろいろありますがそれぞれ利点と欠点があります。 手っ取り早く何も考えなくていいのが(2)ですが、精度はいまいちです。
補足
大変丁寧にご説明いただきありがとうございます。 とても興味深く、参考になります。 特に球面自己組織化マップで球面分割できればきれいなメッシュが得られ、正確な変形が出来そうです。 しかし、サッカーボール(を更に三角形に分割したポリゴン)のようなメッシュをかけるにはどうすれば良いか分かりません。 というより、頂点の座標の決定法すら思い浮かびません。 もし、ご存じなら時間があるときでよいので、補足お願いします。 URLでも構いません。 何度も申し訳ございません。