パーポーフルート公式ブログ
【開発】【Blender】Blender - シーンの自動生成(2)

2010/01/01
テーマ: 開発 / Blender / 2010 / すべて


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

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

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

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

方法

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

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

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

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

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

いろいろなパターンに対応するために、実際の踊り場の形はいくつかの点の凸包(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" 機能)

2010/01/01
テーマ: 開発 / Blender / 2010 / すべて