2014年2月12日水曜日

Fumotrim1.7.6: 塗りつぶし機能の追加など


次回のアップデートでは、塗りつぶし機能を追加予定。これは、ペイントソフトにあるような塗りつぶし機能だけど、3Dブロックに適用しようとすると、なかなか難しいので、実装を見送ってきた。特にFumotrimのブロックは固定サイズではないので、アルゴリズムがなかなか複雑。簡単にアルゴリズムを説明すると、

1, 塗りつぶしを始めるブロックをユーザーが指定

2, ブロックの周辺6ブロックを探査して同じ大きさのブロックがあれば、色を塗る。

3, 周辺6ブロックに移動して、2-3を繰り返す。

箇条書きすると簡単そうに見えるけど、ブロック探査が難しい。Fumotrimのブロックの内部構造は、3次元グリッドのような並び方ではなく、8分木構造で、しかもブロックのサイズがばらばらなので、探査アルゴリズムは複雑な仕組みになっている。でも、このアルゴリズムはアイソメトリック図を作るときに、すでに実装していたので、今回は流用するだけで済んでよかった。

最初にコードを書いた時は、再帰処理を使っていたけど、スタックが深くなりすぎて、StackOverflowErrorが発生してしまった。そのため、再帰処理を使わない形式に書き換えた。再帰処理は、やりすぎると落ちるし、メソッド呼び出しの多発で遅くなるので、使用はほどほどに。

あとは、サイズが異なるブロックにも塗りつぶしを適応しようとしたけど、ちょっと面倒な問題があったのでやめた。同じサイズのブロックしか塗りつぶさないっていうポリシーのほうがわかりやすいし。

それから、Undoシステムにも問題があったので修正した。

さらに、レビューコメントでリクエストがあったカメラのシフト機能を実装してみたけど、これは動画で説明しないと難しいかな。3Dビューの両横の余白をタッチしてスライドすると、カメラの注視点を移動できる。英語で説明するのが難しいから動画を撮影しよう...

あと、レンダリング速度もほんの少し速くなったかも。

テストして、週末にリリースできそう。次期アップデートをお楽しみに!

0 件のコメント:

コメントを投稿