<?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; Box2DFlashAS3</title>
	<atom:link href="http://blog.alumican.net/tag/box2dflashas3/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>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>
	</channel>
</rss>

