<?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; 物理</title>
	<atom:link href="http://blog.alumican.net/tag/%e7%89%a9%e7%90%86/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>QuickBox2D オブジェクトの平行移動と回転</title>
		<link>http://blog.alumican.net/2009/07/06_014321</link>
		<comments>http://blog.alumican.net/2009/07/06_014321#comments</comments>
		<pubDate>Sun, 05 Jul 2009 16:43:21 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[QuickBox2D]]></category>
		<category><![CDATA[物理]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=982</guid>
		<description><![CDATA[
オブジェクトの平行移動と回転のサンプル
ボールをドラッグで投げると、ステージ端から端へとループ。
また、ステージクをクリックすればクリックした座標に対応した回転角度で赤いバーが回転。
QuickBox2Dの小ネタ。
運 [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="shadowbox;width=550;height=400;" href="http://lab.alumican.net/quick_box2d_sample/src/translation/translation.swf"><img class="alignnone size-full wp-image-986" title="quick_box2d_sample_translation" src="http://blog.alumican.net/wp-content/uploads/2009/07/quick_box2d_sample_translation.jpg" alt="quick_box2d_sample_translation" width="478" height="200" /></a><br />
<a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/translation/translation.swf">オブジェクトの平行移動と回転のサンプル</a><br />
ボールをドラッグで投げると、ステージ端から端へとループ。<br />
また、ステージクをクリックすればクリックした座標に対応した回転角度で赤いバーが回転。</p>
<p>QuickBox2Dの小ネタ。<br />
運動の状態を保持したままオブジェクトを平行移動や回転させるには、<br />
QuickObjectインスタンスのx、y、angleプロパティを変更すれば良いみたい。<br />
あるオブジェクトのQuickObjectインスタンスはaddしたときに戻り値として受け取れる。<br />
Box2DFlashAS3のSetXFormを使うよりも簡単で便利。</p>
<p>以下サンプルのソースコード（実行には別途<a href="http://code.google.com/p/tweener/">Tweener</a>が必要です）</p>
<p><span id="more-982"></span></p>
<pre><code>import com.actionsnippet.qbox.*;
import caurina.transitions.Tweener;

//初期化
var sim:QuickBox2D = new QuickBox2D(this);
sim.setDefault( { fillColor:0x0, lineAlpha:0 } );

//地面を作る
sim.addBox( { x:10, y:13, width:30, height:0.1, density:0 } );

//円を3つ作って配列 _circles に入れておく
var circles:Array = new Array();
circles.push( sim.addCircle( { x:4 , y:8, radius:0.3, isBullet:true } ) );
circles.push( sim.addCircle( { x:6 , y:8, radius:0.6, isBullet:true } ) );
circles.push( sim.addCircle( { x:8 , y:8, radius:1.0, isBullet:true } ) );

//バーを作って変数 _bar に入れておく
var bar:QuickObject = sim.addBox( { x:9, y:5, width:4, height:0.2, angle:0.3, density:0, fillColor:0xcc0000 } );

//シミュレーション開始
sim.start();
sim.mouseDrag();

//各種イベントリスナの登録
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(MouseEvent.CLICK, stageClickHandler);

//円をループさせる処理
function enterFrameHandler(e:Event):void
{
    var sw:Number = stage.stageWidth / 30;

    //全ての円を走査する
    for each(var b:QuickObject in circles)
    {
        var r:Number = b.params.radius;

        //左端から出たら右端に移動させる
        <span style="color: #ff0000;">if (b.x &lt; -r    ) b.x = sw + r;</span>
        else
        //右端から出たら左端に移動させる
        <span style="color: #ff0000;">if (b.x &gt; sw + r) b.x = -r;</span>
    }
}

//ステージがクリックされたときにバーを回転させる処理
function stageClickHandler(e:MouseEvent):void
{
    //バーの角度を変更
    Tweener.addTween(bar, {
        <span style="color: #ff0000;">angle:bar.angle + ((mouseX / stage.stageWidth) - 0.5) * 10</span>,
        time:1,
        transition:"easeOutQuart"
    } );
}</code></pre>
<p>　</p>
<p><strong>他のQuickBox2Dネタ一覧もどうぞ</strong> » <a href="http://blog.alumican.net/tag/quickbox2d">tag : QuickBox2D</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/07/06_014321/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QuickBox2DやBox2DFlashAS3での衝突判定をグループ分け</title>
		<link>http://blog.alumican.net/2009/07/05_024440</link>
		<comments>http://blog.alumican.net/2009/07/05_024440#comments</comments>
		<pubDate>Sat, 04 Jul 2009 17:44:40 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[Box2DFlashAS3]]></category>
		<category><![CDATA[QuickBox2D]]></category>
		<category><![CDATA[物理]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=971</guid>
		<description><![CDATA[
衝突判定のサンプル
●と壁、●と●、●と▲、▲と壁、■と壁の組み合わせは衝突が起こり、●と■、▲と■、■と■は衝突しない。
なるほど。
categoryBitsとmaskBitsを両方指定しないといけなかったのか。
Q [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="shadowbox;width=550;height=400;" href="http://lab.alumican.net/quick_box2d_sample/src/maskbits/maskbits.swf"><img class="alignnone size-full wp-image-986" title="quick_box2d_sample_maskbits" src="http://blog.alumican.net/wp-content/uploads/2009/07/quick_box2d_sample_maskbits.jpg" alt="quick_box2d_sample_translation" width="478" height="200" /></a><br />
<a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/maskbits/maskbits.swf">衝突判定のサンプル</a><br />
●と壁、●と●、●と▲、▲と壁、■と壁の組み合わせは衝突が起こり、●と■、▲と■、■と■は衝突しない。</p>
<p>なるほど。<br />
categoryBitsとmaskBitsを両方指定しないといけなかったのか。</p>
<p>QuickBox2DやBox2DFlashAS3でのオブジェクト同士の衝突判定をコントロールする話。<br />
そもそもBox2DFlashAS3には（多分Box2Dにも）2種類の衝突判定方法が用意されている。<br />
(1) groupIndexを使う方法<br />
(2) categoryBits、maskBitsの組み合わせを使う方法</p>
<p><span id="more-971"></span></p>
<p><strong>(1) groupIndexを使う方法</strong></p>
<ul>
<li>同じ正の数でグループ付けされたオブジェクトは必ず衝突する</li>
<li>同じ負の数でグループ付けされたオブジェクトは必ず衝突しない</li>
</ul>
<p>デフォルトは0で、このときは次に書くcategoryBits、maskBitsの組み合わせを使う方法が優先される。0以外の数値を記述するとgroupIndexの方法が優先される。</p>
<p><strong>(2) categoryBits、maskBitsの組み合わせを使う方法</strong></p>
<ul>
<li>categoryBitsに、自分が所属するグループを記述する（デフォルトは0&#215;0001）</li>
<li>maskBitsに、自分と衝突が起こるグループを記述する（デフォルトは0xffff）</li>
</ul>
<p>(2)のcategoryBits、maskBitsの組み合わせを使う方法についてちょっと解説。<br />
自分と何かが衝突するかどうかは、自分のmaskBitsと相手のcategoryBitsの論理積をとって計算できる。結果が0なら衝突しない、0以外なら衝突する。</p>
<p>サンプルのソースコードは以下</p>
<pre><code>import com.actionsnippet.qbox.*;

var sim:QuickBox2D = new QuickBox2D(this);
sim.setDefault( { lineAlpha:0, fillAlpha:0.5 } );

<span style="color: #666666;">// 壁 （デフォルト値を使用）
// categoryBits = 0x0001 (0000 0000 0000 0001)
// maskBits     = 0xffff (1111 1111 1111 1111)
sim.createStageWalls( { fillColor:0xCCCCCC } );</span>

var i:uint;

<span style="color: #FF3030;">// ●
// categoryBits 0000 0000 0000 0010
// maskBits     0000 0000 0000 0111
for (i = 0; i &lt; 3; ++i)
{
    sim.addCircle( { x:0.8 + 1.2 + i * 6, y:2, radius:0.5, fillColor:0xFF0000, categoryBits:0x0002, maskBits:0x0007 } );
}
sim.addBox( { x:3.2, y:5, width:3, height:3, density:0, fillColor:0xFF0000, categoryBits:0x0002, maskBits:0x0007 } );</span>

<span style="color: #309030;">// ▲
// categoryBits = 0x0002 (0000 0000 0000 0010)
// maskBits     = 0x0007 (0000 0000 0000 0111)
for (i = 0; i &lt; 3; ++i)
{
    sim.addPoly( { x:0.8 + 2.4 + i * 6, y:2, verts:[[0, 0, 0.5, 0.87, -0.5, 0.87]], fillColor:0x00CC00, categoryBits:0x0004, maskBits:0x0007 } );
}
sim.addBox( { x:9.2, y:5, width:3, height:3, density:0, fillColor:0x00CC00, categoryBits:0x0004, maskBits:0x0007 } );</span>

<span style="color: #3030FF;">// ■
// categoryBits = 0x0008 (0000 0000 0000 1000)
// maskBits     = 0x0001 (0000 0000 0000 0001)
for (i = 0; i &lt; 3; ++i)
{
    sim.addBox( { x:0.8 + 3.6 + i * 6, y:2, width:1, height:1, fillColor:0x0000FF, categoryBits:0x0008, maskBits:0x0001 } );
}
sim.addBox( { x:15.2, y:5, width:3, height:3, density:0, fillColor:0x0000FF, categoryBits:0x0008, maskBits:0x0001 } );</span>

sim.start();
sim.mouseDrag();</code></pre>
<p>QuickBox2Dを使う場合は上記サンプルのように、オブジェクトをaddするときに<br />
<strong>maskBits<br />
categoryBits<br />
groupIndex</strong><br />
パラメータを指定する。</p>
<p>Box2DFlashAS3ならば<br />
<strong>b2ShapeDef.filter.groupIndex<br />
b2ShapeDef.filter.categoryBits<br />
b2ShapeDef.filter.maskBits</strong><br />
を設定。</p>
<p>参考にさせていただいたページ<br />
<a href="http://hokori.net/2009/05/27/box2dflashas3_contact/">物理エンジンライブラリ Box2DFlashAS3 衝突判定と衝突のグループ・カテゴリ分け</a><br />
<a href="http://progmemo.blogspot.com/2009/01/box2d.html">Box2D:衝突判定のグループ分け</a><br />
　</p>
<p><strong>他のQuickBox2Dネタ一覧もどうぞ</strong> » <a href="http://blog.alumican.net/tag/quickbox2d">tag : QuickBox2D</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/07/05_024440/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QuickBox2D はじめの第一歩</title>
		<link>http://blog.alumican.net/2009/06/28_021753</link>
		<comments>http://blog.alumican.net/2009/06/28_021753#comments</comments>
		<pubDate>Sat, 27 Jun 2009 17:17:53 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript3.0]]></category>
		<category><![CDATA[QuickBox2D]]></category>
		<category><![CDATA[物理]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=872</guid>
		<description><![CDATA[
Zevan Rosser氏が作ってる、簡単にBox2DAS3を使うためのライブラリ「QuickBox2D」のチュートリアル。
第一回は、僕の勉強も兼ねて、QuickBox2Dの導入方法と簡単なサンプルの説明です。
メニ [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-873" title="quickbox2d_samples" src="http://blog.alumican.net/wp-content/uploads/2009/06/quickbox2d_samples.jpg" alt="quickbox2d_samples" width="478" height="200" /></p>
<p>Zevan Rosser氏が作ってる、簡単にBox2DAS3を使うためのライブラリ「<a href="http://actionsnippet.com/?page_id=1391">QuickBox2D</a>」のチュートリアル。</p>
<p>第一回は、僕の勉強も兼ねて、QuickBox2Dの導入方法と簡単なサンプルの説明です。</p>
<p>メニューはこちら<br />
<a href="/2009/06/28_021753#qb2d_introduction">QuickBox2Dの導入</a><br />
<a href="/2009/06/28_021753#qb2d_samples">サンプルファイルのダウンロード</a><br />
<a href="/2009/06/28_021753#qb2d_sample01">Sample 01 「四角形と円を作ってみる」</a><br />
<a href="/2009/06/28_021753#qb2d_sample02">Sample 02 「高精度な衝突判定を使う」</a><br />
<a href="/2009/06/28_021753#qb2d_sample03">Sample 03 「オブジェクトの色や透明度を変える」</a><br />
<a href="/2009/06/28_021753#qb2d_sample04">Sample 04 「パラメータのデフォルト値を設定する」</a><br />
<a href="/2009/06/28_021753#qb2d_sample05">Sample 05 「静的オブジェクトを作る」</a><br />
<a href="/2009/06/28_021753#qb2d_sample06">Sample 06 「多角形を作る」</a><br />
<a href="/2009/06/28_021753#qb2d_sample07">Sample 07 「複雑な多角形を作る」</a><br />
<a href="/2009/06/28_021753#qb2d_sample08">Sample 08 「Box2Dのデバッグ表示を使う」</a><br />
　<br />
<span id="more-872"></span></p>
<p><strong id="qb2d_introduction">導入</strong><br />
まず、QuickBox2Dライブラリを使うには手元にQuickBox2DライブラリとBox2DFlashAS3ライブラリが必要なので、以下のページからそれぞれダウンロードします。</p>
<p><a href="http://actionsnippet.com/?page_id=1391">QuickBox2D</a> &#8211; Downloadsにある最新版をダウンロード（6月27日現在でQuickBox2D alpha 107）<br />
<a href="http://sourceforge.net/projects/box2dflash">Box2DFlashAS3</a> &#8211; 緑色のDownloadボタンからダウンロード</p>
<p>ダウンロードしたファイルを解凍し、クラスパスを通します。<br />
めんどうならflaファイルが置いてあるところにBox2Dフォルダとcomフォルダを置けばOK。<br />
導入はこれで完了。<br />
　</p>
<p><strong id="qb2d_samples">サンプル</strong><br />
今回紹介するサンプルのFlashDevelop用プロジェクトファイル一式をダウンロードできます。<br />
<a href="http://lab.alumican.net/quick_box2d_sample/download/quick_box2d_sample.zip">Download</a></p>
<p>以下では，QuickBox2Dのスタートページに載っている8個のサンプルコードを上から順番に説明していきます。<br />
基本的には本家のソースコードそのままですが、とても簡単に物理シミュレーションを実現できる事が分かると思います。<br />
コードはタイムラインに書いてもクラスのコンストラクタに書いてもOK。<br />
赤文字はそのサンプルで大事な部分です。ではどうぞ。<br />
　</p>
<p><strong id="qb2d_sample01">Sample 01 「四角形と円を作ってみる」</strong></p>
<pre><code><span style="color: #ff0000;">import com.actionsnippet.qbox.*;</span> // (1)

<span style="color: #ff0000;">var sim:QuickBox2D = new QuickBox2D(this);</span>　// (2)

<span style="color: #ff0000;">sim.createStageWalls();</span> // (3)

<span style="color: #ff0000;">sim.addBox( { x:5, y:5, width:1, height:1 } );</span> // (4)

<span style="color: #ff0000;">sim.addCircle( { x:4, y:8, radius:2 } );</span> // (5)

<span style="color: #ff0000;">sim.start();</span> // (6)

<span style="color: #ff0000;">sim.mouseDrag();</span> // (7)</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample01/sample01.swf">実行結果</a></p>
<p>真っ赤っか（笑）　はい、ひとつずついきまーす。</p>
<pre><code>import com.actionsnippet.qbox.*;</code></pre>
<p>(1)　QuickBox2Dのインポート。これがないと始まらない。Box2DFlashAS3はインポートしなくてもQuickBox2Dが勝手にやってくれるのでOK。</p>
<pre><code>var sim:QuickBox2D = new QuickBox2D(this);</code></pre>
<p>(2)　QuickBox2Dインスタンスを作る。こいつの中で物理シミュレーションする。引数として渡したMovieClipにシミュレーション結果をバリバリ描画していく。クラスベースでやるときはついついSprite型を渡してしまわないように注意（笑）</p>
<pre><code>sim.createStageWalls();</code></pre>
<p>(3)　とても便利なメソッド。こいつを呼び出せばステージ四方に壁を作ってくれる。ブラウザリサイズに対応してなかったり厚みをコントロールできなかったりするのがあれだけど、とりあえず実験するぶんにはかなり重宝。</p>
<pre><code>sim.addBox( { x:5, y:5, width:1, height:1 } );</code></pre>
<p>(4)　四角形のオブジェクトを作る。Box2DFlashAS3でなにか作るには、まず形状の定義をして、それから実体化する手順がいるけどQuickBox2DではこれひとつでOK。パラメータとして<a href="http://actionsnippet.com/?p=1261">いろんな値を渡せる</a>けど、ひとまず幅1m、高さ1mの四角形をx座標5m、y座標5mの地点に置いてます。</p>
<p><span style="color: #ff0000;">QuickBox2Dでは1mを30ピクセル固定で表現しているので、1ピクセルが1mだと思ってパラメータを指定するとバカでかいオブジェクトが出現してしまいます。なので例えばオブジェクトをx座標90ピクセルに置きたいときは、xのパラメータを3にすればよいです。</span></p>
<pre><code>sim.addCircle( { x:4, y:8, radius:2 } );</code></pre>
<p>(5)　同じようにして円形のオブジェクトを作る。radiusは半径。要は半径2mの円をx座標4m、y座標8mの地点に置いてます。</p>
<pre><code>sim.start();</code></pre>
<p>(6)　シミュレーションを開始する。これを書いとけば毎フレーム自動でオブジェクトを更新してくれる。Papervision3DでいうところのstartRenderingみたいなもん。</p>
<pre><code>sim.mouseDrag();</code></pre>
<p>(7) これも便利。壁みたいな固定オブジェクト以外のオブジェクトをマウスでドラッグできるようになる。<br />
　</p>
<p><strong id="qb2d_sample02">Sample 02 「高精度な衝突判定を使う」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);
sim.createStageWalls();

sim.addBox( { x:5, y:5, width:1, height:1, <span style="color: #ff0000;">isBullet:true</span> } );

sim.addCircle( { x:4, y:8, radius:2 } );
sim.start();
sim.mouseDrag();</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample02/sample02.swf">実行結果</a></p>
<p>前回との違いはisBulletパラメータをtrueにして渡すだけ。これだけで、この四角形に対しては精度の高い(でも負荷の高い)衝突判定アルゴリズムに切り替わる。試してみると確かにfalseの場合に比べて衝突後の慣性が自然に表現されてて気持ちいいなー。ポイントとなる部分で使うと良いかも。ちなみにBulletは弾丸という意味。<br />
　</p>
<p><strong id="qb2d_sample03">Sample 03 「オブジェクトの色や透明度を変える」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);
sim.createStageWalls();

sim.addBox( { x:5, y:5, width:1, height:1, <span style="color: #ff0000;">lineColor:0xFF0000</span>, <span style="color: #ff0000;">fillColor:0xFFFF00</span> } );
sim.addCircle( { x:4, y:8, radius:2, fillColor:0xCC0000, fillAlpha:.5, <span style="color: #ff0000;">lineThickness:3</span>, <span style="color: #ff0000;">lineAlpha:.5</span> } );

sim.start();
sim.mouseDrag();
</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample03/sample03.swf">実行結果</a></p>
<p>lineColorで線の色、lineAlphaで線の透明度、lineThicknessで線の太さ、fillColorで塗り色、fillAlphaで塗りの透明度をそれぞれ変更できる。サンプルでは四角形の線の色を赤、塗りの色を黄色、円の塗りの色をグレー、線と塗りの透明度を0.5、線の太さを3に変更してる。<br />
　</p>
<p><strong id="qb2d_sample04">Sample 04 「パラメータのデフォルト値を設定する」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);

<span style="color: #ff0000;">sim.setDefault( { fillColor:0x00CC22, lineAlpha:0, radius:1.5 } );</span> // (1)

sim.createStageWalls();

sim.addBox( <span style="color: #ff0000;">{ x:5, y:5, width:1, height:1, lineColor:0xFF0000, lineAlpha:1 }</span> );
sim.addCircle( <span style="color: #ff0000;">{ x:4, y:8, radius:2 }</span> );
sim.addCircle( <span style="color: #ff0000;">{ x:10, y:4, fillColor:0x666666 }</span> ); // (2)

sim.start();
sim.mouseDrag();
</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample04/sample04.swf">実行結果</a></p>
<p>ほい解説。</p>
<pre><code>sim.setDefault( { fillColor:0x00CC22, lineAlpha:0, radius:1.5 } );</code></pre>
<p>(1) setDefaultメソッドを使えば全オブジェクトに対するデフォルト値を設定できる。ここでは塗りの色を緑、線の透明度を0（表示しない）、半径を1.5mに設定してる。ただしオブジェクトをaddするときのパラメータとデフォルト値では、addするときのパラメータの方が優先される。</p>
<pre><code>sim.addBox( { x:5, y:5, width:1, height:1, lineColor:0xFF0000, lineAlpha:1 } );
sim.addCircle( { x:4, y:8, radius:2 } );
sim.addCircle( { x:10, y:4, fillColor:0x666666 } );</code></pre>
<p>(2) それぞれのオブジェクトをaddするときに、未指定パラメータに関してだけデフォルト値が設定されている。<br />
　</p>
<p><strong id="qb2d_sample05">Sample 05 「静的オブジェクトを作る」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);
sim.setDefault( { fillColor:0x00CC22, lineAlpha:0, radius:1.5 } );
sim.createStageWalls();
sim.addBox( { x:5, y:5, width:1, height:1, lineColor:0xFF0000, lineAlpha:1 } );
sim.addCircle( { x:4, y:8, radius:2 } );
sim.addCircle( { x:10, y:4, fillColor:0x666666 } );

sim.addBox( { x:5, y:6, width:4, height:.3, angle:0.3, <span style="color: #ff0000;">density:0</span>, fillColor:0xCC0000 } );

sim.start();
sim.mouseDrag();
</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample05/sample05.swf">実行結果</a></p>
<p>壁のような動かないオブジェクトを作るにはdensityを0にしてあげればOK。densityが0のオブジェクトはmouseDragを実行してもマウスでドラッグできなくなる。ここでは赤いバーを設置。<br />
　</p>
<p><strong id="qb2d_sample06">Sample 0６ 「多角形を作る」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);
sim.setDefault( { fillColor:0x00CC22, lineAlpha:0, radius:1.5 } );
sim.createStageWalls();
sim.addBox( { x:5, y:5, width:1, height:1, lineColor:0xFF0000, lineAlpha:1 } );
sim.addCircle( { x:4, y:8, radius:2 } );
sim.addCircle( { x:10, y:4, fillColor:0x666666 } );
sim.addBox( { x:5, y:16, width:4, height:.3, angle:0.3, density:0, fillColor:0xCC0000 } );

<span style="color: #ff0000;">sim.addPoly( { x:15, y:8, verts:[[0, 0, 2, 2, 0, 2]], fillColor:0x0000FF } );</span>

sim.start();
sim.mouseDrag();
</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample06/sample06.swf">実行結果</a></p>
<p>ちょい複雑なので詳しく解説。<br />
好きな形の多角形を作るにはaddPolyを使い、頂点配列をvertsに渡すことで作れる。(x1, y1)、(x2, y2)、(x3, y3)の3点で定義される頂点配列は[x1, y1, x2, y2, x3, y3]となる。3点は最上部の点から書き始めて，時計回りになる順番で書いていく。</p>
<p>ここで書く頂点座標はステージ座標ではなく、オブジェクトを定義するための頂点間の関係を示す座標なので、(0, 0)と書いたからといってステージの(0, 0)に置かれるわけではない。分かりづらければ(0, 0)に最初の点があると思って座標を書いていけばOK。</p>
<p>サンプルでは(0, 0)、(2, 2)、(0, 2)の3点で定義される三角形を作ってx=15、y=8の位置に置いている。vertsが2重配列になっているのは複数の頂点配列を渡せるようにするため(次のサンプルで解説)。</p>
<p>サンプルでは頂点数が3個だけど、頂点数は8個まで増やせる。ただし，凹な形にすると衝突判定がおかしくなるので注意が必要。</p>
<p>もっと複雑な形のオブジェクトを作る場合は，Sample7で解説する3角形の組み合わせで表現する方法や、vertsではなくpointsを用いる方法(後で解説)を使いましょう．<br />
　</p>
<p><strong id="qb2d_sample07">Sample 07 「複雑な多角形を作る」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);
sim.setDefault( { fillColor:0x00CC22, lineAlpha:0, radius:1.5 } );
sim.createStageWalls();
sim.addBox( { x:5, y:5, width:1, height:1, lineColor:0xFF0000, lineAlpha:1 } );
sim.addCircle( { x:4, y:8, radius:2 } );
sim.addCircle( { x:10, y:4, fillColor:0x666666 } );
sim.addBox( { x:5, y:16, width:4, height:.3, angle:0.3, density:0, fillColor:0xCC0000 } );

sim.addPoly( { x:15, y:8, <span style="color: #ff0000;">verts:[[0, 0, 2, 2, 0, 2], [0, 0, 0, 1, -2, -0.2]]</span>, fillColor:0x0000FF } );

sim.start();
sim.mouseDrag();
</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample07/sample07.swf">実行結果</a></p>
<p>addPolyのvertsに複数の頂点配列を渡せば、複数のポリゴン組み合わさったがオブジェクトを作れる。</p>
<p>サンプルでは(0, 0)、(2, 2)、(0, 2)からなる三角形と、(0, 0)、(0, 1)、(-2, -0.2)からなる三角形を組み合わせたオブジェクトを作ってる。サンプルでは2個のオブジェクトを組み合わせているが，何個でも組み合わせることができる。<br />
　</p>
<p><strong id="qb2d_sample08">Sample 08 「Box2Dのデバッグ表示を使う」</strong></p>
<pre><code>import com.actionsnippet.qbox.*;

var sim:QuickBox2D = new QuickBox2D(this, { <span style="color: #ff0000;">debug:true</span> } );

sim.setDefault( { fillColor:0x00CC22, lineAlpha:0, radius:1.5 } );
sim.createStageWalls();
sim.addBox( { x:5, y:5, width:1, height:1, lineColor:0xFF0000, lineAlpha:1 } );
sim.addCircle( { x:4, y:8, radius:2 } );
sim.addCircle( { x:10, y:4, fillColor:0x666666 } );
sim.addBox( { x:5, y:16, width:4, height:.3, angle:0.3, density:0, fillColor:0xCC0000 } );
sim.addPoly( { x:15, y:8, verts:[[0, 0, 2, 2, 0, 2], [0, 0, 0, 1, -2, -0.2]], fillColor:0x0000FF } );
sim.start();
sim.mouseDrag();
</code></pre>
<p><a rel="shadowbox;width=550;height=400;background-color:#ffffff;" href="http://lab.alumican.net/quick_box2d_sample/src/sample08/sample08.swf">実行結果</a></p>
<p>今回最後の解説。<br />
QuickBox2Dのコンストラクタの第2引数にdebug:trueを含むオブジェクト渡せば、Box2Dのデバッグ表示に切り替わる。<br />
　</p>
<p>おつかれさまでした。<br />
以上が、QuickBox2Dをとりあえず使ってみたい人のための導入方法と簡単なサンプルの説明でした。<br />
QuickBox2Dは現在どんどん機能拡張されていたり、おもしろいサンプルが本家でどんどん紹介されているので（<a href="http://actionsnippet.com/?p=1479">GroupとJointの使い方</a>とか<a href="http://actionsnippet.com/?p=1538">FRIM</a>、<a href="http://actionsnippet.com/?p=1471">任意の形を三角ポリゴンに分けてオブジェクトを作る</a>、<a href="http://actionsnippet.com/?p=1634">表示オブジェクトを切り替える</a>などなど）、本家に書いてあることはできるだけ紹介していきたいです。あと僕がライブラリのソースコードを読んでて気づいた点やライブラリ拡張の方法とか。</p>
<p><a href="http://actionsnippet.com/qb2d/docs/html/index.html">本家のドキュメント</a>も充実していますので、読んでみると良いかも。<br />
　</p>
<p><strong>他のQuickBox2Dネタ一覧もどうぞ</strong> » <a href="http://blog.alumican.net/tag/quickbox2d">tag : QuickBox2D</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/06/28_021753/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>
		<item>
		<title>テオ・ヤンセン展</title>
		<link>http://blog.alumican.net/2009/01/20_223740</link>
		<comments>http://blog.alumican.net/2009/01/20_223740#comments</comments>
		<pubDate>Tue, 20 Jan 2009 13:37:40 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[LIFE]]></category>
		<category><![CDATA[Theo Jansen]]></category>
		<category><![CDATA[アート]]></category>
		<category><![CDATA[物理]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=28</guid>
		<description><![CDATA[テオ・ヤンセン（Theo Jansen）氏&#160;1&#160;は風をエネルギーとして砂浜を歩く新しい生物（ビーチアニマル）を創っているオランダのアーティストです。
彼と彼のビーチアニマルの映像としてはBMWのCMが [...]]]></description>
			<content:encoded><![CDATA[<p>テオ・ヤンセン（Theo Jansen）氏<sup>&nbsp;1&nbsp;</sup>は風をエネルギーとして砂浜を歩く新しい生物（ビーチアニマル）を創っているオランダのアーティストです。<br />
彼と彼のビーチアニマルの映像としてはBMWのCMが有名なのではないでしょうか。</p>
<p><object width="320" height="265" data="http://www.youtube.com/v/a7Ny5BYc-Fs&amp;hl=ja&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/a7Ny5BYc-Fs&amp;hl=ja&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></p>
<p>現在、日比谷パティオで<a href="http://www.hibiya-patio.jp/specialevent/0901theo/">テオ・ヤンセン展</a>が開催されています。何を隠そう僕はテオ・ヤンセンの大ファンなので、アジア圏初の展示会となれば行かないわけにはいきません。<br />
というわけで先週土曜日に行ってきました。<br />
<span id="more-28"></span></p>
<p><a href="/wp-content/uploads/2009/01/p1010733.jpg" rel="shadowbox"><img src="/wp-content/uploads/2009/01/p1010733-225x300.jpg" alt="090117 テオ・ヤンセン展" title="090117 テオ・ヤンセン展" width="225" height="300" class="alignnone size-medium wp-image-63" /></a></p>
<p>会場内は撮影禁止なのですが、芸術作品にしては珍しくほとんどの作品に自由に触ることができます。しかも、自分で押したり引いたりしてビーチアニマルを歩かせることができます、すごい！だって、プラスチックのチューブと結束からできている巨大な骨組みが、ワシャワシャと動くんですよ、もう感動ですよ感動。子供やカップルに混じって何回も何回も押したり引いたりしましたよ、ええ。歩行メカニズムをニヤニヤしながら解析している様はさぞかし危険人物として写ったことでしょう。行って良かった。</p>
<p>で、本当にびっくりしたんですけど、テオ・ヤンセン本人が会場にいるんです、普通に！そして本人の解説付きで最新のビーチアニマルを動かすデモをしてくれました。<del datetime="2009-01-22T01:43:57+00:00">これはあとで知ったのですが、本人がいるのは最初の二日間のみらしく、</del>ちょっと無理してでも土曜日に行って良かったです。</p>
<p>（追記）24日もヤンセン本人がデモをおこなう事が決定したそうです。下記参照。<br />
<a href="http://hibiya-patio.under.jp/theo/topics/archives/2009/01/124.html">http://hibiya-patio.under.jp/theo/topics/archives/2009/01/124.html</a></p>
<p>その最新のビーチアニマル（名前忘れてしまった。。。）は羽とたくさんのペットボトルが背中に付いていて恐竜さながらでした。とにかくでかい。体長は10mくらいだったかな。重さは180kgあるらしいです、うひー。背中のペットボトルは何に使うのかというと、風を貯めておく装置なんだそうです。</p>
<p>開設の受け売りですが、他のビーチアニマルが風ではためく羽の動きをそのまま動力として脚部に伝えているのに対して、最新型は羽の動きをポンプの動きに変換してペットボトルに圧縮空気をため込むらしいのです。そして、その圧縮空気で動かしたシリンダーで地面をキックすることで歩くという。ペットボトルロケットの親玉ですね、すげー。しかも、水感知センサーが付いていて（センサーといってもペットボトルとシリンダーみたいなのでつくった、おおよそセンサーとは思えないような物）、海水を検知して自動で進行方向を逆転できる仕組みを取り入れたとか。これによって海に沈まなくてすむのだとか。<br />
ペットボトルとチューブでアナログコンピュータを実装しているとか、凄すぎる。LBP<sup>&nbsp;2&nbsp;</sup>どころじゃねー。</p>
<p>本人の英語は全部は聞き取れなかったんですが、とても楽しそうに話していたのが印象的でした。</p>
<p>デモンストレーションのあとは、質問コーナーみたいなのがあって、何故プラスチックチューブだけで生物を作るのかという質問に対しては、人間の体が様々な働きをするタンパク質からできているように、新しい生物も一つの物質から作りたいと思ったのだそうです。なるほどなー。</p>
<p>確かにビーチアニマルを間近で見ると、材料はほとんどプラスチックチューブだったのですが、様々な組み方や加工の仕方で色んなギミックを作っているんです。ギアとか、骨格とか、クランクとか、シリンダーとか全部ですよ。</p>
<p>もう一つ、彼の夢が印象的だったのです。<br />
彼の夢は、自分が死んだ後もずっと、意志をもって動き回るビーチアニマルたちを生み出すこと。<br />
なんだかロマンチックですよね。</p>
<p>通訳さんを通してですが本人とも直接話せたし、図録にもサインしてもらったし、大満足な一日でした。</p>
<p>それにしても、サイン会は限定50人って言ってた割には明らかにそれ以上の人がいたし、その人達一人一人と話したり写真を撮ったり、ヤンセン氏、スタッフさん共々とてもいい方々でした。</p>
<p>4月上旬まで開催しているそうなので是非足を運んでみてはいかがでしょうか。</p>
<p>（おまけ）<a href="/wp-content/uploads/2009/01/p10107321.jpg" rel="shadowbox">ヤンセンと僕</a></p>
<ol class="footnotes"><li id="footnote_0_28" class="footnote"><a href="http://www.strandbeest.com/">http://www.strandbeest.com/</a></li><li id="footnote_1_28" class="footnote">リトルビッグプラネット。高度な物理演算を搭載したPS3のゲームソフト。持ってないけど、とても楽しそう。</li></ol>]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/01/20_223740/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
