2010/01/01

Blender - シーンの自動生成(2)

あけましておめでとうございますトラ。

道路同士をシームレスに繋げる

Blender - シーンの自動生成の TODO のうち、道路同士をシームレスに繋げるというのをやりました。(今回は実家のウィンドウズマシンで作業しました。)

20090101_seamless_road

最終版ではないかもしれませんが、こんな感じのメッシュが出来ていればさしあたってOKかな、というところです。


方法

これは意外と面倒で、単に道路の長さを調整するのではなく、踊り場を新たに作らないとうまくいきません。以下、図で説明します。Blender で作れよという感じですが。

(1) とりあえず線を太くして道路ポリゴンにしたもの。

20090101_seamless_road_fig0

(2) こんな風にすれば、シームレスに繋がりそうですが...

20090101_seamless_road_fig1

(3) 坂がある場合、上から見るとシームレスですが、坂の傾きがあるのでひび割れができてしまいます。これを無理やり合わせると、坂がねじれてしまって良くないです。

20090101_seamless_road_fig2

(4) こんな感じで踊り場を作ると、よい具合になります。坂の傾きは、踊り場の分、若干きつめになります。

20090101_seamless_road_fig3

いろいろなパターンに対応するために、実際の踊り場の形はいくつかの点の凸包(Convex hull)にしています。

点集合から Convex hull を求める洗練された python ルーチンはウェブにいくつもありますが、ちょっと(簡潔に)書いてみたかったのでこれもオレオレ版を書きました。これについては後ほど記事を書くかもしれません。


擬似コード


各頂点 A について
それにつながる各頂点 B について
A を道路の幅分ずらした点 FL, FR を計算
FL, FR をそれぞれちょっと B 側にずらした点 BL, BR を計算
A から出ている辺の数が 2 以上なら
点 FL, FR, BL, BR の集合の convex hull を計算
上記からなるポリゴンをつくる(三角形をいくつかつくる)
各辺について
2 つの頂点それぞれの BL, BR 点を元に四角形ポリゴンをつくる
重複する点を削除(Blender の "Remove doubles" 機能)