2014年1月31日金曜日

OpenFLをちょっと触ってみた

OpenFLに関する記事に興味が湧いて、ちょっと触ってみた。ほんとにちょっとだけ。

http://www.openfl.org/download/

特にエラーもなく、Run a Sampleまで、あっさり進めることができた。中身はどんなコードなのかなと思って、Main.hxってファイルを開いてみると、
package;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import openfl.Assets;

class Main extends Sprite {
 public function new () {
  super ();
  
  var bitmap = new Bitmap (Assets.getBitmapData ("assets/openfl.png"));
  addChild (bitmap);
  
  bitmap.x = (stage.stageWidth - bitmap.width) / 2;
  bitmap.y = (stage.stageHeight - bitmap.height) / 2;
 }
}
昔、頑張って勉強したAction Scriptとそっくり。Action Scriptは、iOSがFlashを表示できないので、すっかり使わなくなってた。これなら、少し思い出すだけでスラスラ書けそうだ。

2014年1月30日木曜日

Toastをキャンセルする

Toastを連続で表示させると、前のToastが消えるまで、新しいToastが表示されないので、Toastの渋滞が起きる。解決するには、下のようなコードをActivityに記述すると良い。
private static Toast t;

public void toast(String message) {
 if(t != null) {
  t.cancel();
 }
 t = Toast.makeText(this, message, Toast.LENGTH_LONG);
 t.show();
}
参考元:
http://stackoverflow.com/questions/6744147/cancelling-an-already-open-toast-in-android

2014年1月28日火曜日

地形を作ろう!

まもなく公開予定のFumotrim 1.7.4では、地形作成機能が追加されます。プリミティブ作成メニューから、下のようなランダムな地形を作成できます。


地形の解像度と平滑度を調整できます。フルバージョンでは高解像度の地形を作成できます。ランダムな地形は、Perlin Noiseを使って作成しています。

Fumotrimで作れるプリミティブ一覧はこちら。
http://fumotrim.net/fumotrim/primitive-generator




本当はここまで細かい地形を作れけど、メモリを激しく消費するので、一段階低い解像度を限度にしています。そのうち最高解像度にも対応したいな。

2014年1月27日月曜日

Perlin Noise Generator

Perlin Noiseについて勉強しようと思ったので、技術検証用にアプリも作ってみました。ダウンロードは下のリンクから!

Android app on Google Play


このようなPerlin Noise画像を作成できます。作成した画像(png)の送信もできます。処理時間もわかるので、簡単なベンチマークにも使えます。


MenuのPreferenceから、画像サイズ、オクターブなどを調整できます。


Perlin Noiseに関して参考にしたサイトはこちら。

Perlin Noiseについて
http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

参考にしたコード。C#はJavaとそっくりなので簡単に移植できた。
http://devmag.org.za/2009/04/25/perlin-noise/

3D版。今回は使っていないけど、そのうち使ってみたい。
http://mrl.nyu.edu/~perlin/noise/

2014年1月24日金曜日

targetSdkVersionを19にすると、Preference画面で強制終了する

Android Manufestのandroid:targetSdkVersionを19にすると、Preference画面を開いて操作しようとすると強制終了するようになった。調べてみると、これが原因らしい。
The default result of {android.preference.PreferenceActivity#isValidFragment PreferenceActivity.isValueFragment} becomes false instead of true.
引用: http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#KITKAT

エラーメッセージをよく見るとこんな行があった。
01-24 00:35:10.461: E/AndroidRuntime(29584): Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.fb.fumotrim.ui.FTPreferenceActivity has not checked if fragment com.fb.fumotrim.ui.FTPreferenceActivity$PF_System is valid.
PreferenceActivityのサブクラスを作る時は、isValidFragment(String)をオーバーライドして、PreferenceFragmentがvalidかどうか検証すれよってことだ。
それで、どうやって書けばいいかと調べていたら、stackoverflowに書いてあった。流石stackoverflow!

http://stackoverflow.com/questions/19973034/isvalidfragment-android-api-19
protected boolean isValidFragment (String fragmentName)
{
  if(StockPreferenceFragment.class.getName().equals(fragmentName))
      return true;
  return false;

}
こんなかんじの内容にすれば良いらしい。フラグメント名をチェックするだけ。proguardを使っている場合は、クラス名の比較に失敗するようなので、proguard.cfgに以下のような例外を追加すると良い。
-keep public class com.fullpackage.MyPreferenceFragment

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を独自拡張して使うと解決できた。

2014年1月18日土曜日

戦車のモデルを公開しました


戦車のモデルを公開しました。Fumotrimから、Tools -> Fumotrim Storageを開いて、戦車のページを開くと、ロードボタンが表れるので、それを押すと、Fumotrimにロードされます。

http://storage.fumotrim.net/model/114

次期バージョン(1.7.2)の有料版では、アイソメトリック図の、解像度指定と、アンチエイリアスに対応予定です。上のような、高解像度のアイソメトリック図を出力可能です。

解像度は、幅10,000ピクセルまで対応していますが、スペックが低い端末で描画しようとすると、大変なことになる可能性があるので注意w まあ、一応検証してみようと思うけど...

アンチエイリアスの精度は、SDKまかせなので、上図のようにブロックのエッジが露出してしまいます。用途に合わせて、ご利用ください。

SuefaceViewの起動タイミング

SuefaceViewを使用する際に、SurfaceHolderのCallbackが、どのタイミングで呼ばれるのか気になったので、ちょっと実験してみた。

2014年1月17日金曜日

Androidの色選択ダイアログのデモ


Android SDKには、色を選択するダイアログが無いので、使えそうなものをネットで探していたけど、なかなか用途に合ったものが見つからなかった。というわけで去年、自分で作ってみた。一年かけて少しずつ改良したので、現在のバージョンを公開します。使用はご自由に。

RGBの値をスライダーで細かく制御可能で、モノクロにも対応しています。

http://fumobox.com/file/demo/ColorEditorDemo.zip

ソースをgithubにも置きました。こっちが最新版です。

https://github.com/fumobox/simple_color_chooser_demo

Eclipseのプロジェクトファイルになっています。Android 4.2以上推奨。

使い方は簡単。MainActivityにイベントリスナーを追加して、下のようなコードを呼び出すだけ。
ColorEditDialogFragment.show("Color", _colbox.getColor(), MainActivity.this, MainActivity.this);

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分木ブロックは、複雑なモデルでも少ないブロック数で表現できるという利点がある。


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を作りこんで完成かな。


メンガーのスポンジも描画してみた。