<?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>Promethe's Blog &#187; tutorial</title>
	<atom:link href="http://blog.promethe.net/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.promethe.net</link>
	<description>Web, RIAs and chocolate spaghettis...</description>
	<lastBuildDate>Tue, 29 Jun 2010 09:24:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Build Flash 10.1 applications with Flex Builder 3 or Flash Builder 4</title>
		<link>http://blog.promethe.net/2010/03/31/flash-10-1-with-flex-builder-3-or-flash-builder-4/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=flash-10-1-with-flex-builder-3-or-flash-builder-4</link>
		<comments>http://blog.promethe.net/2010/03/31/flash-10-1-with-flex-builder-3-or-flash-builder-4/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 10:19:25 +0000</pubDate>
		<dc:creator>Promethe</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash 10.1]]></category>
		<category><![CDATA[Flash Builder 4]]></category>
		<category><![CDATA[Flex Builder 3]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.promethe.net/?p=677</guid>
		<description><![CDATA[It was one of my first posts on this blog: Work with Flash 10 in Flex Builder 3. This post has proven to be very helpful and is still read a lot every day! As Flash 10.1 is currently accessible in beta. I thought it would be nice to have some tutorial to build applications [...]]]></description>
			<content:encoded><![CDATA[<p>It was one of my first posts on this blog: <a href="http://blog.promethe.net/2008/08/21/work-with-flas…flex-builder-3/" target="_self">Work with Flash 10 in Flex Builder 3</a>. This post has proven to be very helpful and is still read a lot every day!</p>
<p>As Flash 10.1 is currently accessible in beta. I thought it would be nice to have some tutorial to build applications targeting this new version of the player to take advantage of the new APIs (like multitouch for example). This tutorial will provide a generic solution to enable the creation of Flash 10.1 capable projects in both Flex Builder 3 and Flash Builder 4.</p>
<h4><strong>Step 0: Download the latest Flex SDK</strong></h4>
<p>This step is not mandatory and should not be necessary if you already have a Flash 10 capable Flex SDK. Still, keeping your SDK up to date is always a good thing and this tutorial might be a good opportunity to do it!</p>
<p>As the Flex 4 SDK was just released a few days ago, I recommend you download, install and use it for the rest of the tutorial.</p>
<p>In the rest of the tutorial, $SDK_DIR will designate the path to the Flex SDK you want to use (ie. "C:\Program Files\Adobe\Flash Builder 4\sdks\4.0.0" for example).</p>
<h4>Step 1: Download and install playerglobal.swc</h4>
<ul>
<li>Go to $SDK_DIR\frameworks\libs\player and create a new folder called "10.1"</li>
<li>Download the new <a href="http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_globalswc.zip" target="_self">Flash 10.1 capable playerglobals.swc library from Adobe Labs</a></li>
<li><a href="http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_globalswc.zip" target="_self"></a>Extract playerglobals.swc from the downloaded ZIP file to the new "10.1" directory you just created</li>
</ul>
<h4>Step 2 : Setup your Flash 10.1 project</h4>
<ul>
<li>Open Flash Builder 4</li>
<li>Create a new Flash/Flex project or open the project you want to setup</li>
<li>Open the properties of your project (right click on your project in the Package Explorer &gt; Properties)</li>
<li>If you are using Flash Builder 4, go to the "ActionScript compiler" panel and in the "Adobe Flash Player options" section, check "Use a specific version" and enter 10.1.0 as the version number</li>
</ul>
<p><a href="http://blog.promethe.net/wp-content/uploads/2010/03/flashbuilder4_flash10_1.png" rel="shadowbox[post-677];player=img;"><img class="aligncenter size-full wp-image-678" title="flashbuilder4_flash10_1" src="http://blog.promethe.net/wp-content/uploads/2010/03/flashbuilder4_flash10_1.png" alt="" width="617" height="243" /></a></p>
<ul>
<li>If you are using Flex Builder 3, go to the "Flex compiler" panel and in the "Additional compiler arguments" text input add "-target-player=10.1.0"</li>
<li>Click "OK"</li>
</ul>
<h4>Step 3 : Build your project</h4>
<p>Press F11 to build and run your project. Everything should work fine and you should now be able to use the new Flash 10.1 APIs!</p>
<p>You can now create as much projects as you want and you just have to do <strong>Step 2</strong> to make sure it will target Flash 10.1!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.promethe.net/2010/03/31/flash-10-1-with-flex-builder-3-or-flash-builder-4/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Frustum Culling in Flash 10</title>
		<link>http://blog.promethe.net/2009/12/13/frustum-culling-in-flash-10/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=frustum-culling-in-flash-10</link>
		<comments>http://blog.promethe.net/2009/12/13/frustum-culling-in-flash-10/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 15:43:05 +0000</pubDate>
		<dc:creator>Promethe</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[ActionScript 3.0]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[Flash 10]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.promethe.net/?p=558</guid>
		<description><![CDATA[Update: corrected a few glitches in the bounding sphere creation routine. Optimization is always important. But when it comes to 3D for the Flash Platform, it's an everyday battle. The first ideas that come to mind are to avoid: redrawing the same regions : each pixel value must be set once and only once rendering [...]]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color:#ff0000">Update:</span></strong> corrected a few glitches in the bounding sphere creation routine.</p>
<p>Optimization is always important. But when it comes to 3D for the Flash Platform, it's an everyday battle. The first ideas that come to mind are to avoid:</p>
<ol>
<li>redrawing the same regions : each pixel value must be set once and only once</li>
<li>rendering invisible objects : objects that are out of sight still take a lot of CPU horsepower</li>
</ol>
<p>While Flash takes care of the first one in its very renderer, the second one is not handled. But that is something we can easily address!</p>
<h4 style="text-align: left;">The Technic</h4>
<p>The method is called "frustum culling". The big picture is that every mesh is approximated using a bounding volume (typically a sphere or a box). If the bounding volume is visible, the corresponding mesh is rendered. The two following pictures show the frustum culling caught in action:</p>
<div id="attachment_569" class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.promethe.net/wp-content/uploads/2009/12/frustum_culling_scene.PNG" rel="shadowbox[post-558];player=img;"><img class="size-full wp-image-569" title="frustum_culling_scene" src="http://blog.promethe.net/wp-content/uploads/2009/12/frustum_culling_scene.PNG" alt="The mesh is visible" width="500" height="375" /></a><p class="wp-caption-text">The mesh is visible: TPS counter indicates 18900 triangles per seconds</p></div>
<div id="attachment_568" class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.promethe.net/wp-content/uploads/2009/12/frustum_culling_acting.PNG" rel="shadowbox[post-558];player=img;"><img class="size-full wp-image-568" title="frustum_culling_acting" src="http://blog.promethe.net/wp-content/uploads/2009/12/frustum_culling_acting.PNG" alt="Frustum culling in action (TPS counter indicates 0!)" width="500" height="375" /></a><p class="wp-caption-text">The mesh is out of sight: frustum culling is acting and TPS counter indicates 0!</p></div>
<p><span id="more-558"></span></p>
<h5>1. The frustum</h5>
<p>First things first: before performing frustum culling, you need to build the frustum! The frustum is the 3D shape that contains everything the camera can see. It's made of 6 planes and looks like a truncated pyramid:</p>
<div id="attachment_563" class="wp-caption aligncenter" style="width: 517px"><a href="http://blog.promethe.net/wp-content/uploads/2009/12/view_frustum.png" rel="shadowbox[post-558];player=img;"><img class="size-full wp-image-563" title="view_frustum" src="http://blog.promethe.net/wp-content/uploads/2009/12/view_frustum.png" alt="The view frustum" width="507" height="302" /></a><p class="wp-caption-text">The view frustum</p></div>
<p>Each plane is defined by a plane equation: ax + by + cz + d, where (a, b, c) is the normal of the plane and d the distance on that normal. The 6 planes must be extracted from one of the Matrix3D object used to define the transform from one space to another (world to camera for example). Here are the 6 plane equations:</p>
<ul>
<li>left: (a = m14 + m11, b = m24 + m21, c = m34 + m31, d = m44 + m41)</li>
<li>right: (a = m14 − m11, b = m24 − m21, c = m34 − m31, d = m44 − m41)</li>
<li>bottom: (a = m14 + m12, b = m24 + m22, c = m34 + m32, d = m44 + m42)</li>
<li>top: (a = m14 − m12, b = m24 − m22, c = m34 − m32, d = m44 − m42)</li>
<li>near: (a = m13, b = m23, c = m33, d = m43)</li>
<li>far: (a = m13, b = m23, c = m33, d = m43)</li>
</ul>
<p>The source matrix you chose defines the coordinates systems of the extracted planes:</p>
<ul>
<li>the projection matrix provides planes in view (or camera) space</li>
<li>the view * projection matrix provides planes in world space</li>
<li>the world * view * projection matrix provides planes in object (or local) space</li>
</ul>
<h5>2. Bounding volumes</h5>
<p>Testing every polygon against the frustum is a very expensive task. In order to speed things up, we will rather test a primitive shape that bounds the mesh: a "bounding volume". Common bounding volumes are spheres or boxes. I'll focus on the first one in the rest of the article.</p>
<p>A bounding sphere is pretty simple to implement: you just need to store the center of the sphere and it's radius. That being said, a BoundingSphere class would just contain the center as a Vector3D and the radius as a Number. When you have all the vertices of a mesh, building the bounding sphere is easy :</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> computeBoundingSphere<span style="color: #000000;">&#40;</span>myVertices <span style="color: #000000; font-weight: bold;">:</span> Vector.<span style="color: #000000; font-weight: bold;">&lt;</span>Number<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">:</span> BoundingSphere
<span style="color: #000000;">&#123;</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">min</span> <span style="color: #000000; font-weight: bold;">:</span> Vector3D = <span style="color: #0033ff; font-weight: bold;">new</span> Vector3D<span style="color: #000000;">&#40;</span><span style="color: #004993;">Number</span>.<span style="color: #004993;">MAX_VALUE</span>, <span style="color: #004993;">Number</span>.<span style="color: #004993;">MAX_VALUE</span>, <span style="color: #004993;">Number</span>.<span style="color: #004993;">MAX_VALUE</span><span style="color: #000000;">&#41;</span>;
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">max</span> <span style="color: #000000; font-weight: bold;">:</span> Vector3D = <span style="color: #0033ff; font-weight: bold;">new</span> Vector3D<span style="color: #000000;">&#40;</span><span style="color: #004993;">Number</span>.<span style="color: #004993;">MIN_VALUE</span>, <span style="color: #004993;">Number</span>.<span style="color: #004993;">MIN_VALUE</span>, <span style="color: #004993;">Number</span>.<span style="color: #004993;">MIN_VALUE</span><span style="color: #000000;">&#41;</span>;
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">length</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">int</span> = myVertices.<span style="color: #004993;">length</span>;
	<span style="color: #6699cc; font-weight: bold;">var</span> center <span style="color: #000000; font-weight: bold;">:</span> Vector3D = <span style="color: #0033ff; font-weight: bold;">null</span>;
	<span style="color: #6699cc; font-weight: bold;">var</span> radius <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">Number</span> = <span style="color: #0033ff; font-weight: bold;">null</span>;
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> i <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">uint</span> = <span style="color: #000000; font-weight:bold;">0</span>; i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #004993;">length</span>; i <span style="color: #000000; font-weight: bold;">+</span>= <span style="color: #000000; font-weight:bold;">3</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #004993;">min</span>.<span style="color: #004993;">x</span> = myVertices <span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #004993;">min</span>.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">?</span> myVertices<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">min</span>.<span style="color: #004993;">x</span>;
		<span style="color: #004993;">min</span>.<span style="color: #004993;">y</span> = myVertices <span style="color: #000000;">&#91;</span><span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #004993;">min</span>.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">?</span> myVertices<span style="color: #000000;">&#91;</span><span style="color: #004993;">int</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">min</span>.<span style="color: #004993;">y</span>;
		<span style="color: #004993;">min</span>.z = myVertices <span style="color: #000000;">&#91;</span><span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #004993;">min</span>.z <span style="color: #000000; font-weight: bold;">?</span> myVertices<span style="color: #000000;">&#91;</span><span style="color: #004993;">int</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">min</span>.z;
&nbsp;
 		<span style="color: #004993;">max</span>.<span style="color: #004993;">x</span> = myVertices <span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #004993;">max</span>.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">?</span> myVertices <span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">max</span>.<span style="color: #004993;">x</span>;
		<span style="color: #004993;">max</span>.<span style="color: #004993;">y</span> = myVertices <span style="color: #000000;">&#91;</span><span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #004993;">max</span>.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">?</span> myVertices<span style="color: #000000;">&#91;</span><span style="color: #004993;">int</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">max</span>.<span style="color: #004993;">y</span>;
		<span style="color: #004993;">max</span>.z = myVertices <span style="color: #000000;">&#91;</span><span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #004993;">max</span>.z <span style="color: #000000; font-weight: bold;">?</span> myVertices<span style="color: #000000;">&#91;</span><span style="color: #004993;">int</span><span style="color: #000000;">&#40;</span>i <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">max</span>.z;
	<span style="color: #000000;">&#125;</span>
&nbsp;
	center = <span style="color: #0033ff; font-weight: bold;">new</span> Vector3D<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>myMax.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">+</span> myMin.<span style="color: #004993;">x</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2.0</span>, <span style="color: #000000;">&#40;</span>myMax.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">+</span> myMin.<span style="color: #004993;">y</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2.0</span>, <span style="color: #000000;">&#40;</span>myMax.z <span style="color: #000000; font-weight: bold;">+</span> myMin.z<span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2.0</span><span style="color: #000000;">&#41;</span>;
        radius = <span style="color: #004993;">Math</span>.<span style="color: #004993;">max</span><span style="color: #000000;">&#40;</span>myMax.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">-</span> center.<span style="color: #004993;">x</span>, myMax.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">-</span> center.<span style="color: #004993;">y</span>, myMax.z <span style="color: #000000; font-weight: bold;">-</span> center.z,
		          center.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">-</span> myMin.<span style="color: #004993;">x</span>, center.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">-</span> myMin.<span style="color: #004993;">y</span>, center.z <span style="color: #000000; font-weight: bold;">-</span> myMin.z<span style="color: #000000;">&#41;</span>;	
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #0033ff; font-weight: bold;">new</span> BoundingSphere<span style="color: #000000;">&#40;</span>center, radius<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h5>3. Point to plane distance</h5>
<p>The plane equation (ax + by + cz + d) can be stored as a Vector3D object. Indeed, the Vector3D implements x, y and z but also a w Number attribute. This last one is supposed to store the homogenous coordinate. Nonetheless, we can use those 4 Number attributes to store the (a, b, c, d) values that defines our plane equation.</p>
<p>In order to test whether a bounding volume is inside or outside the frustum, we must be able to compute the distance of this object to the plane. To do so, we use the dot product of the point with the plane normal (which must be normalized first) :</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> planeToPointDistance<span style="color: #000000;">&#40;</span>myPlane <span style="color: #000000; font-weight: bold;">:</span> Vector3D, myPoint <span style="color: #000000; font-weight: bold;">:</span> Vector3D<span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">Number</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">return</span> myPlane.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">*</span> myPoint.<span style="color: #004993;">x</span> <span style="color: #000000; font-weight: bold;">+</span> myPlane.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">*</span> myPoint.<span style="color: #004993;">y</span> <span style="color: #000000; font-weight: bold;">+</span> myPlane.z <span style="color: #000000; font-weight: bold;">*</span> myPoint.z <span style="color: #000000; font-weight: bold;">+</span> myPlane.w;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h5>4. The test function</h5>
<p>Now that our frustum and our bounding volumes are ready, we can add this little test function that checks whether an object is visible or not:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> testBoundingSphere<span style="color: #000000;">&#40;</span>myPlanes      <span style="color: #000000; font-weight: bold;">:</span> Vector.,
                                   mySphere      <span style="color: #000000; font-weight: bold;">:</span> BoundingSphere<span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">Boolean</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">length</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">int</span> = myPlanes.<span style="color: #004993;">length</span>;
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> i <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">uint</span> = <span style="color: #000000; font-weight:bold;">0</span>; i <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #004993;">length</span>; <span style="color: #000000; font-weight: bold;">++</span>i<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">d</span> 	<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">Number</span> = planeToPointDistance<span style="color: #000000;">&#40;</span>myPlanes<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
		<span style="color: #009900;">// bouding sphere is out of the frustum</span>
		<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">d</span> <span style="color: #000000; font-weight: bold;">+</span> mySphere.radius <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0.0</span><span style="color: #000000;">&#41;</span>
			<span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #0033ff; font-weight: bold;">false</span>;
		<span style="color: #009900;">// bounding sphere is spanning</span>
		<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">d</span> <span style="color: #000000; font-weight: bold;">-</span> mySphere.radius <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000; font-weight:bold;">0.0</span><span style="color: #000000;">&#41;</span>
			<span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #0033ff; font-weight: bold;">true</span>;
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #009900;">// bounding sphere is inside the frustum</span>
	<span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #0033ff; font-weight: bold;">true</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h4>The Experiment</h4>
<p>The following experiment demonstrates frustum culling in action (click on the picture to open the application) :</p>
<div id="attachment_560" class="wp-caption aligncenter" style="width: 510px"><a rel="shadowbox[tekkaman];width=500;height=375]" href="http://blog.promethe.net/wp-content/uploads/2009/12/Tekkaman.swf"><img class="size-full wp-image-560" title="frustum_culling" src="http://blog.promethe.net/wp-content/uploads/2009/12/frustum_culling.png" alt="frustum_culling" width="500" height="375" /></a><p class="wp-caption-text">Frustum culling experiment (use the arrow keys to move)</p></div>
<p style="text-align: left;">Use the arrow keys to move the robot across the scene. You can notice the TPS counter drops down to zero whenever the character is out of sight (on the near left or near right side of the screen). When the TPS indicates 0, no triangles are rendered and CPU usage drops down to 0%. It actually means that the rest of the rendering process has a minimal overhead!</p>
<h4>And it's even more awesome...</h4>
<p style="text-align: left;">This experiment also introduce my brand new mini-debugger inspired of <a href="http://mrdoob.com/80/Stats">Mr. Doob's work</a>. I replaced the maximum memory footprint counter with a per-second rendered triangles counter (or TPS counter). CPU usage or framerate alone are not absolute measurements but the TPS counter reflects the true performance of the application the old fashioned way: the more polygons per second the better. I also updated the timer to display the processing time and the overall rendering time.</p>
<p style="text-align: left;">You can compare this experiment to the <a href="http://blog.promethe.net/2009/10/07/quake-2-3d-models-in-flash-10/">"old" one I made up a few weeks ago</a>: the displayed 3D model features 30% more polygons but the CPU usage is the same.</p>
<p style="text-align: left;">The rendering process is done in such a way that absolutely no computation occurs on invisible objects, not even the slightest animation or z-sorting operation.</p>
<p style="text-align: left;">I enabled dynamic bounding volumes for animated meshes: if you place the mesh on the edges of the viewing space, you might notice that the TPS counter sometimes goes down to zero to raise up again to a few hundreds/thousands of triangles per second. The explanation is simple: the visibility test is done dynamically and follows the mesh animations. If the animation drives the mesh out of the viewing frustum, culling operates and it is not renderered.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.promethe.net/2009/12/13/frustum-culling-in-flash-10/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
