SATCHでサーバーから画像をダウンロードして、表示するオブジェクトを変えてみる
作り方
【SATCH側】
今回は、トラッキング画像を検出して表示するオブジェクトは2Dです。
板状のポリゴンモデルに画像をマッピングします。
2Dモデル
画像は512x512のpngを使用。
複数の画像をサーバーにアップロードしておきます。
例
http://example.com/aaa.png
http://example.com/bbb.png
http://example.com/ccc.png
SATCH側でコンテンツを作成しておきます。
Computer Visionでトラッキング画像を準備し、Add > 2D Elements > Textureでデフォルトのテクスチャを準備。
この初期画像(例:aaa.png)が上書きの対象になります。
板状のポリゴンモデルに画像をマッピングするやり方は、SATCHのサンプルの「TOUCH ME」のtracking.luaが参考になります。
TOUCH ME
Luaスクリプトで使用する主要なクラスは、TextureとMaterialの2つ。
この2つの使い方は、TOUCH MEのtracking.luaを参照してください。
サーバーから画像をダウンロードするには、以下のようなコードを使います。
local url = "http://example.com/bbb.png"
local start_dl = texture:startDownload(url)
ダウンロード完了の確認には以下のコードを、repeat ..... until coroutine.yield()のループ内で使います。
local status_download = texture:getDownloadStatus()
status_downloadがTI_DLFINISHEDになれば、ダウンロード成功です。
で、以下のようなコードでリソースを再読み込みします。
local rl = texture:reload()
aaa.pngがbbb.pngで上書きされた状態になりますが、ファイル名はそのままです(これが厄介の原因にもなりますが...)。
ポリゴンに画像を再マッピングします。
material:setTexture(texture)
Java側との通信には以下のコードを使います。
local componentInterface = getComponentInterface()
Lua -->Java
componentInterface:executeAppFunc("コマンド","引数")
Java --> Lua
isCommand, command = componentInterface:pullCommand() if isCommand then if command["CommandName"] == "コマンド" then -- 引数 = command["arg0"] end end
大事なご注意
SATCHのシナリオをスマホ(Android)で使う場合、上位アプリをEclipseなどで作ります。
この場合、一般的にはシナリオはassetsに置かれます。
今回は、ファイルをダウンロードする必要がありますが、 assetsフォルダーには書き込みができません。
で、シナリオはSDカードに置いて、ここから読み込んで使うことになります。
ところが、今回のように画像の書き換えを行い、名前が同じで内容が変わった場合、そのままにしておくとアプリの再起動時に ライセンスエラーになります。
こんな感じ。
オリジナルの画像に戻しておけば問題ないのですが...。
というわけで、SATCHのシナリオ側では、初期画像のコピーを準備しておきます(例:aaa.pngのコピーをoriginal.pngという名前で置いておく)。
上位アプリでは、起動時にSDカードを見て、シナリオがなければサーバーからダウンロードし展開して読み込みます。
もしあれば、まずoriginal.pngをaaa.pngという名前で上書き(コピー)しておき、その後シナリオを読み込みます。
こうすることで、シナリオに矛盾は無くなり、ライセンスエラーも起きません。
【Java側】
基本的なコードは、SATCHのシナリオをWebサーバーからダウンロードして使う2を参照。
メニュとカメラ画面の切り替えには、ViewFlipperを使っています。
SATCHの"VIEW FLIPPER"サンプルを参照。
今回の主要コードは、ファイルのコピーです。
まず、onStartでSDカードをチェックします。
以下、シナリオ名は「Scenario_xxx」となっていますが、xxxは適当に読み替えてください。
こんな感じ。
@Override public void onStart() { super.onStart(); // Create AR Viewer Library compornent. initComponent(); postInitComponent(); initContentView(); if (_isInitializedCorrectly) { if (scenario_exist("Scenario_xxx") == true){ //original.pngをaaa.pngとしてコピーしてからロードを実行 boolean ret = copy_file(); if (ret == true) { //シナリオ読み込み } }else{ //初回起動時、サーバーからシナリオをダウンロードして読み込みます } } }
ファイルコピー用のコード
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; public boolean copy_file(){ String SDFile = android.os.Environment.getExternalStorageDirectory().getPath(); File from = new File(SDFile + "/Scenario/Scenario_xxx/original.png"); File to = new File(SDFile + "/Scenario/Scenario_xxx/aaa.png"); FileChannel srcChannel = null; FileChannel destChannel = null; try { srcChannel = new FileInputStream(from).getChannel(); destChannel = new FileOutputStream(to).getChannel(); srcChannel.transferTo(0, srcChannel.size(), destChannel); } catch (IOException e) { e.printStackTrace(); } finally { if (srcChannel != null) { try { srcChannel.close(); } catch (IOException e) { } } if (destChannel != null) { try { destChannel.close(); } catch (IOException e) { } } } return true; }
TOP
サンプル
メニュから絵を選んで、変更をかけます。
サンプルでは、同じテーマ(Ophelia)を描いた複数の画家の絵を使います。
こんな感じ。
トラッキング用の画像。
デフォルト画像です。多分もっとも有名なオフィーリアじゃないでしょうか?
メニュキーをクリック。
画家の名前をクリックして変更がかかればダイアログがでます。
(ちょっと反応が悪いかも...)
再度メニュをクリックして、カメラ画面に戻ります。
変更がかかっています。
以上
インストール
アプリをQRコードからインストールする方法はコチラを参照
TOP
トップページ| サイトマップ|