2014年2月18日火曜日
How to make 3D printer data
Fumotrimを使って、3Dプリント用のデータを作る方法です。
Androidで制作したモデルをSTLフォーマットでエクスポートして、Windowsのnetfabbで読み込んで、データを補正しています。
2014年2月12日水曜日
Fumotrim1.7.6: 塗りつぶし機能の追加など
次回のアップデートでは、塗りつぶし機能を追加予定。これは、ペイントソフトにあるような塗りつぶし機能だけど、3Dブロックに適用しようとすると、なかなか難しいので、実装を見送ってきた。特にFumotrimのブロックは固定サイズではないので、アルゴリズムがなかなか複雑。簡単にアルゴリズムを説明すると、
1, 塗りつぶしを始めるブロックをユーザーが指定
2, ブロックの周辺6ブロックを探査して同じ大きさのブロックがあれば、色を塗る。
3, 周辺6ブロックに移動して、2-3を繰り返す。
箇条書きすると簡単そうに見えるけど、ブロック探査が難しい。Fumotrimのブロックの内部構造は、3次元グリッドのような並び方ではなく、8分木構造で、しかもブロックのサイズがばらばらなので、探査アルゴリズムは複雑な仕組みになっている。でも、このアルゴリズムはアイソメトリック図を作るときに、すでに実装していたので、今回は流用するだけで済んでよかった。
最初にコードを書いた時は、再帰処理を使っていたけど、スタックが深くなりすぎて、StackOverflowErrorが発生してしまった。そのため、再帰処理を使わない形式に書き換えた。再帰処理は、やりすぎると落ちるし、メソッド呼び出しの多発で遅くなるので、使用はほどほどに。
あとは、サイズが異なるブロックにも塗りつぶしを適応しようとしたけど、ちょっと面倒な問題があったのでやめた。同じサイズのブロックしか塗りつぶさないっていうポリシーのほうがわかりやすいし。
それから、Undoシステムにも問題があったので修正した。
さらに、レビューコメントでリクエストがあったカメラのシフト機能を実装してみたけど、これは動画で説明しないと難しいかな。3Dビューの両横の余白をタッチしてスライドすると、カメラの注視点を移動できる。英語で説明するのが難しいから動画を撮影しよう...
あと、レンダリング速度もほんの少し速くなったかも。
テストして、週末にリリースできそう。次期アップデートをお楽しみに!
2014年1月28日火曜日
地形を作ろう!
まもなく公開予定のFumotrim 1.7.4では、地形作成機能が追加されます。プリミティブ作成メニューから、下のようなランダムな地形を作成できます。
地形の解像度と平滑度を調整できます。フルバージョンでは高解像度の地形を作成できます。ランダムな地形は、Perlin Noiseを使って作成しています。
Fumotrimで作れるプリミティブ一覧はこちら。
http://fumotrim.net/fumotrim/primitive-generator
本当はここまで細かい地形を作れけど、メモリを激しく消費するので、一段階低い解像度を限度にしています。そのうち最高解像度にも対応したいな。
地形の解像度と平滑度を調整できます。フルバージョンでは高解像度の地形を作成できます。ランダムな地形は、Perlin Noiseを使って作成しています。
Fumotrimで作れるプリミティブ一覧はこちら。
http://fumotrim.net/fumotrim/primitive-generator
本当はここまで細かい地形を作れけど、メモリを激しく消費するので、一段階低い解像度を限度にしています。そのうち最高解像度にも対応したいな。
2014年1月23日木曜日
Fumotrim 1.7.2
Fumotrim 1.7.2を公開しました。
今回は、タッチ操作の改良と、アイソメトリック図のバグ修正と、パラメーター設定機能の追加がメインです。パラメーター設定機能はフルバージョンのみです。
ブロック長押しがしにくいのと、ズーム時にカメラがブレる問題があったので修正しました。これで操作が以前よりも快適になるはず!タッチ操作は、APIにあまり頼らずに、自前で実装しているので、初歩的な不具合が多かった...
アイソメトリック図は、面の前後判定にバグがあったので修正しました。さらに、前後判定アルゴリズムを見直したので、以前よりも描画が高速になりました。
Preferenceから、イメージのサイズ、アンチエイリアス、ボーダーの有無などを設定できます。
イメージのサイズは、当初10,000まで対応しようと思っていたのですが、端末の処理速度的に厳しかったので、3,000までに制限しました。
新しいアイソメトリック図の描画システムを使って、プリミティブ一覧ページも更新しました。
http://fumotrim.net/fumotrim/primitive-generator
2014年1月21日火曜日
Isometric Image その4 UI作り
Fumotrim 1.7.2に向けて、アイソメトリック図の描画オプションを作成中。ただ動く物を作るだけなら簡単だけど、使いやすいUIを1から作ろうとすると、なかなか大変だった。Androidには本当に基本的なUI部品しか無い...
数値入力と、色入力のプレファレンス部品を作成して、画面に組み込んでみた。クリックするとダイアログが出て、値を入力する仕組み。
数値入力ダイアログには、テキスト入力の他に、補助入力スライダーが付いている。矢印をタッチするとテキストボックスの数値が変更される。最小値、減算、加算、最大値に対応している。真ん中のスライダーは、ドラッグして数値を調整できる。
色選択ダイアログは、ここで紹介したダイアログを流用してみた。
UI部品は、一度作ってしまえば、再利用しやすいので、手を抜かずに頑張ろう!
ところで、画面を作っている途中で、SwitchPreferenceのバグに遭遇したのでメモしておく。
複数のSwitchPreferenceを使っている場合に、画面をスクロールすると、値がリセットされるという、とんでもないバグがあるようだ。
https://code.google.com/p/android/issues/detail?id=26194
コメント4のように、SwitchPreferenceを独自拡張して使うと解決できた。
数値入力と、色入力のプレファレンス部品を作成して、画面に組み込んでみた。クリックするとダイアログが出て、値を入力する仕組み。
数値入力ダイアログには、テキスト入力の他に、補助入力スライダーが付いている。矢印をタッチするとテキストボックスの数値が変更される。最小値、減算、加算、最大値に対応している。真ん中のスライダーは、ドラッグして数値を調整できる。
色選択ダイアログは、ここで紹介したダイアログを流用してみた。
UI部品は、一度作ってしまえば、再利用しやすいので、手を抜かずに頑張ろう!
ところで、画面を作っている途中で、SwitchPreferenceのバグに遭遇したのでメモしておく。
複数のSwitchPreferenceを使っている場合に、画面をスクロールすると、値がリセットされるという、とんでもないバグがあるようだ。
https://code.google.com/p/android/issues/detail?id=26194
コメント4のように、SwitchPreferenceを独自拡張して使うと解決できた。
2014年1月18日土曜日
戦車のモデルを公開しました
戦車のモデルを公開しました。Fumotrimから、Tools -> Fumotrim Storageを開いて、戦車のページを開くと、ロードボタンが表れるので、それを押すと、Fumotrimにロードされます。
http://storage.fumotrim.net/model/114
次期バージョン(1.7.2)の有料版では、アイソメトリック図の、解像度指定と、アンチエイリアスに対応予定です。上のような、高解像度のアイソメトリック図を出力可能です。
解像度は、幅10,000ピクセルまで対応していますが、スペックが低い端末で描画しようとすると、大変なことになる可能性があるので注意w まあ、一応検証してみようと思うけど...
アンチエイリアスの精度は、SDKまかせなので、上図のようにブロックのエッジが露出してしまいます。用途に合わせて、ご利用ください。
2014年1月14日火曜日
戦車を作ってみよう
アプリの宣伝用に、何かインパクトがあるものを作ってみようと思い、戦車を作ってみた。
モデルにした戦車は、Tigerという有名なWW2の戦車。車体が角張っていて曲面が少ないので作りやすい。ただし、転輪の部分は2重になっているので、作りにくい。
戦車の画像だけでは形状がよくわからないので、World of tanksの3Dモデルを見ながらコツコツ作成して、5時間ほどで完成。(途中、ゲームで遊んでしまうので、もっと時間かかってるけど...)
アイソメトリック図はこんなかんじ。
このモデルをSTLでエクスポートして、Google Deiveを経由して、AndroidからWindowsへデータを渡し、Blenderでレンダリングしてみた。下の画像ではマテリアルを消して描画しているが、STLでエクスポートした場合は、マテリアル情報も保持される。レンダリング設定は、ほぼデフォルトのままで、Ambient Occulusionを加えた。ブロックが結合されていないモデルは、そのままの状態では、描画負荷が高いので、モデルを全て選択した状態で、Ctrl+Jを押して、オブジェクトを結合させると良い。
それから、2種類のモデルを作って、Photoshopに貼り付けて、明るさを微調整。右側のモデルは、ブロック間のギャップを残したままレンダリングした画像で、左側はブロックを結合してレンダリングした画像。アプリ内のエクスポート設定で、ギャップの有無を選択できる。
総ブロック数は14,514個。旧型Nexus7でもサクサク描画できる。8分木ブロックは、複雑なモデルでも少ないブロック数で表現できるという利点がある。
モデルにした戦車は、Tigerという有名なWW2の戦車。車体が角張っていて曲面が少ないので作りやすい。ただし、転輪の部分は2重になっているので、作りにくい。
戦車の画像だけでは形状がよくわからないので、World of tanksの3Dモデルを見ながらコツコツ作成して、5時間ほどで完成。(途中、ゲームで遊んでしまうので、もっと時間かかってるけど...)
アイソメトリック図はこんなかんじ。
このモデルをSTLでエクスポートして、Google Deiveを経由して、AndroidからWindowsへデータを渡し、Blenderでレンダリングしてみた。下の画像ではマテリアルを消して描画しているが、STLでエクスポートした場合は、マテリアル情報も保持される。レンダリング設定は、ほぼデフォルトのままで、Ambient Occulusionを加えた。ブロックが結合されていないモデルは、そのままの状態では、描画負荷が高いので、モデルを全て選択した状態で、Ctrl+Jを押して、オブジェクトを結合させると良い。
それから、2種類のモデルを作って、Photoshopに貼り付けて、明るさを微調整。右側のモデルは、ブロック間のギャップを残したままレンダリングした画像で、左側はブロックを結合してレンダリングした画像。アプリ内のエクスポート設定で、ギャップの有無を選択できる。
総ブロック数は14,514個。旧型Nexus7でもサクサク描画できる。8分木ブロックは、複雑なモデルでも少ないブロック数で表現できるという利点がある。
2014年1月13日月曜日
Isometric Image その3
いろいろなモデルで試した結果、問題なかったので、Fumortim 1.7.1で実装予定です(フリー版にも)。画像サイズは1000x1154の固定サイズ。画像は、下のような背景が透明なPNG画像として保存されます。
イラスト作成や、ゲーム素材の作成に便利かも。
ギャスケットも表示させてみた。神秘的...
2014年1月11日土曜日
Isometric Image 続き
Zソートが不完全だったので、少し修正した。アルゴリズムは、ほぼ完成したので、もう少し調整して完成かな。操作用ボタンも付けた。ボーダーやフィルターなどの描画オプションを設定できるようにしたいけど、時間がかかりそうだから、後回しにしよう...
色と陰影を付けてみた。なかなか綺麗だ。
ロボットのブロック色をランダムにして描画してみた。そろそろ公開できるかな。
2014年1月10日金曜日
Isometric Image
Isometric画像の描画システムを作成している。OpenGLに頼らない描画システムにするので、Zソートは、自分で考えなければならない。上の画像はZソートをしていないので面の前後がぐちゃぐちゃになっている。
で、スクリーンからの距離で、Zソートすると上のようになる。うまくいっているようだ。あとはUIを作りこんで完成かな。
メンガーのスポンジも描画してみた。
登録:
投稿 (Atom)