2009年10月30日
SLらくがきボード解説
少し遅くなりましたが、SLらくがきボードの解説エントリです。LSLCon2009で、アイテムデモをやったので、そのスライドを使って解説します。
まず全体像から。

ここからは、各プロセスを見ていきます。

まず、ボードの初回起動時のみ、自分のUUIDをオブジェクトの説明欄に書き込んで、以降これをWebサーバ上でのIDとして使用します。このアイデアは、Web連携するときのオブジェクトの識別子のコメントで、ぽぴさんに教えてもらったやり方です。その後、llHTTPRequestで、このIDと、Http-in用のURLを送信してWebサーバへレコードを登録します。Http-inのURLは様々な要因で変わってしまうため、on_rezイベント、changedイベント(CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START)でURL再取得し、Webサーバのレコードを更新しています。

Web上のデータ表示ですが、ページは2つだけです。トップページでは、1度でも設置されたことがあるボードの内容が表示されます。お絵かきページでは、Flashのお絵かきツール上に現在の画像を表示して編集可能にしています。最初はペンだけの予定だったのですが、凝り出すと止まらなくなって、ずいぶん高機能になり、制作時間がふくれあがりました( ̄□  ̄ ||

投稿時には、Flash上でPNGファイルを生成します。BitmapDataクラスに画像の内容が保持されているので、それをPNGEncoderクラスのencodeメソッドに渡してあげればOKです。そして、GoogleAppEngineへアップロードするわけですが、実はGoogleAppEngineには、ファイルシステムにデータを保存できないという制限があります。そこで、DBのBLOB型のカラムにPNGデータを登録しています。ちなみにDBは1レコード1MBまでしか入らないので、詳細なPNGデータだともしかしたら登録できないこともあるかもしれません。2009/10/30現在で、最大が28KBなのでまず大丈夫だと思いますが・・・。

投稿時にSLで即時に更新を反映するため、Http-inを使って更新通知を送っています。ただ、GoogleAppEngineからは、80、443ポートへしかリクエストを投げれないという制限があるので、SLのURLには直接接続できません(今のところ、らくがきボードのHttp-in全URLで12046ポートが使用されています、これ固定なのでしょうか)。仕方ないので、一度YahooPipesを経由させることで、これを回避しています。Pipes経由でボードが無事、更新通知を受け取ると、llParcelMediaCommandListで、メディアURLを更新します。このとき画像のURLをコロコロ変えたくないので、ずっと同じURLを設定していたのですが、これだとキャッシュが効いてしまって更新されませんでした。そこで、クエリストリングにllGetUnixTimeで取得したタイムスタンプを追加して、毎回URLが異なるように修正しました。
管理工数を減らすために、GoogleAppEngineを選択したのですが、意外とハマリどころが多くて作成の方に手間がかかりましたね( ̄□  ̄ || でも、自宅サーバで運営していくよりは楽にやっていけるはずだと思ってます。あとは、無課金でどこまでいけるかですね。
お絵かきツールの方は、こつこつ機能が使えるようにしてます。とりあえず以下はできるようになりました。
アンチエイリアス、滑らか補正などはまだです。全機能完成したらまたここで連絡します( ̄∇  ̄ )
まず全体像から。

- ボードRez時の初期登録
- Webサイトのデータ表示
- Flashお絵かきツールからの画像投稿
- SLのメディアURLで表示
ここからは、各プロセスを見ていきます。

まず、ボードの初回起動時のみ、自分のUUIDをオブジェクトの説明欄に書き込んで、以降これをWebサーバ上でのIDとして使用します。このアイデアは、Web連携するときのオブジェクトの識別子のコメントで、ぽぴさんに教えてもらったやり方です。その後、llHTTPRequestで、このIDと、Http-in用のURLを送信してWebサーバへレコードを登録します。Http-inのURLは様々な要因で変わってしまうため、on_rezイベント、changedイベント(CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START)でURL再取得し、Webサーバのレコードを更新しています。

Web上のデータ表示ですが、ページは2つだけです。トップページでは、1度でも設置されたことがあるボードの内容が表示されます。お絵かきページでは、Flashのお絵かきツール上に現在の画像を表示して編集可能にしています。最初はペンだけの予定だったのですが、凝り出すと止まらなくなって、ずいぶん高機能になり、制作時間がふくれあがりました( ̄□  ̄ ||

投稿時には、Flash上でPNGファイルを生成します。BitmapDataクラスに画像の内容が保持されているので、それをPNGEncoderクラスのencodeメソッドに渡してあげればOKです。そして、GoogleAppEngineへアップロードするわけですが、実はGoogleAppEngineには、ファイルシステムにデータを保存できないという制限があります。そこで、DBのBLOB型のカラムにPNGデータを登録しています。ちなみにDBは1レコード1MBまでしか入らないので、詳細なPNGデータだともしかしたら登録できないこともあるかもしれません。2009/10/30現在で、最大が28KBなのでまず大丈夫だと思いますが・・・。

投稿時にSLで即時に更新を反映するため、Http-inを使って更新通知を送っています。ただ、GoogleAppEngineからは、80、443ポートへしかリクエストを投げれないという制限があるので、SLのURLには直接接続できません(今のところ、らくがきボードのHttp-in全URLで12046ポートが使用されています、これ固定なのでしょうか)。仕方ないので、一度YahooPipesを経由させることで、これを回避しています。Pipes経由でボードが無事、更新通知を受け取ると、llParcelMediaCommandListで、メディアURLを更新します。このとき画像のURLをコロコロ変えたくないので、ずっと同じURLを設定していたのですが、これだとキャッシュが効いてしまって更新されませんでした。そこで、クエリストリングにllGetUnixTimeで取得したタイムスタンプを追加して、毎回URLが異なるように修正しました。
管理工数を減らすために、GoogleAppEngineを選択したのですが、意外とハマリどころが多くて作成の方に手間がかかりましたね( ̄□  ̄ || でも、自宅サーバで運営していくよりは楽にやっていけるはずだと思ってます。あとは、無課金でどこまでいけるかですね。
お絵かきツールの方は、こつこつ機能が使えるようにしてます。とりあえず以下はできるようになりました。
- レイヤーの非表示・ロック
- レイヤーの透過・ブレンドモード
- スポイト
アンチエイリアス、滑らか補正などはまだです。全機能完成したらまたここで連絡します( ̄∇  ̄ )
SLらくがきボード、お絵かきツール完成!
SLラクガキボード機能追加とアイテムデモのお知らせ
LSLCon2009開始!SLらくがきボードを展示しました
ぐらぐら積み木のイベントがあります
ジェンガの仕組みなど書いてみる
ジェンガ作りました
SLラクガキボード機能追加とアイテムデモのお知らせ
LSLCon2009開始!SLらくがきボードを展示しました
ぐらぐら積み木のイベントがあります
ジェンガの仕組みなど書いてみる
ジェンガ作りました
Posted by sabro at 23:08│Comments(0)
│小物