Saqoosha

拡張現実感とアフォーダンス

Blog

うっかり AR 飲み会に参加した勢いで、書こうと思ってて書けてなかったのを書く。

・・・

「拡張現実感とアフォーダンス」ってーと、AR 技術をつかってアフォーダンスを付加するみたいな話がわりとあるんだけど、そうじゃなくって AR 的なツールとかメディアとかにアクセスさせるためのアフォーダンスとはなんぞや?っていう話。(あ、ここでいうアフォーダンスってのはいわゆる「知覚されたアフォーダンス」のほう。なんのことやねんっていう人はこっちを読むべし。)

まあ、要は、セカイカメラとかいわゆるマーカーレス AR 技術ってアフォーダンスなさすぎて、日常生活の中では誰も使おうという気にならんやん? カメラ向ければ付加情報にアクセスできるってことに気づかへんやん?(イベントとかゲームとかそれありきのんは除く。) でも、ARToolKit とか FLARToolKit で使ってるマーカーならうまくやればそういうアフォーダンスが発生するんじゃないかしら、と思っているわけです。

むかし、QR コードよりもデザイン性が優れているっていう触れ込みで(まあそれだけでもないんだけど)出てきたカラーコードっていうのがありましてね。ひっそりと消えていったんだけど、僕がこれをみて当時思ったのも↑のアフォーダンス的な話でした。QR コードならどんなものでもそれが QR コードだって簡単に認識できるのに、カラーコードはデザインの自由度があるばっかりに、わからせようとすると「カラーコードです」ってどっかに書いとかないとわからんやん?っていう。

マーカーレス AR も同じだなーと思うんだなー。「これは○○○っていうアプリで読み取ると×××が出てきます」って書くぐらいなら、もうマーカー表示しとけよ、と。「このへんで iPhone かざすといろんな情報が見れます」って書くんなら、QR コード出しとけ、と。(QR コードを AR マーカーとして使うっていう話あるけど、QR コードリーダーに ARToolKit 的なものを仕込めればそれって結構ありな気がする。)

あれー? なんかディスってるみたいになってる。(担当が違うw)いやー、まあ AR 三兄弟 (@ar3bros) もっとがんばってほしいなあっていう話ですよ。

んじゃっ。

haXe memo

BloghaXe

haXe でサイトを作ろうとしていて。Flash とは勝手が微妙に違うのでメモしていく。

・Mac では eclihx (heXe Eclipse plug-in) は Java 6 で動作する Eclipse Cocoa (64bit) じゃないと動かない。(そしてそんなに便利じゃない)
TextMate Bundle も微妙。
FlashDevelop しかなくね?
FDT 4 がまちどおしい。
・エントリポイントは haxe -main Hoge でコンパイルしたら Hoge クラスの static main() から。このとき Hoge は Sprite クラスである必要はない。
・flash.Lib クラスの current が root の MovieClip。
・trace するとステージにおかれた TextField に出力される。
・flash.Lib.trace がいつものやつ。デフォルトの trace を置き換えることもできるらしい。
・Int, Bool, Void あたま大文字。
・Number なくってかわりに Float。
・getDefinitionByName はない。かわりに Type.resolveClass。
・getDefinitionByName でとってきた Class をそのまま new できない。かわりに Type.createInstance。→ あー、flash.Lib.attach だけでクラス取得してインスタンス化までいけるのかな。引数あたえたい時は createInstance。
グラフィックは Flash IDE でてきとうなクラス名 (Hoge) つけて書きだした swf を、Application.currentDomain に Load して、同名クラスを Hoge.hx で作って上書き。。(まだよくわからん) assets.fla → assets.swf / haxe --gen-hx-classes
assets.swf / hxclasses に assets.swf に含まれるクラスの .hx 版みたいなのん(stub)ができあがるのでそれを使う。 / コンパイルするときに -swf-lib で assets.swf をくっつける。
・-swf-lib で指定できる swf は 1 個だけなので(なんで?)複数の swf ライブラリを使用したい場合は swfmill でくっつける。。→(どうやら複数の swf をいちどにコンパイルできるようになりつつあるっぽい。)
Sam HaXe。swfmill の haXe 用高機能版? hxswfml 類似品?
・SWC も haXe から呼び出すためのインターフェースを用意すれば使える。
・AS3 で SWC (SWF) つくって haXe で全部まとめるか、haXe で SWC 書きだして AS3 側で全部がちゃんこするか? (polygonal のは後者)
・あるクラスのサブクラスを作ったら、コンストラクタでは明示的に super() 呼ばないといけない。
・コンストラクタの名前はクラス名じゃなくって new。public function new() {}
・as は flash.Lib.as に static function として存在してる。キャスト String(hoge) は cast(hoge, String) かな?
・is は Std.is(hoge, SomeClass)。
・クラス名は必ず大文字アルファベットから始める。
・Flash のトップレベルの関数とかは untyped __global__["encodeURIComponent"](str) とかで呼べる。ちなみに encodeURIComponent の代わりに StringTools.urlEncode がある。
as3tohaxe で AS3 のクラス (.as) を haXe のクラス (.hx) にコンバートできる。ちょっと手直し必要だけど 1 からやるよりは楽。
・Object のフィールド削除、delete someObject["keyString"] は Reflect API を使って Reflect.deleteField(someObject, "keyString") する。その他 Object に対する操作は Reflect クラスにいろいろと?
・for (var key:String in obj) { trace(obj[key]); } → for (key Reflect.fields(obj)) { trace(Reflect.field(obj, key); }
列挙型 enum がある。しかもコンストラクタがあったりしてなんか特殊。。
・enum を switch するときは、その enum 型に含まれるすべての項目にたいして case 書かないといけない。
・protected はない。っていうか private が protected。private がない。

・・・

続く。

Categories: haXe

Comments (1)

  • Andy Li
    Glad to know you're trying haXe :)
    If you want to make a haXe version of ARToolkit, let us know. I am looking forward to contribute!

radiko オリジナルプレーヤーを作る

Blog

正月からずーっと仕事しかしてない気がするけど、たまにはこういうコード書きたい! ということで書いた。これでみんな自分オリジナルの radiko プレーヤーが作れるね!


(※あたりまえだけど公式プレーヤーで聞ける範囲の人しか聞けないよー)

package {
import com.bit101.components.HBox;
import com.bit101.components.Label;
import com.bit101.components.PushButton;
import com.bit101.components.VBox;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.NetStream;

public class radiko extends Sprite {

private static const STATION_CODE_OSAKA:Array = ['FMO', '802', 'CCL', 'OBC', 'MBS', 'ABC'];
private static const STATION_CODE_TOKYO:Array = ['TBS', 'QRR', 'LFR', 'INT', 'FMT', 'FMJ'];

private var _conn:NetConnection;
private var _stream:NetStream;

public function radiko() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

var vbox:VBox = new VBox(this, 10, 10);
var osaka:HBox = new HBox(vbox);
new Label(osaka, 0, 0, 'OSAKA');
for each (var name:String in STATION_CODE_OSAKA) {
new PushButton(osaka, 0, 0, name, _onSelectStation).width = 50;
}
var tokyo:HBox = new HBox(vbox);
new Label(tokyo, 0, 0, 'TOKYO');
for each (name in STATION_CODE_TOKYO) {
new PushButton(tokyo, 0, 0, name, _onSelectStation).width = 50;
}
}

private function _onSelectStation(event:Event):void {
if (_stream) _stream.close();
if (_conn) _conn.close();

_conn = new NetConnection();
_conn.client = {onBWDone: trace};
_conn.addEventListener(NetStatusEvent.NET_STATUS, _onNetStatus);
_conn.connect('rtmpe://radiko.smartstream.ne.jp/' + event.target.label + '/_defInst_');
}

private function _onNetStatus(event:NetStatusEvent):void {
switch (event.info.code) {
case 'NetConnection.Connect.Success':
_stream = new NetStream(_conn);
_stream.client = {onMetaData: trace};
_stream.bufferTime = 1;
_stream.play('simul-stream');
break;
}
}
}
}


SoundMixer.computeSpectrum でサウンドビジュアライズ的なものもくっつけようとしたら、セキュリティエラーでできなかった。。。まー、いつまでこのコードが動くかわかんないので、できるうちに遊んどくのが吉。あ、これ、リファラーチェックしてないんだったらそのまま Wonderfl で動くやん、、つーことで置いときました