2011年7月16日土曜日

[Android] OpenGLで頂点の多いポリゴンを扱うには

How to draw many vertrics on GLSurfaceView

前回のブログobj2opengl.plをJava用に改造する では
obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES « Heiko Behrens (Blog):
http://heikobehrens.net/2009/08/27/obj2opengl/
で公開されているバナナのオブジェクトは頂点が多くてJavaでは扱えないことがわかりました。

原因は
定数プールは65536エントリー以内
コンストラクターやメソッドのソースは65536バイト以内
というJavaの仕様によるものでした。

Javaは大きいソースをビルドできないので、外部ファイルに持たせる方法をいくつか試してみましたがどれも無理でした。

1.assetsフォルダーに頂点データをテキストファイルに保存する
→AssetManagerは256行以上のテキストファイルを読み込めない(IOException例外が発生)

2.頂点データをvalues/strings.xmlに保存する
→strings.xmlは65536行以上のデータを扱えない

試行錯誤の結果、obj2opengl.plが出力したbanana.hをAndroid-NDKで使うことでバナナを表示できました
HBehrens-obj2opengl-a0f123e.zipに含まれるbanana.jpgとbanana.hをAndroidプロジェクトに取り込みます。
jniフォルダーを作ってbanana.hを保存します。
drawableフォルダーを作ってbanana.jpgを保存します。
jniフォルダーにはさらにAndroid.mkとbanan.cppを保存します。

Android.mk
banana.cpp
Activityのソースです。
Main.java(Activity) これでカレントフォルダーをプロジェクトのjniフォルダーに移動し、ndk-buildを実行します。

起動するとこうなります。
画面をドラッグすると視点が動くようにしました。
バナナとバナナの中心点がかなり離れてるようで(気のせいでした)、大きく動かすと画面から消えてしまいます。

今回は頂点の配列をAndroid-NDK、それ以外をJavaで書いたのでエミュレーターで実行するとすごく遅いです
FloatBufferの作成にすごく時間がかかります。バナナが表示されるまで2分くらいかかりました。
FloatBufferをシリアライズできればもっとスマートになるんですが。

Blenderモンキーの頂点+法線ベクトルの組み合わせもソースが大きくてJavaではビルドできませんでした。objファイルをobj2opengl.plでhファイルに変換し、バナナと同じようにAndroid-NDKでビルドしました。光源で照らしてます。こちらはテクスチャがないのでエミュレーターに表示されるまで30秒くらいでした。

Android-NDKを使うデメリットはARMプラットフォームの端末しかサポートきなくなることです。x86版Android端末にはインストールすらできなくなります。
ただし、今のところ国内のAndroid端末はほとんどがARMベース(Qualcomm、Tegraなど)なので大きなデメリットではないと思います。

以上、参考になれば幸いです。

2011年7月9日土曜日

[Blender] obj2opengl.plをJava用に改造する

Blender object to OpenGL for Android Java

3DCG作成ツール「Blender」のobjファイルをC言語のhファイルに変換するperlスクリプト「obj2opengl.pl」を使ってみました。
obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES « Heiko Behrens (Blog): http://heikobehrens.net/2009/08/27/obj2opengl/
からHBehrens-obj2opengl-a0f123e.zipをダウンロードしました。

BlenderのデータをAndroidでも使いたいのでobj2opengl.plをobjファイルをjavaファイルに変換するように改造してみました。

改造した内容は次の通りです。
・float型の数値にサフィックスfをつける
・クラス名・変数名が数字で始まる場合は先頭に「_」をつける
・unsigned intをintに変更
・クラス名・ファイル名の最初の文字が小文字なら大文字に変換する
・パッケージのステートメント追加
・FloatBuffer宣言の追加

ソースです。
obj2opengl4java.pl
obj2opengl4java.pl の使い方
obj2opengl4java.plはコマンドプロンプト(コンソール)で操作します。
変換したいオブジェクトファイルはHBehrens-obj2opengl-a0f123e.zipに含まれているcube.objとします。
obj2opengl4java.plとオブジェクトファイル(cube.obj)を同じフォルダーに保存します。
カレントフォルダーはファイルを保存したフォルダーとします。

WindowsならActivePerlなどをインストールしperl.exeのPath設定してコマンドプロンプトから
perl obj2opengl4java.pl cube.obj
と入力します。

CygwinやLinuxなら
./obj2opengl4java.pl cube.obj
と入力します。

成功するとCube.javaが作られます。
Cube.javaをAndroidプロジェクトにインポートし、パッケージ名を適切に修正してください。
Cube.java(コメント行は省略)

Activityのソースです。
Main.java

このソースを実行するとこうなります。

Blenderで作った球体を回転させるサンプルも作ったらこんな感じになりました。(ソースは省略)
※ただの円に見えますが球です。

Javaにまつわる難点
BlenderのオブジェクトファイルをJavaソースに変換する上で大きな問題があります。
Javaの仕様により定数プールは65536エントリー以内と決められています。
コンストラクターやメソッドは65536バイト以内でなければいけません。
たとえばHBehrens-obj2opengl-a0f123e.zipに含まれるbanana.objは頂点の多いのでJavaソースに変換してもビルドできません。
定数プールが65536エントリーを超えています

頂点の多いポリゴンはAndroidで扱えないのでしょうか?
答えは「いいえ」です。その方法は・・・次回に続く。(7月16日予定)


以上、参考になれば幸いです。

2011年7月2日土曜日

シャープAndroidアプリ開発テクニカルセッション (2011年夏)

SHARP Android applications developers technical session (2011 summer)
Androidアプリ開発テクニカルセッションに参加してきました。

docomo AQUOS PHONE SH-12C
au AQUOS PHONE IS11SH
au AQUOS PHONE IS12SH
SoftBank AQUOS PHONE 006SH
SoftBank AQUOS PHONE 007SH
の各機種でOpenGLとAndroid-NDKを動作したところ従来の機種と同じように動作しました。
DalvikVMのJITコンパイラのおかげでより速く動くと期待してましたが、OpenGLのFPSはLYNX3D SH-03C(Android2.1)と変わりませんでした。

Wi-Fi sync Screeniida INFOBAR A01と上記の全機種で正常に動作しました。
AirStation再起動問題が起きたらWi-Fi sync Screenをご利用ください。
持参したOpenGLとAndroid-NDKのサンプルがjp.co.sharp.android.stereo3dlcdのライブラリーを参照していたため、3D非対応のA01は少ししか試せませんでした。

全機種ともホームアプリはLYNX3Dに比べてなめらかでサクサク動いてました。指の動きをしっかり追随します。
YouTubeの3Dコンテンツも楽しいです。

以上、参考になれば幸いです。

2011年6月25日土曜日

[VOCALOID] VOCALOID2に英語の歌詞を流し込む(打ち込む)

How to fit english words to VOLCAOID2

巡音ルカを使って
This is a pen. I am a boy.
をドレミファソラシドの音階に合わせて歌わせてみます。

まずは日本語で歌わせます。深く考えずに歌いやすいように歌詞を音階にのせてみました。

(ド)ディス (レ)イズ (ミ)ア (ファ)ペン (ソ)アイ (ラ)アム (シ)ア (ド)ボーイ

日本語は1音1ノートなのでドレファソラドにはそれぞれ2音ずつ、レミシには2音ずつノートを書きます。
ノートと歌詞を入力した結果です。
実際に聞いてみると「ディス」の「ス」の発音が不自然だったので少しスペースを入れてます。いわゆる調教です。(もっと離してもいいかも)

次に英語の歌詞の入力です。
最大の問題は「英語の音節がどこで区切れるのかわからない」ということです。(わかる人もいるでしょうけど)
辞書を引けばすぐにわかりますが、手間をかけたくありません。
そこで考えたのが次の方法です。
まず、小さいノート(8分音符)をたくさん書きます。

次に、先頭のノートを選択して歌詞の流し込みをします。

歌詞が流し込まれた結果を見て、ノートを手動で調整します。余った小さいノートは消します。
「This is a pen. I am a boy.」はすべて1単語1音節でした。
実際に再生してみると「pen. I」が「ペン-ナイ」に、「am a」が「ア-マ」と発音して英語らしく聞こえます。


英語の歌詞をどう分割されるのか?
マニュアル30ページ以降に、英語の歌詞は1音節(1母音)を1ノートに入力するように書かれています。
「only」の発音は「o'unli」で母音が3つですが、実際に歌詞を流し込むと2ノートに分割されます。
VOCALOID Editorは辞書を内蔵していて、その内容に基づいて分割してくれます。

VOCALOIDの内蔵辞書にない単語は分割されません。「Floccinaucinihilipilification」という単語を流し込んでみましたが分割されませんでした。
辞書にない単語はマニュアルの音声記号一覧表を見ながら発音記号のシンボルを入力することになります。

Shuffle!VではVOCALOIDをしゃべらせてるのですが、この通り音節の区切りが難しく英語版VOCALOIDは歌詞の入力に苦労しました。
英語の音節の区切りは歌詞の流し込みによって自動分割に任せました。

ボーカロイドが音声案内するAndroidアプリを公開中です!
ストレッチを支援する Eye元気!2
カードの絵合わせゲーム Shuffle!V

以上、参考になれば幸いです。

2011年6月22日水曜日

mopitaマーケット

MtkのAndroidアプリがmopitaマーケットに掲載されました。

・slコマンド for Android
https://market.mopita.com/detail/?product_id=80000423

・Eye元気!
https://market.mopita.com/detail/?product_id=80001117

・Wi-Fi sync Screen
https://market.mopita.com/detail/?product_id=80001562

関係者の皆様にお礼申し上げます。

2011年6月18日土曜日

[Android] OpenGLでシャープ製端末用3D(立体視)アプリケーションを作る

How to create 3-dimensional Applications on OpenGL

[Android] 3Dアプリケーションの作り方 でSH Developers Squareの3D(立体視)用ライブラリーのインストールについて書きました。
このライブラリーを使って立体視可能なOpenGLアプリケーションを作ってみました。

※画像はイメージです

立体視アプリを作るためにはサイドバイサイド画像を表示します。
サイドバイサイド画像とは、左半分に左目からの視線に映る映像を、右半分に右目からの視線に映る映像を並べた画像です。左右の画像それぞれ横の解像度を半分に縮小します。
サイドバイサイド画像のサンプルです。左右とも同じCGですが少しだけ視点を変えてます。

この画像はピアプロ・キャラクター・ライセンスに基づいてクリプトン・フューチャー・メディア株式会社のキャラクター「鏡音リン」「鏡音レン」を描いたものです。

3D用ライブラリーは自動的に左右の画像を1ドットずつ交互に並べ替えて視差バリアで左目と右目にそれぞれに映像を見せる処理をしてくれます。

立体視アプリを作るに当たり、次の手順は完了しているものとします。
  1. SH Develpoers Squareにユーザー登録しライブラリーをダウンロードする
  2. ライブラリーをAndroid SDKのadd-onsフォルダーに解凍する
  3. EclipseでAndroidプロジェクトを新規作成し、Build targetの「Sharp_addon」を選択する(Build targetは2.1以上ならどれでもOK)
OpenGLでサイドバイサイド画像を表示するには、1フレームごとに画面の左半分に左目の視線の映像を描画した後、右半分に右目の視線の映像を描画します。
今回のサンプルはGoogle codeのソースを参考に立体視アプリ用にアレンジしました。キューブが回転しながら前後左右に動きます。

マニフェスト(AndroidManifest.xml)
Activity(Main.java)

res/values/string.xmlは自動生成された内容を使ってます。
レイアウト用xmlは使用しません。

画面をタップするたびに3Dと2Dが切り替わります。
画面の向きは横に固定していますが、縦向きでも立体視できます。
立体感を演出するポイントはonDrawFrameメソッドの「(1)左の描画」「(2)右の描画」のGLU.gluLookAtによる視点の位置と向きです。
左右の視差を大きくすれば立体感も増えますが、大きくしすぎると映像が乱れて見えます。
このサンプルでは視点の位置は固定ですが、視点が移動するアプリでも右の描画の時だけ視点のX座標の位置と向きを変えるだけです。
ライブラリーのおかげで簡単に立体視化できますし、既存のOpenGLアプリの立体視化も簡単にできそうです。
立体視アプリケーションの開発コストはほとんど変わらないと思います。
ただし、横方向の実質的な解像度が半分になる、描画処理が2倍に増えるなどのデメリットがあります。仕様によってはパフォーマンス向上のため、やむなくポリゴンを減らす必要があるかもしれません。
サイドバイサイド方式は、どれだけフレームレートの低い端末でもちゃんとステレオ表示できるのが強みです。

立体視アプリ実行中のスクリーンショットはこんな画像です。
ポリゴンはサイドバイサイドで表示されてますが、タスクバーが1ドットごとにシャッフルされてます。
3Dテレビやニンテンドー3DSなど立体視のコンテンツが増えているので知っていて損はない技術だと思います。

キーワード
side by side image GLSurfaceView Renderer jp.co.sharp.android.stereo3dlcd.SurfaceController LYNX3D SH-30C GALAPAGOS SoftBank 003SH 005SH AQUOS PHONE 006SH SH-12C

以上、参考になれば幸いです。

2011年6月11日土曜日

[VOCALOID] ボーカロイドのトラブルシューティング

Troubleshooting problems with VOCALOID2

Eye元気!ではVOCALOIDをしゃべらせてます。VOCALOID2を使うに当たって直面したトラブルと対処方法などを書きます。

1.「合成エンジンを開けません!」
2.DAW(デジタル・オーディオ・ワークステーション)でVOCALOID MIDIを取り込んで再生するとテンポが合わない
3.VOCALOID MIDIのトラッだけ発音が遅い
4.VOCALOIDの声が小さい
5.MACでVOCALOIDを使いたい

1.「合成エンジンを開けません!」
VOCALOID2 初音ミクをインストール

VOCALOID 2.0.12アップデータをインストール

VOCALOID2 鏡音リンレンACT2をインストール

の順でWindows7にインストールするとVOCALOID2起動時にこのエラーが発生して起動しなくなります。
今まで使えていたVOCALOID2初音ミクまで使えなくなってしまう酷いトラブルです。
解決方法はDSE2.dllを自分で削除してVOCALOID2 鏡音リンレンACT2をインストールし直すことです。
DSE2.dllは64bit-Windowsなら
C:\Program Files (x86)\VOCALOID2
32bit-Windowsなら
C:\Program Files\VOCALOID2
にあります。
リンレンACT2のVOCALOIDは 2.0.6と古いので、もう一度VOCALOID 2.0.12アップデータをインストールしようとしたら、今度はVOCALOID 2.0.12アップデータのインストールがいつまでたっても進みません
Windowsをセーフモードで起動したらVOCALOID 2.0.12アップデータのインストールができました。
Windows7のシャドーコピーや復元ポイントの機能が影響してるようです。
クリプトンのサポートページ(http://www.crypton.co.jp/mp/do/support/faq?id=360、要ログイン)にそれっぽいことが書かれてますが、DSE2.dllを削除することやセーフモードについては触れられていません。

2.DAWでVOCALOID MIDIを取り込んで再生するとテンポが合わない
VOCALOID Editorにテンポを設定せずに書き出したVOCALOID MIDIファイルを、DAWのVLOCALOID2 VSTトラックで再生するとVOCALOID2トラックが遅くなっていくことがありました。
VOCALOID Editorの1小節目にDAWのプロジェクトと同じテンポを設定してからVOCALOID MIDIに書き出せばテンポが合うようになりました。

3.VOCALOID MIDIのトラックだけ発音が遅い・タイミングがあわない
PCのスペックが低いと起こる症状みたいです。VOCALOID MIDIトラックだけタイミングをずらせばいいのですが微調整が難しいです。
対策方法は
●VOCALOID MIDIトラックをDAWの機能でオーディオトラックに変換してオーディオデータを編集してタイミングを合わせる
●VOCALOID EditorでWAVEファイルに書き出してオーディオデータを扱う
→VOCALOIDをスタンドアローンで使用するのでリアルタイムにDAWのエフェクターをかけられない
●Rewireを使う
→32bitのDAWのみ可能、しかもrewire.dllのインストールが別途必要。
●VST realtimeを使う
→VOCALOID Editorと操作方法が異なる、特に歌詞を合わせることが難しい
などがあります。どの方法もデメリットが大きいです。

4.VOCALOIDの声が小さい
DAW側で音量を持ち上げる処理をしました。
●Make up Gainの調整が可能なダイナミクス系のエフェクトを通す(Maximizer、Compresserなど)
●Waveファイルに書き出してオーディオ編集用フリーウェア「Sound Engine Free」で正規化する
など

5.MACでVOCALOIDを使いたい
VOCALOIDシリーズは今のところWindows専用です。
VOCALOID Editorから書き出したWaveファイルはMACのGarageBandなどで扱えます。
MacOSでVOCALOID Editorは使えませんが、Intel MACならWindowsとのデュアルブート構成にすれば、WindowsでVOCALOID Editorを使うことができます。
Waveファイルに書き出すだけならスペックの低いPCでも可能ですが、VOCALOID Editorを快適に編集するには2GHz以上かつ2コア以上のCPUが必要だと思います。
シングルコア 1.7GHz~2.7GHzのCPUではVOCALOID Editor再生中にノイズが入ることがありました。
VOCALOIDのためにWindowsを仮想OSとして動かしたり、安いだけのWindowsネットブックを買うくらいならIntel MACをデュアルブートで使う方が快適だと思います。


インストールからDAWとの連携まで操作が難しいVOCALOIDですが、MIDIキーボードで歌わせると楽しいです。
手間をかけてインストールした甲斐があります。
試行錯誤の結果、VOCALOID Editorを単体で使わず打ち込みを編集するときはDAWとRewireで、MIDIキーボードで歌わせるときはDAWのVOCALOID VSTで動作させてます。
VOCALOID3はEditorの機能が強化されるようなので、単体でも使いやすくなりそうです。

以上、参考になれば幸いです。