<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.alumican.net &#187; ActionScript3.0</title>
	<atom:link href="http://blog.alumican.net/tag/actionscript30/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.alumican.net</link>
	<description>日々の記憶と記録とActionScript とその周辺</description>
	<lastBuildDate>Thu, 19 Jan 2012 05:51:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Autodesk 123D Catch がすごい</title>
		<link>http://blog.alumican.net/2011/12/16_174845</link>
		<comments>http://blog.alumican.net/2011/12/16_174845#comments</comments>
		<pubDate>Fri, 16 Dec 2011 08:48:45 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[ActionScript3.0]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=2156</guid>
		<description><![CDATA[
対象物が写った複数の画像をアップロードすると、サーバサイドで対象物を三次元復元し、3Dモデルデータをダウンロードできるアプリ『Autodesk 123D Catch』がすごいわけです。とりあえず、出力されたfbxファイ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.alumican.net/wp-content/uploads/2011/12/bouze3d.jpg" alt="" width="478" height="200"/></p>
<p>対象物が写った複数の画像をアップロードすると、サーバサイドで対象物を三次元復元し、3Dモデルデータをダウンロードできるアプリ『<a href="http://www.123dapp.com/catch">Autodesk 123D Catch</a>』がすごいわけです。とりあえず、出力されたfbxファイルの頂点データをFlashでパースして某PV風なサウンドビジュアライズを速攻で作ってみました。</p>
<p>» <a href="http://wonderfl.net/c/mb1a">Vertices From Autodesk 123D Catch</a></p>
<p><span id="more-2156"></span></p>
<p>fbxのパースにはSaqooshaの『<a href="http://saqoo.sh/a/2343">FBX Parser for AS3</a>』が使えるかなあと思ったんですが、fbxは方言が激しいらしくうまくパースできなかったので強引にやりました。今、膨大な頂点をまびきながらテクスチャをマッピングする作業が思ったよりもめんどうで苦戦中。</p>
<p>3Dモデルのモデルには<a href="https://twitter.com/#!/bouze">@bouze</a>が協力してくれました。アプリには完成したモデルデータをYouTubeにアップするボタン（いるのかこれ）も付いていたのでやってみました。</p>
<p>» <a href="http://youtu.be/HoPcY8ZlbB8?hd=1">Bouze3D</a></p>
<p>以下メモ。</p>
<p>僕も学生時代に<a href="http://ci.nii.ac.jp/naid/110007688210">似たような研究</a>をやってました。こういう技術はたくさんの基礎技術の組み合わせでできていて、例えば</p>
<ol>
<li>入力画像から特徴点を抽出する。</li>
<li>複数の画像にまたがって現れる特徴点のパターンを検出し、画像同士の相対的な位置関係を明らかにする（カメラの座標と角度の推定）。</li>
<li>各カメラの位置、画像を元に、対象物の表面（メッシュ）を推定する。テクスチャもこのとき多数決法などで復元したりすることもある。</li>
<li>誤差や不十分な入力によってで生じるメッシュの穴を補完する。</li>
</ol>
<p>数学的予測に基づく面の補完（4）を、再び実際の画像に照らし合わせて答え合わせをする（3）という作業を繰り返すことで精度の良い復元になっていったりします。</p>
<p>まだ確認していないのですが、クラウド上にアップされているみんなの写真を使ってモデリングをおこなうこともできるらしく、これが本当だとすれば、各々が持ち寄った写真から一つの街をモデリングすることもできるかもしれないという。</p>
<p>ちなみに、複数の写真から得られる情報を重ね合わせることで元の写真よりも解像度をあげる<a href="http://ja.wikipedia.org/wiki/%E8%B6%85%E8%A7%A3%E5%83%8F%E6%8A%80%E8%A1%93">超解像</a>という技術があるのですが、この技術も組み合わせれば「自分が復元した3Dモデルが、いつの間にか他の人の写真によってより精細になっていた」ということが実現されるかも知れません。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2011/12/16_174845/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AIRKinect Extension （AIR + ANE + Kinect）を動かす</title>
		<link>http://blog.alumican.net/2011/11/16_031622</link>
		<comments>http://blog.alumican.net/2011/11/16_031622#comments</comments>
		<pubDate>Tue, 15 Nov 2011 18:16:22 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[ANE]]></category>
		<category><![CDATA[Kinect]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=2105</guid>
		<description><![CDATA[
AIRKinectを使えば、ActionScript Native Extensions（通称ANE）を経由して、AIRアプリからMicrosoftのKinectドライバを簡単に叩けるらしい。
ということでやってみた。 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.alumican.net/wp-content/uploads/2011/11/Kinect0.jpg" alt="" width="478" height="200"/></p>
<p><a href="http://www.as3nui.com/">AIRKinect</a>を使えば、<a href="http://cuaoar.jp/2011/09/adobe-air-actionscript-n.html">ActionScript Native Extensions</a>（通称ANE）を経由して、AIRアプリからMicrosoftのKinectドライバを簡単に叩けるらしい。</p>
<p>ということでやってみた。</p>
<p><span id="more-2105"></span></p>
<ol>
<li><a href="http://kinectforwindows.org/">Microsoft Kinect SDK beta2</a>をインストールする。<br />
これまでOpenNIを使ってた人はドライバが競合するので注意。<a href="http://d.hatena.ne.jp/kaorun55/20110627/1309193339">解決方法</a>もあるみたいだけど、めんどうだったのでOpenNIをアンインストールした。</li>
<li><a href="http://www.as3nui.com/air-kinect/">ここ</a>のDemo Applicationからデモアプリをダウンロードしてインストールする。</li>
<li>Kinectを接続してサンプルAIRアプリを起動する。うまく動かない人は、Microsoft Kinect SDKのインストールフォルダに入ってるサンプルを一度起動から、もう一度AIRアプリを試してみるとうまくいくかも。</li>
</ol>
<p>するとこうなる。</p>
<p><a rel="shadowbox;" href="http://blog.alumican.net/wp-content/uploads/2011/11/Kinect1.jpg"><img src="http://blog.alumican.net/wp-content/uploads/2011/11/Kinect1.jpg" alt="" width="478" height="266"/></a></p>
<p>では次に、自分でAIRアプリをパブリッシュしてみる。基本的にはライブラリ作者の<a href="http://vimeo.com/32021413">チュートリアルビデオ</a>が30分かけて丁寧に全部教えてくれる。英語で。</p>
<ol>
<li>ANEを使ったアプリの制作環境を<a href="http://akabana.info/2011/08/11/air-native-extension-series/">ここらへん</a>を参考にしながら整える。
<p>ちなみにチュートリアルビデオでは現時点ではリリースされていないFlash Builder 4.6を使ってる。Flash Builderでやりたい人はプレリリースプログラムに<a href="https://prerelease.adobe.com/callout/default.html?callid=DC919522A42544798C33ECB4041FC5DC">参加</a>しよう。もう終わってるかも知れないけど。</p>
</li>
<li><a href="http://www.as3nui.com/air-kinect/">ここ</a>のDownload AIRKinectExtensionから.aneファイルをダウンロードする。</li>
<li><a href="http://www.as3nui.com/airkinect-basics-01/">ここ</a>からFlash Builder用のプロジェクトをダウンロードする。</li>
<li>AIRKinectExtension.aneにパスを通して、プロジェクトに入ってるBasicKinect01.asをパブリッシュする。FlashBuilder4.6でのパスの通し方は、<a href="http://vimeo.com/32021413">チュートリアルビデオ</a>の3:30あたりから。英語がわからなくても気合いでなんとかなると思う。
</li>
</ol>
<p>自分の場合は、「com.as3nui.nativeExtensions.kinect.data.AIRKinectFlags（色んな定数を定義しているクラス）が無いよ」というコンパイルエラーが出た。よく分からないので、<a href="http://as3nui.com/extension/v1/docs/">ASDoc</a>を見ながら、該当箇所を値に置き換えるとうまくいった。色々試してみると、どうも com.as3nui.nativeExtensions.kinect.data パッケージには、他にもいくつか抜け落ちているクラスがあるみたい。</p>
<p>BasicKinect01.asを改造してDepthをとってみた。</p>
<p><a rel="shadowbox;" href="http://blog.alumican.net/wp-content/uploads/2011/11/Kinect2.jpg"><img src="http://blog.alumican.net/wp-content/uploads/2011/11/Kinect2.jpg" alt="" width="478" height="374" /></a></p>
<p>AIRKinect.initialize()で「Depth画像を使うよ」っていうフラグを渡し忘れていて、えらくハマった。</p>
<p>» <a href="http://blog.alumican.net/wp-content/uploads/2011/11/BasicKinect01.as">ソースコード</a></p>
<p>まあとりあえずこんなとこ。実行速度は実用に耐えられるレベル。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2011/11/16_031622/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第一回東京ひよこの会に参加してきました</title>
		<link>http://blog.alumican.net/2011/03/07_013518</link>
		<comments>http://blog.alumican.net/2011/03/07_013518#comments</comments>
		<pubDate>Sun, 06 Mar 2011 16:35:18 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=2056</guid>
		<description><![CDATA[久しぶりのブログ更新です。生きてます。
「東京ひよこの会」なる勉強会に参加してきまして、そのとき発表したデモをアップしました。

　
SpriteやMovieClipのhitAreaというプロパティ自体は前々から知ってい [...]]]></description>
			<content:encoded><![CDATA[<p>久しぶりのブログ更新です。生きてます。</p>
<p>「<a href="http://www.project-nya.jp/modules/weblog/details.php?blog_id=1350">東京ひよこの会</a>」なる勉強会に参加してきまして、そのとき発表したデモをアップしました。</p>
<p><script type="text/javascript" src="http://wonderfl.net/blogparts/lN4J/js"></script><br />
　</p>
<p>SpriteやMovieClipのhitAreaというプロパティ自体は前々から知っていたのですが、うまく扱えないためこれまで避けていました。</p>
<p>Spriteを親SpriteのhitAreaとして設定した場合、hitAreaの兄弟Spriteにもボタンが反応してしまっていたのですが（デモ起動直後のbtn4の状態）、このたび会場にいらしていた<a href="http://fumiononaka.com/">野中先生</a>のおかげでこの問題を無事解決することができました。</p>
<p>ボタン自体のmouseChildrenをfalseにするだけでした。hitAreaに設定されたSpriteはマウスイベントに関する扱いが少し特殊で、mouseEnabledやmouseChildrenをfalseに設定しても、hitAreaとして設定されているSpriteやMovieClipのヒット領域としての仕事は全うできるようです。言葉での説明が難しいのでデモを見てもらえば分かると思います。</p>
<p>こんな感じで皆それぞれが「今できること + 本当はこんな風にしたい」を持ちより共有してみんなで考える、というスタイルは有意義で、新しい発見もありとても為になりました。自分にとって「<a href="http://teraco.jp/">てらこ</a>」がエッジな技能を披露する場であるのに対して、ひよこは理解度とスキルのベースアップの場という棲み分けなのかなぁ、という感触です。</p>
<p>皆さんもどんどん参加すればいいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2011/03/07_013518/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flash + OpenCV</title>
		<link>http://blog.alumican.net/2010/08/10_040647</link>
		<comments>http://blog.alumican.net/2010/08/10_040647#comments</comments>
		<pubDate>Mon, 09 Aug 2010 19:06:47 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[AIR2.0]]></category>
		<category><![CDATA[OpenCV]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1846</guid>
		<description><![CDATA[
AIR2.0の新機能でOpenCVと連携してみました。AIRアプリを起動してTwitterID入力 → Webカメラを選択すると、カメラ映像から顔領域を検出してアイコンが顔を隠します。TwitterIDを空欄にすると笑 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.alumican.net/wp-content/uploads/2010/08/opencv_title.png" alt="" width="478" height="200" /></p>
<p>AIR2.0の新機能でOpenCVと連携してみました。AIRアプリを起動してTwitterID入力 → Webカメラを選択すると、カメラ映像から顔領域を検出してアイコンが顔を隠します。TwitterIDを空欄にすると笑い男が出現します。俺の目を盗みやがったなという具合に。</p>
<p>» <a href="http://blog.alumican.net/wp-content/uploads/2010/08/OpenCVFaceDetection.exe">OpenCVFaceDetection</a><br />
» <a href="http://blog.alumican.net/wp-content/uploads/2010/08/opencv_face_detection.zip">ソース一式</a></p>
<p>・Iキー　･･･ アイコンの表示/非表示を切り替えます。<br />
・Rキー　･･･ 検出された全顔領域の表示/非表示を切り替えます。<br />
<span id="more-1846"></span></p>
<p>実行にはWindows環境であることと、OpenCV 2.1が必要です。また、ネイティブアプリケーション側とAIR側から同じWebカメラに同時にアクセスするので、複数アプケーションからのWebカメラへの同時アクセスをサポートする環境が必要です。<br />
» <a href="http://opencv.jp/download">OpenCV</a><br />
» <a href="http://blog.alumican.net/2010/08/07_025611">ひとつのWebカメラを複数のアプリケーションから同時に使う</a></p>
<p>ビルドにはさらにDirectX SDK、<del datetime="2010-08-11T12:28:24+00:00">Platform SDK</del>（Windows SDKに統合されたっぽい）が必要です。もしこれらのライブラリだけでは足りなかったよーという場合は教えてもらえるとうれしいです。<br />
» <del datetime="2010-08-11T04:39:19+00:00"><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&#038;displaylang=en">Platform SDK</a></del> → <a href="http://msdn.microsoft.com/ja-jp/windows/bb980924.aspx">Windows SDK</a><br />
» <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&#038;FamilyID=3021d52b-514e-41d3-ad02-438a3ba730ba">DirectX SDK</a></p>
<p><strong>やりたかったこと</strong><br />
AIR2.0から、ネイティブアプリケーション（exeやappなど）と標準入力・標準出力を介して通信できるようになったので、裏方を全部ネイティブアプリケーションにやらせて結果だけFlashで描画するという試みです。要は一から画像処理系をASで組んでやるよりも、高速に動作するネイティブ言語に元々実装されている資産を使った方が効率いいじゃんっていうことです。今回はC++でOpenCVを使って顔検出するネイティブアプリケーションを実装し、その結果をFlashでリアルタイムに描画するプログラムを組んでみました。</p>
<p><strong>AIRの起動から終了までの流れ</strong></p>
<ol>
<li>ユーザがAIRを起動する</li>
<li>AIRがネイティブアプリケーションを起動する</li>
<li>ネイティブアプリケーションが毎フレーム顔検出をして、結果をFlashに送る</li>
<li>AIRが検出結果に基づいて描画をおこなう（3に戻る）</li>
<li>ユーザがAIRを終了すると、AIRがネイティブアプリケーションを終了する</li>
</ol>
<p>こんな感じです。ネイティブアプリケーションは基本的に表に出しません。エンジン部分はネイティブアプリケーション、表示部分はAIRという風に完全に切り分けることにします。</p>
<p><strong>AIRとネイティブアプリケーションの通信</strong><br />
以下の形式の文字列で通信することにしました。間に改行は挟むことができず、最後は必ず改行で終了する必要があります（改行はデータの終端を意味します）。</p>
<pre><code>顔1のx座標,顔1のy座標,顔1の幅,顔1の高さ;顔2のx座標,顔2のy座標,顔2の幅,顔2の高さ;顔3の・・・\n</code></pre>
<p>このルールに沿った文字列をネイティブアプリケーションから標準出力し、AIR側の標準入力で受け取りパースします。</p>
<p>ちなみに似たような内容を先日のSparkProject勉強会で発表してきました。AIRからのネイティブアプリケーション起動、通信部分、終了に関するそれぞれのコードは発表資料に書いてあります。発表時にはWebCam Splitterのようなソフトウェアの存在を知らなかったために、AIRの透過ウィンドウをネイティブアプリケーションの上に重ねる方式になっています。<br />
» <a href="http://blog.alumican.net/wp-content/uploads/2010/08/Presentation_spark3.pdf">SparkProject勉強会 発表資料</a></p>
<p>OpenCVでの顔検出にはcvHaarDetectObjects関数を用いました。画像から顔検出をする流れは以下のサイトがわかりやすかったです。各種SDKのインストールについても詳細に書いてあるので環境構築の参考にもなります。<br />
» <a href="http://ameblo.jp/fujimonia/entry-10240952353.html">OpenCVを使って顔認識プログラムを作ってみた</a></p>
<p>今回のサンプルを作るにあたり、笑い男マークとTwitterアイコンを取得するAPIを以下のサイトからお借りしました。<br />
» <a href="http://antina.vigorosso.net/blog/index.php?e=2072">antina工作室</a><br />
» <a href="http://tweetimag.es/">tweetimag.es</a></p>
<p><strong>感想</strong><br />
ネイティブアプリケーションとAIRの通信は思った以上に簡単でした。かつネイティブアプリケーションの強力なパワーを実感できて満足です。配布時にはネイティブアプリケーション自身やdllを、AIRのインストーラに含めることができるので、ユーザが実行環境を用意する手間もかなり省くことができます（今回はファイルサイズが大きくなるのでdllは含んでいません）。</p>
<p>OpenGLやDirectXで描画までおこなうものに比べれば非力ですが、うまく使えばFlashのメリットである描画やインターフェース構築の簡単さ、ネイティブアプリケーションのメリットである高速演算、それぞれをうまく引き出すことができると思います。</p>
<p><strong>追記 10.08.10</strong><br />
デフォルトで使うOpenCVのバージョンを2.1に変更しました。OpenCV 1.0を使う場合は以下の記事の追記部分を参考にソースコードの一部およびパスを書き換えてください。<br />
» <a href="http://blog.alumican.net/2010/08/06_152939">C++とOpenCVでWebカメラを簡単に扱う</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2010/08/10_040647/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>マウスイベント発生中に親を変更した場合の挙動</title>
		<link>http://blog.alumican.net/2010/07/21_011724</link>
		<comments>http://blog.alumican.net/2010/07/21_011724#comments</comments>
		<pubDate>Tue, 20 Jul 2010 16:17:24 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1839</guid>
		<description><![CDATA[想定外の挙動だったのでメモ。
MouseEvent.MOUSE_DOWNの発生後にマウスを押したまま対象インスタンスの親インスタンスを変更した場合、つまり別のDisplayObjectContainerにaddChild [...]]]></description>
			<content:encoded><![CDATA[<p>想定外の挙動だったのでメモ。</p>
<p>MouseEvent.MOUSE_DOWNの発生後にマウスを押したまま対象インスタンスの親インスタンスを変更した場合、つまり別のDisplayObjectContainerにaddChildし直した場合の挙動。</p>
<p>予想では、マウスダウン中に別の親にaddChildしてしまうとマウスを離してもMouseEvent.MOUSE_UPは発生しないと思っていたのだけど、普通にイベントが発生した。これを利用すると、たくさんのアイテムの中からドラッグ中のものを一時的に最前面に表示するなどの処理が実装しやすくなる。</p>
<pre><code>//親コンテナ parentA, parentB を作る
var parentA:Sprite = addChild( new Sprite() ) as Sprite;
var parentB:Sprite = addChild( new Sprite() ) as Sprite;

//子オブジェクト child を作り、parentA に配置しておく
var child:Sprite = parentA.addChild( new Sprite() );
child.graphics.beginFill(0x0);
child.graphics.drawCircle(0, 0, 50);
child.graphics.endFill();
child.x = 100;
child.y = 100;

//子オブジェクトに対してイベントを登録する
child.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void {
  trace("down");
  //マウスダウンで parentB の子として addChild し直す
  parentB.addChild(child);
});

child.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent):void {
  //マウスを離すと、マウスダウン時と親が違っていてもちゃんと実行される
  trace("up");
});</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2010/07/21_011724/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>トップページ更新 Cells</title>
		<link>http://blog.alumican.net/2010/07/12_201337</link>
		<comments>http://blog.alumican.net/2010/07/12_201337#comments</comments>
		<pubDate>Mon, 12 Jul 2010 11:13:37 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1807</guid>
		<description><![CDATA[
トップページにコンテンツを追加しました。
» Cells
今回はボロノイ図とパーティクル操作を組み合わせたものとなっています。ボロノイ図のアルゴリズムには高速なFortuneのアルゴリズムを用いています。Fortune [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://alumican.net/#/c/cells"><img src="http://blog.alumican.net/wp-content/uploads/2010/07/cells.jpg" alt="" title="cells" width="478" height="200"/></a></p>
<p>トップページにコンテンツを追加しました。<br />
» <a href="http://alumican.net/#/c/cells">Cells</a></p>
<p>今回はボロノイ図とパーティクル操作を組み合わせたものとなっています。ボロノイ図のアルゴリズムには高速な<a href="http://en.wikipedia.org/wiki/Fortune">Fortuneのアルゴリズム</a>を用いています。Fortuneのアルゴリズムは空間を上から下に走査していきながら、各々のボロノイ母点が作り出す放物線（beach line）同士が交わる点列をボロノイ境界とみなします。</p>
<p>» <a href="http://research.engineering.wustl.edu/~pless/546/lectures/l16.html">アルゴリズム解説</a><br />
» <a href="http://www.cs.hmc.edu/~mbrubeck/voronoi.html">C++版 by Matt Brubeck</a><br />
» <a href="http://blog.controul.com/2009/05/speedy-voronoi-diagrams-in-as3flash/">AS3版 by Controul</a></p>
<p>wonderflに投稿されているkndさんの『<a href="http://wonderfl.net/c/t0iX">Fortuneのアルゴリズムの可視化</a>』が直感的で分かりやすいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2010/07/12_201337/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PixelBender (.pbj) をActionScriptに埋め込む</title>
		<link>http://blog.alumican.net/2010/07/12_165011</link>
		<comments>http://blog.alumican.net/2010/07/12_165011#comments</comments>
		<pubDate>Mon, 12 Jul 2010 07:50:11 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[wonderfl]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1775</guid>
		<description><![CDATA[まじめにPixelBenderやろうかなと思いつつ、いちいちpbjファイルをロードするのも面倒くさいなと思ったので、ちょっと便利そうなツールを作ってみました。

pbjファイルをローカルからアップロードすると、Pixel [...]]]></description>
			<content:encoded><![CDATA[<p>まじめにPixelBenderやろうかなと思いつつ、いちいちpbjファイルをロードするのも面倒くさいなと思ったので、ちょっと便利そうなツールを作ってみました。</p>
<div style="text-align:center;width:100%;margin-bottom:15px;"><iframe title="Embedded PixelBender Generator - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/gD6k" width="465" height="490" style="border:0px black solid;"></iframe></div>
<p>pbjファイルをローカルからアップロードすると、PixelBenderのコードを内部に埋め込んだActionScriptのクラスを生成します。pbjファイルがパラメータを含む場合は、各パラメータに対して自動的にgetter/setterも用意します。インプットに対しても自動でgetter/setterを生成します。</p>
<p>このツールの利点としては</p>
<ul>
<li>コンパイル時にPixelBenderのコードを含めることができるので、pbjファイルを外部読み込みする必要が無くなる</li>
<li>pbjファイルにどのようなパラメータやインプットを設定すればいいのか分かる</li>
</ul>
<p>といったことがあります。wonderflに投稿する際にメインのコードとPixelBenderをひとつのファイルにまとめたり、パラメータやインプットの指定ミスを減らせることができるかと思います。<br />
<span id="more-1775"></span><br />
エンコード/デコード処理はこのようになっています。</p>
<pre><code>//pbjファイル → 埋め込みコード
function encode(bytes:ByteArray):Array {
    var code:Array = new Array();
    bytes.position = 0;
    while (bytes.bytesAvailable) {
        code.push(bytes.readByte());
    }
    return code;
}

encode(loader.data);</code></pre>
<pre><code>//埋め込みコード → Shaderインスタンス
function decode(code:Array):ByteArray {
    var bytes:ByteArray = new ByteArray();
    for (var i:uint = 0, l:uint = code.length; i < l; ++i) {
        bytes.writeByte(code[i]);
    }
    return bytes;
}

var shader:Shader = new Shader( decode(code) );</code></code></pre>
<p><strong>おまけ</strong><br />
結局使わなかったのですが、このツールを作るにあたりpbjファイルをディスアセンブルするクラスをC++からASに移植しました。<br />
» <a href="http://www.kaourantin.net/2008/09/pixel-bender-pbj-files.html">Pixel Bender .pbj files （C++版のディスアセンブラ）</a></p>
<p>当初はpbjファイルをディスアセンブルしてパラメータのgetter/setterを自動生成ｓていたのですが、Shaderインスタンスのdataプロパティを列挙すれば必要な情報を取得できることに、移植完了後に気づきました。なのでディスアセンブラはお蔵入りとなってしまったのですが、せっかくなので置いておきます。使い方はクラスファイルの最初のほうを見てください。<br />
» <a href="http://lab.alumican.net/embedded_pixelbender_generator/PBJDecoder.as">PBJDecoder.as</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2010/07/12_165011/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ActionScriptで変態言語Whitespaceのインタプリタ</title>
		<link>http://blog.alumican.net/2010/07/12_155751</link>
		<comments>http://blog.alumican.net/2010/07/12_155751#comments</comments>
		<pubDate>Mon, 12 Jul 2010 06:57:51 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Whitespace]]></category>
		<category><![CDATA[wonderfl]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1723</guid>
		<description><![CDATA[何かを作るとき、色々な技術の応用や組み合わせばかりにとらわれている気がして、ActionScriptという言語自体に真剣に向き合ってみようと思ったらいつのまにかWhitespaceという言語に真剣に向き合っていた。な…　 [...]]]></description>
			<content:encoded><![CDATA[<p>何かを作るとき、色々な技術の応用や組み合わせばかりにとらわれている気がして、ActionScriptという言語自体に真剣に向き合ってみようと思ったらいつのまにか<a href="http://compsoc.dur.ac.uk/whitespace/">Whitespace</a>という言語に真剣に向き合っていた。な…　何を言ってるのかわからねーと思うが（ry</p>
<div style="text-align:center;width:100%;margin-bottom:15px;"><iframe title="Whitespace Interpreter - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/gpUu" width="465" height="490" style="border:0px black solid;"></iframe></div>
<p>RunをクリックするとSource Codeに記述したコードが実行され、実行結果がOutputへ出力されます。場合によっては（というかPreset Codeでは Hello, World! 以外全て）入力待ち状態になるのでその際はInputに要求された文字列もしくは数値を入力してSendをクリックします。<br />
<span id="more-1723"></span><br />
<strong>Whitespace？なにそれおいしいの？</strong><br />
Whitespaceは簡単なプログラミング言語です。ただし<span style="color: #eeeeee;">見えない</span>ことを除いては。なぜならばWhitespaceのソースコードは半角スペース、タブ、改行のみで構成されているからです。それ以外の文字は全てコメントとして扱われます。</p>
<p>ちなみに、公式サイトに掲載されているHello Worldのソースです。なんだろうこのドヤ感。<br />
» <a href="http://compsoc.dur.ac.uk/whitespace/hworld.ws">Hello World</a></p>
<p><strong>スタックマシンとしての動作と文法</strong><br />
Whitespaceは記憶領域としてスタック、ヒープというものを使います。ASで言うならばスタックはArray、ヒープはObjectと言ったところでしょうか。スタックは値を一番上に積み上げるか、一番上から取り出すことしかできませんし、値を見るだけでもいちいち取り出さなければいけません。ヒープは任意のラベル（アドレス）に値を保存したり、保存しておいた値を取り出しすことができます。</p>
<pre><code>//スタックのイメージ
stack.push(value);           //値の積み上げ
var value:int = stack.pop(); //値の取り出し

//ヒープのイメージ
heap[address] = value;         //値の保存
var value:int = heap[address]; //値の取り出し</code></pre>
<p>ソースコードは処理命令の羅列となっているので、Whitespaceはソースコードの最初から順番に処理命令を読み取りながら、スタックとヒープを操作してプログラムを実行していきます。ひとつの処理命令は「IMP + コマンド + パラメータ」のセットになっています。それぞれの役割は次のようになっています。</p>
<ul>
<li>IMP ･･･ Instruction Modification Parameterの略で、処理命令の大まかなカテゴリを表します（AS的にはパッケージのようなものです）。</li>
<li>コマンド ･･･ 処理命令の具体的な種類を表します（AS的にはメソッドのようなものです）。</li>
<li>パラメータ ･･･ コマンドを実行するための引数です。コマンドによっては無い場合があります。</li>
</ul>
<p>それぞれの具体的なコードは以下で解説されているので、心の目で見るといいと思います。<br />
» <a href="http://d.hatena.ne.jp/hiroshi128/20100201/1265031426">Whitespace基礎文法最速マスター</a></p>
<p><strong>ソースコード</strong><br />
<a href="http://wonderfl.net/c/gpUu/download">こちら</a>からダウンロードして自由に使ってください。496行目辺りからインタプリタのクラスが記述してあります。本当は正規表現でスマートにやりたかったんですけど、汚くなっちゃいました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2010/07/12_155751/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>遺伝的アルゴリズムで歩行動作獲得への道　～３歩目～</title>
		<link>http://blog.alumican.net/2010/05/11_154025</link>
		<comments>http://blog.alumican.net/2010/05/11_154025#comments</comments>
		<pubDate>Tue, 11 May 2010 06:40:25 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[QuickBox2D]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1658</guid>
		<description><![CDATA[
超マイペースでぼちぼち作っていた、AIで歩行動作を学習しようプロジェクト（１歩目、２歩目）なのですが、先日のイベントでお話したこともあり一段落したので、ひとまずトップページで正式公開することにしました。
» Earth [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://alumican.net/#/c/earthwalker"><img class="alignnone size-full wp-image-1579" title="earthwalker03" src="http://blog.alumican.net/wp-content/uploads/2010/05/earthwalker03.jpg" alt="earthwalker03" width="478" height="200" /></a></p>
<p>超マイペースでぼちぼち作っていた、AIで歩行動作を学習しようプロジェクト（<a href="http://blog.alumican.net/2009/10/29_003222">１歩目</a>、<a href="http://blog.alumican.net/2009/11/11_025133">２歩目</a>）なのですが、<a href="http://blog.alumican.net/2010/03/09_162432">先日のイベント</a>でお話したこともあり一段落したので、ひとまずトップページで正式公開することにしました。</p>
<p>» <a href="http://alumican.net/#/c/earthwalker">Earthwalker</a></p>
<p>今回のアップデートは遺伝的アルゴリズムの最適化、インターフェースの強化、そして<span style="color: #ff0000;">エディタ機能</span>です。</p>
<p>今までは頑張るイモ虫君を見ているだけでしたが、これからは好きな構造の生き物を創って歩かせることができます。誰も見たことのない生き物たちが頑張って歩き方を覚えていく様子を、ほほえましく見守ってあげてください。<br />
<span id="more-1658"></span></p>
<p><strong>エディタ機能</strong><br />
生物の作り方をちょっと説明。真ん中の地球にマウスを持っていくとエディタ機能に入れます。その後、地球の下のほうの「HELP!」にマウスを合わせるとエディタの使い方を見ることができます。基本的には動きの軸となる関節を、棒の体で繋いであげれば完成です。左下のNODEやJOINTは身体構造をあらわしていて、それぞれ関節の数、棒の数になっています。</p>
<p>あまりにパーツの多い生物を作るとPCが重くなっちゃうし、たまに物理演算が崩壊して生き物が飛んでっちゃうので注意ですが、やっとコンテンツとして1ステップ進めることができたかなあ、といった感じです。</p>
<p><strong>学習パラメータ</strong><br />
歩行動作のためのパラメータも少し変えました。<br />
0.5秒ごとに各関節の速度が決められた数値に切り替わるようにして、それを5回繰り返します。1回関節の速度が切り替わる単位を1ステップとします。5ステップをまとめて、1回の歩行動作（＝1サイクル）とします。個体評価は3サイクルでおこないます。計測前の座標と、3サイクル経過後の座標を比べて、どれくらい進んだのかを評価値として遺伝的アルゴリズムを実行します。</p>
<p>左下のSTEPやCYCLEはこの値となっています。ちなみにAGEは世代数、SCOREはその世代の中での最高得点です。それぞれの生き物にくっついてる数字やグラフ表現は個人的な趣味で、中身は適当です、すみません、でも好きなんですこういうの。</p>
<p><strong>今後の予定</strong><br />
このあとどうするかなのですが、まだノープラン。いろんな人の生き物を見れたりするビューアや、レースさせるバトル機能もおもしろそうですし、進化の系譜をまとめて図鑑にするのもいいかも。やりたいことは尽きないですけど、またマイペースに作っていきます。</p>
<p>今、自分が何を作りたいのか、恥ずかしながら模索中です。色々考えてはみるけど、いつも「たくさんの人に喜んでもらいたい」という結論にたどり着きます。僕にとってテクノロジーは大きなキャンバスであり、プログラムは絵筆なのかな。へっぽこプログラマな僕が言うのは何ともおこがましいのですが、音楽や文学や絵画やスポーツで世界中の人を感動させられるなら、プログラムにも何かきっとできるはず。</p>
<p>イベント会場でも、プロジェクタを使ってこいつを設置させてもらったのですが、多くの人に楽しんでいただき、僕が思いもかけないような生き物がたくさん生まれました。そんな生き物たちがだんだんと歩けるようになっていく様子がかわいくて、ただ感動していました（親心によるところも少なからずあると思いますが）。みなさま、どうもありがとうござました。</p>
<p>学習アルゴリズムというコアな技術の軸をぶらさずに、どう表現すればもっと多くの人に楽しんでもらえるのか。イモ虫君にとても勉強させてもらってます。感謝。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2010/05/11_154025/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>drawTrianglesで球面マッピング</title>
		<link>http://blog.alumican.net/2009/12/20_014813</link>
		<comments>http://blog.alumican.net/2009/12/20_014813#comments</comments>
		<pubDate>Sat, 19 Dec 2009 16:48:13 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[FlashPlayer10]]></category>
		<category><![CDATA[wonderfl]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1607</guid>
		<description><![CDATA[既視感ありまくりのエントリで恐縮なのですが、今までGraphics.drawTrianglesを使ったことなかったのと、仕事で必要になったので勉強しました。

外部から読み込んだ画像をテクスチャとして球面上にマッピングし [...]]]></description>
			<content:encoded><![CDATA[<p>既視感ありまくりのエントリで恐縮なのですが、今まで<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/Graphics.html#drawTriangles()">Graphics.drawTriangles</a>を使ったことなかったのと、仕事で必要になったので勉強しました。</p>
<div style="text-align:center;width:100%;margin-bottom:15px;"><iframe title="[Study] Sphere using Graphics.drawTriangles - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/4Hj9" width="465" height="490" style="border:0px black solid;"></iframe></div>
<p>外部から読み込んだ画像をテクスチャとして球面上にマッピングしています。<br />
パースはつけていません。<br />
<span id="more-1607"></span><br />
一応最適化ということで、頂点をなるべく重複点させないようにしています。ただし画像の端に対応する頂点が反対側の端と（極に関しては隣とも）うまくマージできずにほったらかしなので、頑張ればもうちょっと減らせると思います。</p>
<p>迷ったのが、多数の3次元座標を Matrix3D を使って一括投影するのに、<br />
<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/geom/Utils3D.html#projectVectors()">Utils3D.projectVectors</a>と<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/geom/Matrix3D.html#transformVectors()">Matrix3D.transformVectors</a>があるということ。<br />
前者は2次元座標に、後者は3次元座標に投影してくれる。投影後にzバッファしようと思ったら、projectVectorsは第3引数で渡したuvtのうちtに奥行きが入っているのでそれでソートしてやる。transformVectorsなら3次元座標のzを使えばよろし。</p>
<p>今回は球体ということで、z バッファは必要なかったので（視点と逆向きの法線ベクトルを持つポリゴンのみを描画すればよい）、drawTrianglesの第4引数であるcullingの値を適切に設定することでこっち側向いてるポリゴンだけ描画しました。</p>
<p>具体的にはポリゴンを形成する頂点を時計回りで指定して、球体の内側から外側に向かって面の法線ベクトルを伸ばしてます。このときcullingにTriangleCulling.NEGATIVEを設定すれば、あっち側（視点ベクトルと同じ方向）を向いてるポリゴンは描画されないのでいい感じ。球体を内側から見る場合にはTriangleCulling.POSITIVEにする。</p>
<p>話を戻すと、projectVectorsでもtransformVectorsでもどっちでも良かったので、両方やって速い方を使うことにしたのですけど、両者ほとんど差がない。一瞬transformVectorsのが速い気がしたんだけど多分気のせい。</p>
<p>やってる途中でハマったのが、projectVectorsで投影後のuvt値のうち、t値がどうしても全部1になってしまう問題。これは<a href="http://twitter.com/psyark">psyarkさん</a>に教えてもらって理解。多謝。</p>
<blockquote><p>
@alumican_net 全部1になるのは、第一引数のMatrix3DがProjection行ってないからではないかなー [<a href="http://twitter.com/psyark/status/6766133396">link</a>]</p>
<p>PerspectiveProjection#toMatrix3D使うと計算楽だよ [<a href="http://twitter.com/psyark/status/6766164546">link</a>]</p>
<p>Projection行ってるかどうかは、Vector3Dを変換してwが大きくなるかで分かります。もしくはMatrix3Dの4列目に0以外があるかどうか（これはあまり自信なし） [<a href="http://twitter.com/psyark/status/6766235920">link</a>]</p>
<p>普通はrawData[11]が1とかになる。z→wにするために。 [<a href="http://twitter.com/psyark/status/6766261388">link</a>]
</p></blockquote>
<p>Matrix3Dに<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/geom/PerspectiveProjection.html">PerspectiveProjection</a>を設定しないとダメらしい。並行投影なのでその辺を端折ったのがいけなかったのか。</p>
<p>最後に、drawTrianglesは意外と重い、期待値が高かっただけに拍子抜け。<br />
限定的な使い方に絞って最適化頑張って、やっとPapervision3Dに勝てるくらい。</p>
<p>描画する頂点を全部まとめて毎フレーム1回のdrawTrianglesに押さえてはいますが、それでも結構くる。しかも残念なことに描画頂点数というよりは、むしろ描画領域が速度に大きく影響している。見えてないポリゴンをdrawTrianglesに渡さないとか色々試してみたけど結果はほとんど変わらず（むしろVectorを作り直すのに時間が余計かかったくらい）。結局画質を落とすのが一番パフォーマンスを上げるという結果になって萎え～。</p>
<p>とはいえdrawTrianglesを使えば簡単にかなりトリッキーなことができるので、使いどころを考えればおもしろい表現ができるはず。まだ完全には理解してないので、もっといい最適化手法がありそう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/12/20_014813/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

