<?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; wonderfl</title>
	<atom:link href="http://blog.alumican.net/tag/wonderfl/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.alumican.net</link>
	<description>日々の記憶と記録とActionScript とその周辺</description>
	<lastBuildDate>Tue, 20 Jul 2010 16:21:59 +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>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>2</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>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>
		<item>
		<title>縦横比を保ったままリサイズするBoundaryResizerクラス</title>
		<link>http://blog.alumican.net/2009/10/07_225251</link>
		<comments>http://blog.alumican.net/2009/10/07_225251#comments</comments>
		<pubDate>Wed, 07 Oct 2009 13:52:51 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[wonderfl]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=1435</guid>
		<description><![CDATA[読み込んだ画像をサムネイル枠内に収まるように縦横比を保ったままリサイズしたり、ステージの背景に敷くために拡大したりすることがあると思います。その都度計算式を書くのは面倒なので、クラス化しました。地味によく使っているので紹 [...]]]></description>
			<content:encoded><![CDATA[<p>読み込んだ画像をサムネイル枠内に収まるように縦横比を保ったままリサイズしたり、ステージの背景に敷くために拡大したりすることがあると思います。その都度計算式を書くのは面倒なので、クラス化しました。地味によく使っているので紹介します。<br />
このクラスはRectangleの情報をやりとりするだけなので、Bitmap以外にも何にでも使えます。</p>
<p><strong>サンプル</strong><br />
ご覧いただければ何が目的のライブラリなのか、だいたい分かると思います。</p>
<div style="text-align:center;width:100%;margin-bottom:15px;"><iframe title="[Sample] BoundaryResizer Demo - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/kF5j" width="465" height="490" style="border:0px black solid;"></iframe></div>
<p><strong>ダウンロード</strong><br />
» <a href="http://lab.alumican.net/boundary_resizer_demo/BoundaryResizer.zip">通常版はこちら</a><br />
» <a href="http://lab.alumican.net/boundary_resizer_demo/BoundaryResizer.txt">BoundaryResizer.asファイルのみ （拡張子をasに変更してください）</a></p>
<p><strong>使い方</strong><br />
コードはこんな感じで。</p>
<pre><code>var bmp:Bitmap = ...
var target:Rectangle = bmp.bitmapData.rect;
var boundary:Rectangle = new Rectangle(50, 50, 300, 300);
var scaleMode:String = BoundaryResizer.NO_BORDER;
var align:String = BoundaryResizer.TOP_LEFT;
<span style="color: #ff0000;">var resized:Rectangle = BoundaryResizer.resize(target, boundary, scaleMode, align);</span>
bmp.x = resized.x;
bmp.y = resized.y;
bmp.width = resized.width;
bmp.height = resized.height;</code></pre>
<p><span id="more-1435"></span></p>
<p>BoundaryResizer.resizeメソッドの引数はこんな感じで。</p>
<ul>
<li><strong>target:Rectangle</strong> ･･･ 第1引数。リサイズ対象オブジェクトの矩形を指定します。上の例ではリサイズしたい画像の矩形となります。</li>
<li><strong>boundary:Rectangle</strong> ･･･ 第2引数。リサイズの基準となる矩形を指定します。上の例ではリサイズ後の画像を収める枠となります。</li>
<li><strong>scaleMode:String</strong>（省略可） ･･･第3引数。 リサイズ時のスケールモードを指定します。このパラメータはStageScaleModeと互換性があります。このパラメータを省略した場合はBoundaryResizer.NO_SCALEとなり、リサイズはおこなわれません。</li>
<li><strong>align:String</strong>（省略可） ･･･ 第4引数 。boundaryに対するtargetの基準位置を指定します。このパラメータはStageAlignと互換性があります。このパラメータを省略した場合はBoundaryResizer.CENTERとなり、縦横ともに中央揃えとなります。</li>
<li><strong>戻り値:Rectangle</strong> ･･･ リサイズ後の矩形が返されます。target及びboundaryは変更しません。</li>
</ul>
<p>リサイズ方法を操作するscaleModeには以下の定数を指定できます。</p>
<pre><code>// targetとboundaryが完全に一致するようにリサイズされます。多くの場合、targetの縦横比は保たれません。
BoundaryResizer.<span style="color: #ff0000;">EXACT_FIT</span>

// targetが縦横比を保ち、かつtargetがboundaryの内側にフィットするようにリサイズされます。targetがトリミングされることはありませんが、上下または左右に隙間ができることがあります。
BoundaryResizer.<span style="color: #ff0000;">SHOW_ALL</span>

// targetが縦横比を保ち、かつboundaryがtargetの内側にフィットするようにリサイズされます。targetとboundaryの間に隙間ができることはありませんが、targetがトリミングされることがあります。
BoundaryResizer.<span style="color: #ff0000;">NO_BORDER</span>

// リサイズがおこなわれず、alignによる基準点合わせのみがおこなわれます。
BoundaryResizer.<span style="color: #ff0000;">NO_SCALE</span></code></pre>
<p>リサイズ後のオブジェクトの基準点を操作するalignには以下の定数を指定できます。</p>
<pre><code>BoundaryResizer.<span style="color: #ff0000;">TOP_LEFT</span>     // x軸方向:左　, y軸方向:上
BoundaryResizer.<span style="color: #ff0000;">TOP</span>          // x軸方向:中央, y軸方向:上
BoundaryResizer.<span style="color: #ff0000;">TOP_RIGHT</span>    // x軸方向:右　, y軸方向:上
BoundaryResizer.<span style="color: #ff0000;">LEFT</span>         // x軸方向:左　, y軸方向:中央
BoundaryResizer.<span style="color: #ff0000;">CENTER</span>       // x軸方向:中央, y軸方向:中央
BoundaryResizer.<span style="color: #ff0000;">RIGHT</span>        // x軸方向:右　, y軸方向:中央
BoundaryResizer.<span style="color: #ff0000;">BOTTOM_LEFT</span>  // x軸方向:左　, y軸方向:下
BoundaryResizer.<span style="color: #ff0000;">BOTTOM</span>       // x軸方向:中央, y軸方向:下
BoundaryResizer.<span style="color: #ff0000;">BOTTOM_RIGHT</span> // x軸方向:右　, y軸方向:下</code></pre>
<p><strong>追記 09.10.08</strong><br />
・多少最適化しました。以前のバージョンをお使いの方はBoundaryResizer.asを入れ替えて頂ければ大丈夫です。<br />
・wonderflのサンプルを更新しました。</p>
<p><strong>追記 09.10.22</strong><br />
・使い方のサンプルコードに間違いがあったので修正しました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/10/07_225251/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RGB Ensemble using Webcam</title>
		<link>http://blog.alumican.net/2009/06/06_144431</link>
		<comments>http://blog.alumican.net/2009/06/06_144431#comments</comments>
		<pubDate>Sat, 06 Jun 2009 05:44:31 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[wonderfl]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=834</guid>
		<description><![CDATA[
先月の大阪てら子でSaqooshaさんがつくってたのが素敵だったので、見よう見まねでやってみました。ただやるだけだとつまんないので、RGBのカラーバージョンでアンサンブルしてみました（音の動的生成を使っているのでFla [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:100%;margin-bottom:15px;"><iframe title="RGB Ensemble using Webcam - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/d14b" width="465" height="490" style="border:0px black solid;"></iframe></div>
<p><a href="http://atnd.org/events/664">先月の大阪てら子</a>で<a href="http://saqoosha.net/">Saqoosha</a>さんがつくってたのが素敵だったので、見よう見まねでやってみました。ただやるだけだとつまんないので、RGBのカラーバージョンでアンサンブルしてみました（音の動的生成を使っているので<a href="http://get.adobe.com/jp/flashplayer/">FlashPlayer10</a>以上じゃないと動きません）。</p>
<p>webカメラ（カメラがない人はサンプルの静止画像）からリアルタイムで読み込んだ画像をRGB分解します。分解されたRGB画像をもとに音を鳴らすおもちゃです。RGBの順にオクターブ単位で音域が低くなっているので、頑張れば3パートでハモれるかも知れません。</p>
<p>いい感じの音を鳴らすために<br />
<a href="http://wonderfl.kayac.com/code/1cafdfd8a0f008107c8e42c33043107a73cb52e8"> あの楽器っぽいスクリプト Ver1.2(メニューをつけてみた）</a><br />
の波形生成アルゴリズムを使わせてもらってます。ありがとうございます。</p>
<p>また、単純にBitmapData.copyChannelやColorMatrixFilterなどでRGB分解すると、例えば白い部分などは全チャネルで反応してしまいます。そこで、人の目が見て赤緑青な部分を直感的にRGB成分として取り出せるように、RGBExtractorというクラスを作りました。</p>
<p>このクラスは入力画像の全ピクセルに以下の処理をおこなうことでRGB各成分を抽出します。ここで、R,G,Bはある座標における入力画像の色、R&#8217;,G&#8217;,B&#8217;は分解後のその座標の色となります(計算上マイナスになった場合は0とします)。<br />
scaleは0以上の任意の実数です。写真などの自然画像にはRGBの純色はまず出てこないので、scaleがある程度高くないとハッキリと検出できませんでした。</p>
<pre><code>R' = scale * ( R - max(G, B) )
G' = scale * ( G - max(B, R) )
B' = scale * ( B - max(R, G) )</code></pre>
<p>この処理は、実際にはフィルタで全ピクセルをバッチ処理しています。RGBExtractorクラスはまだ詰めが甘いので、もう少し精度を上げられるように頑張ってSpark Projectにコミットしておきます。</p>
<p>今回初めてFlashPlayer10の動的音生成を使ってみたのですが、鳴らすだけなら思ってたより簡単でした。それ以上に、音の鳴るものは作っててやっぱり面白くて、音楽ってすごいなあって改めて感じました。幸いにもSpark Projectには<a href="http://www.libspark.org/#sound-as3">音関係の素晴らしいライブラリ</a>がたくさんあるので、もっと使わせていただこうと思います。そんな感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/06/06_144431/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fluid on the Video</title>
		<link>http://blog.alumican.net/2009/05/12_202244</link>
		<comments>http://blog.alumican.net/2009/05/12_202244#comments</comments>
		<pubDate>Tue, 12 May 2009 11:22:44 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Fluid]]></category>
		<category><![CDATA[wonderfl]]></category>
		<category><![CDATA[流体シミュレーション]]></category>
		<category><![CDATA[物理]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=713</guid>
		<description><![CDATA[
前回のエントリに書いたyugop氏の言葉にもろ影響されてますが、美しいものを作りたくなったので、やったった。ActionScript3.0で流体シミュレーション。ついでにサイトトップも更新しました。 
実はまともにDi [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;width:100%;margin-bottom:15px;"><iframe title="Fluid on the Video - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/wM1h" width="465" height="490" style="border:0px black solid;"></iframe></div>
<p><a href="http://blog.alumican.net/2009/05/12_134205">前回のエントリ</a>に書いたyugop氏の言葉にもろ影響されてますが、美しいものを作りたくなったので、やったった。ActionScript3.0で流体シミュレーション。ついでにサイトトップも更新しました。 </p>
<p>実はまともにDisplacementMapFilterを使ったのは初めてでした、うへぁ。流体シミュレーションも初めてだったので色々戸惑ったけど、まあまあおもろいもんが作れた気がするぞ。</p>
<p>どうやってるかというと、基本的なアルゴリズムは<a href="http://violentcoding.com/blog/2008/07/26/archives/135">blog ViolentCoding</a>さんのを使っていて、それを動画に適用した感じです。で、そのまんまだとマウスを素早く動かすとゼリーみたいにぷるぷるしちゃったので（可愛いけど）、ドロっとするようにアルゴリズムを改造。あとは高速化のためにセルを2次元配列で走査するのではなく、リンクリストを使うように変更しました。他にも色々やった気がするけど、忘れた。</p>
<p>リンクリストってのは、隣のセルを参照として持っておいて、その参照を使って隣へアクセスする方法。配列演算子を使わずに、隣へ隣へとセルの参照をたどることで、まるっとアクセスします。</p>
<p>今回は各セル毎に、forに代わる次セルへの参照と、流体の速度場を更新するための上下左右8方向のセルの参照を持たせました。これがめっぽう速いのなんのなのです。（フレームレートで言うと5フレームくらい違う）</p>
<p>なので、今度から頻繁に配列を回すときはリンクリストを使うようにするとよさげです。ターゲットプレーヤーが10のときにVectorとどっちが速いのか要検証ですが。</p>
<p>あと、この流体表現。<br />
<span style="color: #ff0000;">ライブラリは必殺技</span>という精神に基づいて、<a href="http://www.trick7.com/blog/2008/07/27-205806.php">trick7さんのTeraFire</a>みたいに</p>
<pre><code>alumiFluid(target);</code></pre>
<p>とかで任意のオブジェクトを液状化できると素敵なので現在制作中だったりします。もちろん、汎用流体ライブラリとしても使えるようにするつもりです。需要あるかどうか分からんけど。</p>
<p>wonderflのはソースにコメントを書いてないので、ライブラリ化のときにちゃんとします。少々お待ちを、すみません。</p>
<p>では～。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/05/12_202244/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
