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" 機能)