<?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>Devirtuoso &#187; Experimental</title>
	<atom:link href="http://www.devirtuoso.com/category/experimental/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.devirtuoso.com</link>
	<description>Web Development Wickedness</description>
	<lastBuildDate>Sat, 20 Mar 2010 16:35:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google Sphere</title>
		<link>http://www.devirtuoso.com/2009/09/google-sphere/</link>
		<comments>http://www.devirtuoso.com/2009/09/google-sphere/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 01:29:51 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Front End Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[showcase]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1174</guid>
		<description><![CDATA[Once again Google is broken in this fantastic experiment.  From the maker of Google Gravity, this experiment takes Google and forms it into a sphere.

Google Sphere

I love Mr.doob’s work.  Big points for creativity. The best part about it is that the image search still works.
Again this one requires Chrome to view it, he uses the [...]]]></description>
			<content:encoded><![CDATA[<p>Once again Google is broken in this fantastic experiment.  From the maker of <a title="Google Gravity" href="http://www.devirtuoso.com/2009/08/google-gravity/" target="_self">Google Gravity</a>, this experiment takes Google and forms it into a sphere.</p>
<p><span id="more-1174"></span></p>
<h3><a title="Google Sphere" href="http://mrdoob.com/projects/chromeexperiments/google_sphere/" target="_blank">Google Sphere</a></h3>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/ttQuzEEsHhg&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/ttQuzEEsHhg&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;feature=player_embedded&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>I love Mr.doob’s work.  Big points for creativity. The best part about it is that the image search still works.</p>
<p>Again this one requires Chrome to view it, he uses the webkit to transform his Actionscript 3 3d engine into JavaScript.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/09/google-sphere/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3D Sphere Using jQuery</title>
		<link>http://www.devirtuoso.com/2009/09/3d-sphere-using-jquery/</link>
		<comments>http://www.devirtuoso.com/2009/09/3d-sphere-using-jquery/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 17:53:35 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Front End Development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1166</guid>
		<description><![CDATA[Ever wanted your tag cloud to resemble a ball?&#160; Of course you did.&#160; This tutorial will walk you through how to create a Sphere in jQuery.

&#160;
What We Are Building
This one can bog down a system in a hurry, but that’s the fun with experimenting with JavaScript.&#160; We will be building a sphere that rotates depending [...]]]></description>
			<content:encoded><![CDATA[<p>Ever wanted your tag cloud to resemble a ball?&#160; Of course you did.&#160; This tutorial will walk you through how to create a Sphere in jQuery.</p>
<p><span id="more-1166"></span></p>
<p>&#160;</p>
<h2>What We Are Building</h2>
<p>This one can bog down a system in a hurry, but that’s the fun with experimenting with JavaScript.&#160; We will be building a sphere that rotates depending on which way the mouse moves….exciting.</p>
<div class="resources">
	 <a href="http://www.devirtuoso.com/Examples/3D-Engine/sphere.zip"class="Download" target="_blank">Download</a>  <a href="http://www.devirtuoso.com/Examples/3D-Engine/sphere.html"class="Example" target="_blank">Example</a>
</div>
<p><a title="3d sphere" href="http://www.devirtuoso.com/Examples/3D-Engine/sphere.html" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sphere" border="0" alt="sphere" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image38.png" width="419" height="420" /></a> </p>
<p>&#160;</p>
<h2>Getting Started</h2>
<p>This tutorial is a continuation of a line of 3D jQuery posts.&#160; I would recommend you having a look at the previous post so you’re up to speed.</p>
<ul>
<li><a title="Making a 3D Engine in jQuery" href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank">Making a 3D Engine in jQuery</a> </li>
<li><a title="3D Plane for jQuery Engine" href="http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/" target="_blank">3D Plane for jQuery Engine</a> </li>
<li><a title="Creating a Wobbling 3D Carousel" href="http://www.devirtuoso.com/2009/09/creating-a-wobbling-3d-carousel/" target="_blank">Creating a Wobbling 3D Carousel</a> </li>
</ul>
<p>Now that is out of the way lets get started.&#160; For this project we’ll have 3 files.&#160; </p>
<ul>
<li>3DEngine.js</li>
<li>Sphere.js</li>
<li>sphere.html</li>
</ul>
<p>The 3DEngine.js is the same file that was in the previous posts so we won’t be covering that. The Sphere.js holds the Sphere class which is used by the 3D Engine.&#160; Lastly the html file puts everything together.</p>
<p>&#160;</p>
<h2>The Sphere</h2>
<p>With the sphere class we’ll be creating a set of 3d points (x,y,z) in an array.&#160; To build the sphere we’re simply going to create a whole bunch of rings that start off small, get larger, then small again.&#160; I’m not sure if this the best way of building a sphere, but it works so I’m not going to worry too much.</p>
<p>Here is the <strong>JavaScript</strong>:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Sphere <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>radius<span class="sy0">,</span>sides<span class="sy0">,</span> numOfItems<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Step through the number of rings.</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> j <span class="sy0">=</span> sides <span class="sy0">;</span> j <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> j<span class="sy0">--</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Step through each point on a ring.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> numOfItems <span class="sy0">/</span> sides<span class="sy0">;</span> i <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">--</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Space out each point evenly.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angle <span class="sy0">=</span> i <span class="sy0">*</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> <span class="nu0">2</span> <span class="sy0">/</span> <span class="br0">&#40;</span>numOfItems<span class="sy0">/</span>sides<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angleB <span class="sy0">=</span> j <span class="sy0">*</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> <span class="nu0">2</span> <span class="sy0">/</span> sides<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Figure out the x,y,z co-ordinates of each point.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> x <span class="sy0">=</span> &nbsp; Math.<span class="me1">sin</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>angleB<span class="br0">&#41;</span><span class="sy0">*</span>radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> y <span class="sy0">=</span> &nbsp;Math.<span class="me1">cos</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>angleB<span class="br0">&#41;</span><span class="sy0">*</span>radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> z <span class="sy0">=</span> &nbsp;Math.<span class="me1">cos</span><span class="br0">&#40;</span>angleB<span class="br0">&#41;</span><span class="sy0">*</span> radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Put the point in an array.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span>.<span class="me1">push</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Need to extend class to work in 3d engine.</span><br />
Sphere.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>There are two loops.&#160; One for the number of rings, the other for the points within each ring.&#160; Inside the inner loop we first figure out where each point should lie, then figure out how that would translate into the x, y and z co-ordinates.</p>
<p>&#160;</p>
<h2>The jQuery / Html</h2>
<p>Not much has changed in our jQuery / HTML since the <a title="3d Plane" href="http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/" target="_blank">3d Plane</a> post.&#160; The only thing that has changed is we imported the Sphere.js and instead of adding a plane, we’re adding a sphere.</p>
<p>Here is the <strong>HTML</strong>:</p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
<br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;3DEngine.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;Sphere.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp; &nbsp; //<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; $<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.ready<span class="br0">&#40;</span>function<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Init Camera</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var camera <span class="sy0">=</span> new Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; camera.init<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">300</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var container <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Create <span class="kw3">object</span> holder</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var item <span class="sy0">=</span> new Object3D<span class="br0">&#40;</span>container<span class="br0">&#41;</span>;</span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Add sphere to the <span class="kw3">object</span> holder</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; item.addChild<span class="br0">&#40;</span>new Sphere<span class="br0">&#40;</span><span class="nu0">200</span>,<span class="nu0">10</span>,<span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Create scene</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var scene <span class="sy0">=</span> new Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Add <span class="kw3">object</span> holder to the scene</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; scene.addToScene<span class="br0">&#40;</span>item<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var mouseX,mouseY <span class="sy0">=</span> <span class="nu0">0</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var offsetX <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.left;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var offsetY <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.top;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var speed <span class="sy0">=</span> <span class="nu0">6000</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Figure out where the mouse is when the mouse is moved.</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="br0">&#41;</span>.mousemove<span class="br0">&#40;</span>function<span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseX <span class="sy0">=</span> e.clientX - offsetX - <span class="br0">&#40;</span>container.<span class="kw3">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseY <span class="sy0">=</span> e.clientY - offsetY - <span class="br0">&#40;</span>container.<span class="kw3">height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var animateIt <span class="sy0">=</span> function<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>rotate the sphere along the y <span class="kw3">axis</span> when the mouse</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>mouse is moved left and right</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseX !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.y +<span class="sy0">=</span> <span class="br0">&#40;</span>mouseX<span class="br0">&#41;</span> <span class="sy0">/</span> speed</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>rotate along the x <span class="kw3">axis</span> when the mouse is moved</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>up and down.</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseY !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.x -<span class="sy0">=</span> mouseY <span class="sy0">/</span> speed;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span>Render the scene.</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scene.renderCamera<span class="br0">&#40;</span>camera<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; setInterval<span class="br0">&#40;</span>animateIt, <span class="nu0">20</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; <span class="sy0">//</span><span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<h2>Disclaimer</h2>
<p>Be careful adding points on this one.&#160; Because the 3D engine doesn’t use html’s canvas just yet, it really can’t handle too many points. I can get away with 100 points on my machine without too much delay.&#160; Chrome handles it the best out of all the browsers I tried.&#160; So use it at your own discretion, you might have some angry viewers if you go too nuts.&#160; This is just meant to be experimental…and cool.</p>
<p>The next step will be to optimize the 3D Engine a bit using the canvas so there won’t be this problem in the future.</p>
<p>&#160;</p>
<p>Here is all the code together:</p>
<p><strong>JavaScript</strong></p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Sphere <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>radius<span class="sy0">,</span>sides<span class="sy0">,</span> numOfItems<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> j <span class="sy0">=</span> sides <span class="sy0">;</span> j <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> j<span class="sy0">--</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> numOfItems <span class="sy0">/</span> sides<span class="sy0">;</span> i <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">--</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angle <span class="sy0">=</span> i <span class="sy0">*</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> <span class="nu0">2</span> <span class="sy0">/</span> <span class="br0">&#40;</span>numOfItems<span class="sy0">/</span>sides<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angleB <span class="sy0">=</span> j <span class="sy0">*</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> <span class="nu0">2</span> <span class="sy0">/</span> sides<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> x <span class="sy0">=</span> &nbsp; Math.<span class="me1">sin</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>angleB<span class="br0">&#41;</span><span class="sy0">*</span>radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> y <span class="sy0">=</span> &nbsp;Math.<span class="me1">cos</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>angleB<span class="br0">&#41;</span><span class="sy0">*</span>radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> z <span class="sy0">=</span> &nbsp;Math.<span class="me1">cos</span><span class="br0">&#40;</span>angleB<span class="br0">&#41;</span><span class="sy0">*</span> radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span>.<span class="me1">push</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Sphere.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p><strong>HTML</strong></p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span>3d engine<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">&quot;screen&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #item{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin:0 auto;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; top:300px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; position: relative;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ul{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list-style-type: none;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background-color: #111;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: #69c;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-family: Arial, &quot;MS Trebuchet&quot;, sans-serif;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-weight: bold;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-size:2em;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;3DEngine.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;Sphere.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; //<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.ready<span class="br0">&#40;</span>function<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var camera <span class="sy0">=</span> new Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; camera.init<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">300</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var container <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var item <span class="sy0">=</span> new Object3D<span class="br0">&#40;</span>container<span class="br0">&#41;</span>;</span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.addChild<span class="br0">&#40;</span>new Sphere<span class="br0">&#40;</span><span class="nu0">200</span>,<span class="nu0">10</span>,<span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var scene <span class="sy0">=</span> new Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scene.addToScene<span class="br0">&#40;</span>item<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var mouseX,mouseY <span class="sy0">=</span> <span class="nu0">0</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var offsetX <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.left;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var offsetY <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.top;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var speed <span class="sy0">=</span> <span class="nu0">6000</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="br0">&#41;</span>.mousemove<span class="br0">&#40;</span>function<span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseX <span class="sy0">=</span> e.clientX - offsetX - <span class="br0">&#40;</span>container.<span class="kw3">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseY <span class="sy0">=</span> e.clientY - offsetY - <span class="br0">&#40;</span>container.<span class="kw3">height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var animateIt <span class="sy0">=</span> function<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseX !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.y +<span class="sy0">=</span> <span class="br0">&#40;</span>mouseX<span class="br0">&#41;</span> <span class="sy0">/</span> speed</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseY !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.x -<span class="sy0">=</span> mouseY <span class="sy0">/</span> speed;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scene.renderCamera<span class="br0">&#40;</span>camera<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setInterval<span class="br0">&#40;</span>animateIt, <span class="nu0">20</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span><span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<div class="resources">
	 <a href="http://www.devirtuoso.com/Examples/3D-Engine/sphere.zip"class="Download" target="_blank">Download</a>  <a href="http://www.devirtuoso.com/Examples/3D-Engine/sphere.html"class="Example" target="_blank">Example</a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/09/3d-sphere-using-jquery/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Creating a Wobbling 3D Carousel</title>
		<link>http://www.devirtuoso.com/2009/09/creating-a-wobbling-3d-carousel/</link>
		<comments>http://www.devirtuoso.com/2009/09/creating-a-wobbling-3d-carousel/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 07:07:33 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Front End Development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[carousel]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1151</guid>
		<description><![CDATA[We’ve all seen a carousel in one form or another.&#160; This post will show how to create a carousel with a wobbling effect, much like an unbalanced wheel.

&#160;
What We’re Building
We’ll be creating a carousel with the help of the 3d Engine we built in a previous post.&#160; The idea is we’ll create a ring by [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve all seen a carousel in one form or another.&#160; This post will show how to create a carousel with a wobbling effect, much like an unbalanced wheel.</p>
<p><span id="more-1151"></span></p>
<p>&#160;</p>
<h2>What We’re Building</h2>
<p>We’ll be creating a carousel with the help of the <a title="3d engine jquery" href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank">3d Engine</a> we built in a previous post.&#160; The idea is we’ll create a ring by plotting points in 3d space, then we’ll rotate it so it’s almost perpendicular to the viewer.&#160; Because it’s not 100% flat, it will look like it’s wobbling up and down, giving your carousel a little more flavor.</p>
<div class="resources"> <a href="http://www.devirtuoso.com/Examples/3D-Engine/ring.zip" class="Download" target="_blank">Download</a>  <a href="http://www.devirtuoso.com/Examples/3D-Engine/ring.html"class="Example" target="_blank">Example</a></div>
<p><a href="http://www.devirtuoso.com/Examples/3D-Engine/ring.html" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="carousel" border="0" alt="carousel" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image37.png" width="445" height="146" /></a></p>
<p>&#160;</p>
<h2>Building the Ring</h2>
<p>If you haven’t read up on the  <a href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank">3d Engine</a> just yet I recommend you do so.&#160; Creating objects for the engine isn’t overly complicated.&#160; It’s just an array of 3d points.&#160; With the ring, we’re going to use math to plot the points for us.&#160; We’re going to be creating a circle and plot it in 3d space.</p>
<p>Here is the <strong>JavaScript</strong>: (Ring.js)</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Ring <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>radius<span class="sy0">,</span> numOfItems<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//Step through each point on ring.</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> numOfItems <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> i <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">--</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Figure out where each point lies on the circle</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angle <span class="sy0">=</span> i <span class="sy0">*</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> <span class="nu0">2</span> <span class="sy0">/</span> numOfItems<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Translate that point on the circle into x,y coordinates.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> x <span class="sy0">=</span> &nbsp;Math.<span class="me1">sin</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> y <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> z <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Add the point to the array.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span>.<span class="me1">push</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//You need to inherit the DisplayObject3D.</span><br />
Ring.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>The Ring class takes 2 parameters, the first is the radius of the ring, and the second is how many items are going to be on the ring.</p>
<p>We then proceed to step through all the points, and place them at equal distances around the ring.</p>
<p>&#160;</p>
<h2>The HTML </h2>
<p>There isn’t much too the html.&#160; We’re simply going to create a &lt;ul&gt; with a bunch of words in it.</p>
<p>Here is the <strong>HTML</strong>:</p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>website<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>jQuery<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>JavaScript<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>HTML<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>PHP<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>3D<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Ajax<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>CSS<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Design<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Flash<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Experimental<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Development<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>web<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Tutorial<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>ASP<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>&#160;</p>
<h2>The jQuery</h2>
<p>There is not much changed from our previous post on <a title="how to create a 3d plane for jQuery 3D Engine" href="http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/" target="_blank">how to create a 3d plane for jQuery 3D Engine</a>.&#160; The only difference here is we’re going to give an initial value to the axisRotation x value.&#160; This will rotate the ring towards the viewer.&#160; Through trial and error I figured out the value that worked for me.</p>
<p>Then we’ll animate the axisRotation y value when the mouse moves left and right.</p>
<p>Here is the <strong>jQuery</strong>:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">ready</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<br />
<span class="co1">//setup camera.</span><br />
<span class="kw2">var</span> camera <span class="sy0">=</span> <span class="kw2">new</span> Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
camera.<span class="me1">init</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">300</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">var</span> container <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Setup 3d object holder.</span><br />
<span class="kw2">var</span> <span class="kw1">item</span> <span class="sy0">=</span> <span class="kw2">new</span> Object3D<span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Add ring to 3d object holder.</span><br />
<span class="co1">//The first argument for the ring is the radius.</span><br />
<span class="co1">//The second argument for the ring is how many items</span><br />
<span class="co1">//are on the ring. &nbsp;So we pass in how many items are in our list.</span><br />
<span class="kw1">item</span>.<span class="me1">addChild</span><span class="br0">&#40;</span><span class="kw2">new</span> Ring<span class="br0">&#40;</span><span class="nu0">200</span><span class="sy0">,</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item ul li&quot;</span><span class="br0">&#41;</span>.<span class="me1">length</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="co1">//Create a scene.</span><br />
<span class="kw2">var</span> scene <span class="sy0">=</span> <span class="kw2">new</span> Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Add 3d object holder to the scene.</span><br />
scene.<span class="me1">addToScene</span><span class="br0">&#40;</span><span class="kw1">item</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="kw2">var</span> mouseX<span class="sy0">,</span>mouseY <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="kw2">var</span> offsetX <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.<span class="me1">offset</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">left</span><span class="sy0">;</span><br />
<span class="kw2">var</span> offsetY <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.<span class="me1">offset</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">top</span><span class="sy0">;</span><br />
<span class="kw2">var</span> speed <span class="sy0">=</span> <span class="nu0">6000</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Capturing mouse movements.</span><br />
$<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">mousemove</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; mouseX <span class="sy0">=</span> e.<span class="me1">clientX</span> <span class="sy0">-</span> offsetX <span class="sy0">-</span> <span class="br0">&#40;</span>container.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; mouseY <span class="sy0">=</span> e.<span class="me1">clientY</span> <span class="sy0">-</span> offsetY <span class="sy0">-</span> <span class="br0">&#40;</span>container.<span class="me1">height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Rotate ring so it's almost perpendicular to the viewer.</span><br />
axisRotation.<span class="me1">x</span> <span class="sy0">=</span> <span class="nu0">1.5</span><span class="sy0">;</span><br />
<br />
<span class="kw2">var</span> animateIt <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mouseX <span class="sy0">!=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//When the user moves the mouse left and right,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//rotate around the ring on the y axis.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; axisRotation.<span class="me1">y</span> <span class="sy0">+=</span> <span class="br0">&#40;</span>mouseX<span class="br0">&#41;</span> <span class="sy0">/</span> speed<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; scene.<span class="me1">renderCamera</span><span class="br0">&#40;</span>camera<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<br />
setInterval<span class="br0">&#40;</span>animateIt<span class="sy0">,</span> <span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<h2>Voila!</h2>
<p>That’s all there is too it.&#160; </p>
<p>Here is all the code together:</p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span>3d engine<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">&quot;screen&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; #item{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin:0 auto;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; top:300px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; position: relative;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; ul{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list-style-type: none;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; body{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background-color: #111;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: #69c;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-family: Arial, &quot;MS Trebuchet&quot;, sans-serif;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-weight: bold;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-size:1em;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>website<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>jQuery<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>JavaScript<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>HTML<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>PHP<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>3D<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Ajax<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>CSS<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Design<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Flash<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Experimental<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Development<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>web<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>Tutorial<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>ASP<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
<br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;3DEngine.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;Ring.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp; &nbsp; //<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; $<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.ready<span class="br0">&#40;</span>function<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var camera <span class="sy0">=</span> new Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; camera.init<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">300</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var container <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var item <span class="sy0">=</span> new Object3D<span class="br0">&#40;</span>container<span class="br0">&#41;</span>;</span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; item.addChild<span class="br0">&#40;</span>new Ring<span class="br0">&#40;</span><span class="nu0">200</span>, $<span class="br0">&#40;</span><span class="st0">&quot;#item ul li&quot;</span><span class="br0">&#41;</span>.length<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var scene <span class="sy0">=</span> new Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; scene.addToScene<span class="br0">&#40;</span>item<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var mouseX,mouseY <span class="sy0">=</span> <span class="nu0">0</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var offsetX <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.left;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var offsetY <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.top;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var speed <span class="sy0">=</span> <span class="nu0">6000</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="br0">&#41;</span>.mousemove<span class="br0">&#40;</span>function<span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseX <span class="sy0">=</span> e.clientX - offsetX - <span class="br0">&#40;</span>container.<span class="kw3">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mouseY <span class="sy0">=</span> e.clientY - offsetY - <span class="br0">&#40;</span>container.<span class="kw3">height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; axisRotation.x <span class="sy0">=</span> <span class="nu0">1.5</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; var animateIt <span class="sy0">=</span> function<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseX !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.y +<span class="sy0">=</span> <span class="br0">&#40;</span>mouseX<span class="br0">&#41;</span> <span class="sy0">/</span> speed;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scene.renderCamera<span class="br0">&#40;</span>camera<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; setInterval<span class="br0">&#40;</span>animateIt, <span class="nu0">20</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; <span class="sy0">//</span><span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>Ring.js:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Ring <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>radius<span class="sy0">,</span> numOfItems<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> numOfItems <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> i <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">--</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> angle <span class="sy0">=</span> i <span class="sy0">*</span> Math.<span class="me1">PI</span> <span class="sy0">*</span> <span class="nu0">2</span> <span class="sy0">/</span> numOfItems<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> x <span class="sy0">=</span> &nbsp;Math.<span class="me1">sin</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> y <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>angle<span class="br0">&#41;</span> <span class="sy0">*</span> radius<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> z <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span>.<span class="me1">push</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Ring.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>Just a small tip. If you wanted to create a carousel that doesn’t wobble, your first instinct might be to adjust the axisRotation x value until you get it.&#160; You can do it this way, it just might take a bit to get it right on the money.&#160; The easier way is to adjust the Ring.js file, and switch the y and z values.&#160; This will create a totally flat ring and you don’t have to worry about using the axisRotation x value to try and flatten it out.</p>
<p>&#160;</p>
<div class="resources"> <a href="http://www.devirtuoso.com/Examples/3D-Engine/ring.zip" class="Download" target="_blank">Download</a>  <a href="http://www.devirtuoso.com/Examples/3D-Engine/ring.html"class="Example" target="_blank">Example</a></div>
<p>&#160;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/09/creating-a-wobbling-3d-carousel/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>3D Plane for jQuery 3D Engine</title>
		<link>http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/</link>
		<comments>http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 18:11:23 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Front End Development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1142</guid>
		<description><![CDATA[In the last post we created a 3D Engine with jQuery.&#160; This time around we’re going to make a new shape and make it interact with the mouse.

&#160;
What We’re Making
I decided not to tackle too tough a shape as I wanted to show how to interact with the mouse.&#160; We’ll be making a plane that [...]]]></description>
			<content:encoded><![CDATA[<p>In the last post we created a <a title="3D Engine with jQuery" href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank">3D Engine with jQuery</a>.&#160; This time around we’re going to make a new shape and make it interact with the mouse.</p>
<p><span id="more-1142"></span></p>
<p>&#160;</p>
<h2>What We’re Making</h2>
<p>I decided not to tackle too tough a shape as I wanted to show how to interact with the mouse.&#160; We’ll be making a plane that rotates the further you get from the center.</p>
<div class="resources"> <a href="http://www.devirtuoso.com/Examples/3D-Engine/plane.zip" class="Download" target="_blank">Download</a>  <a href="http://www.devirtuoso.com/Examples/3D-Engine/plane.html"class="Example" target="_blank">Example</a></div>
</p>
<p><a title="Plane 3D" href="http://www.devirtuoso.com/Examples/3D-Engine/plane.html" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="plane rotating" border="0" alt="plane rotating" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image33.png" width="370" height="370" /></a> </p>
<p>&#160;</p>
<h2>Getting Started</h2>
<p>If you haven’t seen how the 3D engine works I recommend visiting <a title="Making a 3D Engine in jQuery" href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank">Making a 3D Engine in jQuery</a> and getting caught up.&#160; The first thing we’re going to tackle is the plane.&#160; We’re going to create a JavaScript file that we’ll import into our HTML file. The code isn’t too complicated.&#160; We’re creating an array of 3d points.&#160; </p>
<p>Lets look at the code.</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Plane <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>size<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>size <span class="sy0">===</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; size <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span> <span class="sy0">=</span> <span class="br0">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Plane.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>It’s pretty much the same as the Cube in the previous post.&#160; The only difference is it’s less points.&#160; This would be a good opportunity to walk you through how each point is placed.&#160; The Plane class has 1 argument.&#160; The size of the Plane.&#160; We’ll use this size to plot our points.&#160; Let’s look at the first point. (-size,size,0)&#160; So if we pass in a size of 100, then the 3d point would be (-100,100,0) Which puts a point 100 points to the left and 100 up.&#160; The z value is at zero because it’s a plane.&#160; All the points are going to sit line up along the z axis.&#160; The next point is (100,100,0). This is the top right point.&#160; (100,-100,0) is bottom left. Lastly (-100,-100,0)&#160; is bottom right.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="points" border="0" alt="points" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image34.png" width="370" height="370" /> </p>
<p>&#160;</p>
<h2>Mouse Interaction</h2>
<p>Now that we have our plane made, we’ll just import it into our html file.&#160; Just like our previous post we’ll have to create our Camera,Object holder, Object and Scene. Now we’ll tackle having it interact with the mouse.</p>
<p>Here is the new jQuery:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">//Mouse x and y </span><br />
<span class="kw2">var</span> mouseX<span class="sy0">,</span>mouseY <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<br />
<span class="co1">//x and y value of container</span><br />
<span class="kw2">var</span> offsetX <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.<span class="me1">offset</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">left</span><span class="sy0">;</span><br />
<span class="kw2">var</span> offsetY <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.<span class="me1">offset</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">top</span><span class="sy0">;</span><br />
<br />
<span class="co1">//rotation speed</span><br />
<span class="kw2">var</span> speed <span class="sy0">=</span> <span class="nu0">6000</span><span class="sy0">;</span><br />
<br />
<span class="co1">//when the mouse moves...</span><br />
$<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">mousemove</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Figure out how far it is from the center of the container</span><br />
&nbsp; &nbsp; mouseX <span class="sy0">=</span> e.<span class="me1">clientX</span> <span class="sy0">-</span> offsetX <span class="sy0">-</span> <span class="br0">&#40;</span>container.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; mouseY <span class="sy0">=</span> e.<span class="me1">clientY</span> <span class="sy0">-</span> offsetY <span class="sy0">-</span> <span class="br0">&#40;</span>container.<span class="me1">height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="kw2">var</span> animateIt <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Rotate along the y axis when the mouse is moved left and right</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mouseX <span class="sy0">!=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; axisRotation.<span class="me1">y</span> <span class="sy0">+=</span> <span class="br0">&#40;</span>mouseX<span class="br0">&#41;</span> <span class="sy0">/</span> speed<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Rotate along the x axis when the mouse moves up and down.</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mouseY <span class="sy0">!=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; axisRotation.<span class="me1">x</span> <span class="sy0">-=</span> mouseY <span class="sy0">/</span> speed<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Render the scene.</span><br />
&nbsp; &nbsp; scene.<span class="me1">renderCamera</span><span class="br0">&#40;</span>camera<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//keep calling function every 20 milliseconds.</span><br />
setInterval<span class="br0">&#40;</span>animateIt<span class="sy0">,</span> <span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="code explained" border="0" alt="code explained" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image35.png" width="420" height="420" /> </p>
<p> Anytime the mouse moved we would figure out how far the mouse is from the center of the object.&#160; Then we assign it to variables that will be used in a function that is called at set intervals.&#160; In that function we simply divide the mouse value by a speed variable and apply it to the axisRotation.&#160; You can adjust the sensitivity of the mouse by increasing or decreasing the speed value.&#160; You might be wondering why we’re applying the mouseX to the y value of axisRotation.&#160; This is because we want to control rotating on the y axis with our mouse moving left and right.&#160; Kind of like opening and closing a door.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="axis" border="0" alt="axis" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image36.png" width="420" height="420" /> </p>
<p>&#160;</p>
<p>Here is the code all together:</p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span>3d engine<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">&quot;screen&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; #item{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin:0 auto;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; top:300px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; position: relative;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; ul{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list-style-type: none;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; body{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background-color: #111;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: #69c;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-family: Arial, &quot;MS Trebuchet&quot;, sans-serif;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-weight: bold;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-size:2em;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
<br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;3DEngine.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;Plane.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp; &nbsp; //<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.ready<span class="br0">&#40;</span>function<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<br />
<span class="sc2">&nbsp; &nbsp; var camera <span class="sy0">=</span> new Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; camera.init<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">300</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; var container <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span></span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; var item <span class="sy0">=</span> new Object3D<span class="br0">&#40;</span>container<span class="br0">&#41;</span>;</span><br />
<br />
<span class="sc2">&nbsp; &nbsp; item.addChild<span class="br0">&#40;</span>new Plane<span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; var scene <span class="sy0">=</span> new Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; scene.addToScene<span class="br0">&#40;</span>item<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; var mouseX,mouseY <span class="sy0">=</span> <span class="nu0">0</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; var offsetX <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.left;</span><br />
<span class="sc2">&nbsp; &nbsp; var offsetY <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span>.offset<span class="br0">&#40;</span><span class="br0">&#41;</span>.top;</span><br />
<span class="sc2">&nbsp; &nbsp; var speed <span class="sy0">=</span> <span class="nu0">6000</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="br0">&#41;</span>.mousemove<span class="br0">&#40;</span>function<span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; mouseX <span class="sy0">=</span> e.clientX - offsetX - <span class="br0">&#40;</span>container.<span class="kw3">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; mouseY <span class="sy0">=</span> e.clientY - offsetY - <span class="br0">&#40;</span>container.<span class="kw3">height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">/</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; var animateIt <span class="sy0">=</span> function<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseX !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.y +<span class="sy0">=</span> <span class="br0">&#40;</span>mouseX<span class="br0">&#41;</span> <span class="sy0">/</span> speed</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>mouseY !<span class="sy0">=</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.x -<span class="sy0">=</span> mouseY <span class="sy0">/</span> speed;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; scene.renderCamera<span class="br0">&#40;</span>camera<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; <span class="br0">&#125;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; setInterval<span class="br0">&#40;</span>animateIt, <span class="nu0">20</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; <span class="sy0">//</span><span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<h2>Next Step</h2>
<p>Now that the mouse Interaction is taken care of.&#160; The next shape I’m going to take a stab at is the ring.&#160; Stay tuned for more 3D shapes.</p>
<p>&#160;</p>
<div class="resources"> <a href="http://www.devirtuoso.com/Examples/3D-Engine/plane.zip" class="Download" target="_blank">Download</a>  <a href="http://www.devirtuoso.com/Examples/3D-Engine/plane.html"class="Example" target="_blank">Example</a></div>
<p>&#160;</p>
<h3>Related</h3>
<p> <a href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank">3D Engine</a><br />
  <a href="http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/" target="_blank"><img src="http://www.devirtuoso.com/wp-content/uploads/2009/09/3D-Engine.jpg" alt="" title="" width="100" height="100" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Making a 3D Engine in jQuery</title>
		<link>http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/</link>
		<comments>http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 14:48:49 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Front End Development]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1124</guid>
		<description><![CDATA[
	In the previous post &#8220;3D tag cloud&#8221; I received quite a few requests for different shapes besides the ring.
	The problem is how the tag cloud was created it doesn&#8217;t lend itself to different shapes very well. So
	this post will show how to create a 3D engine in jQuery / JavaScript for those more exciting shapes.


&#160;
What [...]]]></description>
			<content:encoded><![CDATA[<p>
	In the previous post &#8220;<a href="http://www.devirtuoso.com/2009/08/how-to-create-a-3d-tag-cloud-in-jquery/" target="_blank">3D tag cloud</a>&#8221; I received quite a few requests for different shapes besides the ring.<br />
	The problem is how the tag cloud was created it doesn&#8217;t lend itself to different shapes very well. So<br />
	this post will show how to create a 3D engine in jQuery / JavaScript for those more exciting shapes.
</p>
<p><span id="more-1124"></span></p>
<p>&#160;</p>
<h2>What We&#8217;re Building</h2>
<p>We&#8217;re going to create a 3D engine that will allow us to create shapes simply by creating an array of points. This engine will have a Camera, a Scene and an Object. It&#8217;ll work pretty well the same as in real life. The closer the camera is to the object the larger it gets. This won&#8217;t be a complete rendering engine, as this won&#8217;t render multiple objects at this point.</p>
<div class="resources"><a class="Download" href="http://www.devirtuoso.com/Examples/3D-Engine/example.zip" target="_blank">Download</a> <a class="Example" href="http://www.devirtuoso.com/Examples/3D-Engine/" target="_blank">Example</a></div>
<p>&#160;<a href="http://www.devirtuoso.com/Examples/3D-Engine/" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Cube" border="0" alt="cube 3d" src="http://www.devirtuoso.com/wp-content/uploads/2009/09/image_thumb1.png" width="431" height="449" /></a> </p>
<p>&#160;</p>
<h2>Display Object</h2>
<p>The Display Object is more or less a way to give each object a set of properties and methods. Say I wanted to create a cube, it would first have to inherit the DisplayObject3D class for it to work. It gives the object the tools it needs to get the job done. Kind of like a tool box for a handy man.</p>
<p>Here is the JavaScript Class:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> DisplayObject3D <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
DisplayObject3D.<span class="me1">prototype</span>._x <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
DisplayObject3D.<span class="me1">prototype</span>._y <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Create 3d Points</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">make3DPoint</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> point <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">z</span> <span class="sy0">=</span> z<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> point<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Create 2d Points</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">make2DPoint</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span> depth<span class="sy0">,</span> scaleFactor<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> point <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">depth</span> <span class="sy0">=</span> depth<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">scaleFactor</span> <span class="sy0">=</span> scaleFactor<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> point<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Holds the container</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">container</span> <span class="sy0">=</span> undefined<span class="sy0">;</span><br />
<br />
<span class="co1">//Holds an array of 3d points.</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">pointsArray</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="co1">// Set the container and create place holders if </span><br />
<span class="co1">// there is no &lt;ul&gt; in the container</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">init</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">container</span> <span class="sy0">=</span> $<span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">containerId</span> <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">container</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//if there isn't a ul than it creates a list of +'s</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$<span class="br0">&#40;</span>container<span class="sy0">+</span><span class="st0">&quot;:has(ul)&quot;</span><span class="br0">&#41;</span>.<span class="me1">length</span> <span class="sy0">===</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="kw1">this</span>.<span class="me1">pointsArray</span>.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">container</span>.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">'&lt;b id=&quot;item'</span><span class="sy0">+</span>i<span class="sy0">+</span><span class="st0">'&quot;&gt;+&lt;/b&gt;'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>If this seems a little foreign to you, you might want to check out the post <a title="Object Oriented Programming with JavaScript" href="http://www.devirtuoso.com/2009/09/object-oriented-programming-with-javascript/" target="_blank">Object Oriented Programming with JavaScript</a>.</p>
<h4>Make 3d/2d Points</h4>
<p>These functions basically create objects, one meant for 3d (x,y,z) and one meant for 2d(x,y,depth).&#160; These will come in handy when the scene is rendered.</p>
<h4>Initialization</h4>
<p>The init function assigns a variable to the container passed in.&#160; The container is where ever you want the 3d object to display.&#160; There is also a part of this function that checks to see if the container has an unordered list.&#160; If it doesn’t it just creates a bunch of +’s&#160; Really these lines aren’t necessary, I just put it in so I don’t always have to create a unordered list to see if my object is rendering.</p>
<p>&#160;</p>
<h2>Camera</h2>
<p>I’m guessing from the name you can probably figure out what this class does.&#160; It’s just like a real life camera.&#160; It basically creates a point of reference.</p>
<p>Here is the Camera Class:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Camera3D <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//The x,y,z of the camera</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">x</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">y</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">z</span> <span class="sy0">=</span> <span class="nu0">500</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Determines the zoom</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">focalLength</span> <span class="sy0">=</span> <span class="nu0">1000</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Figure out how large the object should be in</span><br />
<span class="co1">//reference to the camera.</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">scaleRatio</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="kw1">item</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">focalLength</span><span class="sy0">/</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">focalLength</span> <span class="sy0">+</span> <span class="kw1">item</span>.<span class="me1">z</span> <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">z</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Initialize the camera with values.</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">init</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="sy0">,</span>focalLength<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">z</span> <span class="sy0">=</span> z<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">focalLength</span> <span class="sy0">=</span> focalLength<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>The focal length basically determines how large the object is going to look in reference to how close it is from the camera.&#160; Think of it like a zoom lens.&#160; You can zoom in, or zoom out.</p>
<p>The scaleRatio does the magic. It figures out how large the item should be in reference to the camera.</p>
<p>&#160;</p>
<h2>Object 3D</h2>
<p>This class isn’t overly important.&#160; I basically made this class so I can add more than one object in the future.&#160; Right now the engine can only deal with one object at a time. Object3D is a glorified array.&#160; Anytime you add an item to the array, it runs the init function on that item. </p>
<p>Here is the code:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co1">// class creates an array of objects to</span><br />
<span class="co1">// be rendered, and initializes them.</span><br />
<span class="kw2">var</span> Object3D <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">container</span> <span class="sy0">=</span> $<span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Object3D.<span class="me1">prototype</span>.<span class="me1">objects</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Add object to the list of objects.</span><br />
Object3D.<span class="me1">prototype</span>.<span class="me1">addChild</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>object3D<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">objects</span>.<span class="me1">push</span><span class="br0">&#40;</span>object3D<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; object3D.<span class="me1">init</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">container</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> object3D<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<h2>Scene</h2>
<p>This is where all the complicated stuff happens.&#160; I won’t get into great detail with the mathematics.&#160; High school math was boring enough <img src='http://www.devirtuoso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> &#160; I will give you a high overview of what the code does though, so at least you have an understanding of what it does.</p>
<p>Here is the Scene Class:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Scene3D <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">sceneItems</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Adds objects to the list of items to be rendered.</span><br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">addToScene</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>object<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">sceneItems</span>.<span class="me1">push</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="co1">//Converts a 3d point into a 2d point.</span><br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">Transform3DPointsTo2DPoints</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>points<span class="sy0">,</span> axisRotations<span class="sy0">,</span>camera<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> TransformedPointsArray <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sx <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>axisRotations.<span class="me1">x</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> cx <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>axisRotations.<span class="me1">x</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sy <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>axisRotations.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> cy <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>axisRotations.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sz <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>axisRotations.<span class="me1">z</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> cz <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>axisRotations.<span class="me1">z</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="sy0">,</span> xy<span class="sy0">,</span>xz<span class="sy0">,</span> yx<span class="sy0">,</span>yz<span class="sy0">,</span> zx<span class="sy0">,</span>zy<span class="sy0">,</span> scaleFactor<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">var</span> i <span class="sy0">=</span> points.<span class="me1">length</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>i<span class="sy0">--</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy0">=</span> points<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">x</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy0">=</span> points<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">y</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy0">=</span> points<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">z</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// rotation around x</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; xy <span class="sy0">=</span> cx<span class="sy0">*</span>y <span class="sy0">-</span> sx<span class="sy0">*</span>z<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; xz <span class="sy0">=</span> sx<span class="sy0">*</span>y <span class="sy0">+</span> cx<span class="sy0">*</span>z<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// rotation around y</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; yz <span class="sy0">=</span> cy<span class="sy0">*</span>xz <span class="sy0">-</span> sy<span class="sy0">*</span>x<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; yx <span class="sy0">=</span> sy<span class="sy0">*</span>xz <span class="sy0">+</span> cy<span class="sy0">*</span>x<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// rotation around z</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; zx <span class="sy0">=</span> cz<span class="sy0">*</span>yx <span class="sy0">-</span> sz<span class="sy0">*</span>xy<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; zy <span class="sy0">=</span> sz<span class="sy0">*</span>yx <span class="sy0">+</span> cz<span class="sy0">*</span>xy<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; scaleFactor <span class="sy0">=</span> camera.<span class="me1">focalLength</span><span class="sy0">/</span><span class="br0">&#40;</span>camera.<span class="me1">focalLength</span> <span class="sy0">+</span> yz<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy0">=</span> zx<span class="sy0">*</span>scaleFactor<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy0">=</span> zy<span class="sy0">*</span>scaleFactor<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy0">=</span> yz<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> displayObject <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; TransformedPointsArray<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> displayObject.<span class="me1">make2DPoint</span><span class="br0">&#40;</span>x<span class="sy0">,</span> y<span class="sy0">,</span> <span class="sy0">-</span>z<span class="sy0">,</span> scaleFactor<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> TransformedPointsArray<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="co1">//Takes the converted 2d and applies the appropriate CSS.</span><br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">renderCamera</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>camera<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Loop through all objects in the scene.</span><br />
&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span> <span class="sy0">;</span> i<span class="sy0">&lt;</span> <span class="kw1">this</span>.<span class="me1">sceneItems</span>.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">sceneItems</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">objects</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//transform the points in the object to 2d points.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> screenPoints <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">Transform3DPointsTo2DPoints</span><span class="br0">&#40;</span>obj.<span class="me1">pointsArray</span><span class="sy0">,</span> axisRotation<span class="sy0">,</span> camera<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//does the container have a ul inside of it.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> hasList <span class="sy0">=</span> <span class="br0">&#40;</span>document.<span class="me1">getElementById</span><span class="br0">&#40;</span>obj.<span class="me1">containerId</span><span class="br0">&#41;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;ul&quot;</span><span class="br0">&#41;</span>.<span class="me1">length</span> <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Cycle through each point in the object.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>k<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> k <span class="sy0">&lt;</span> obj.<span class="me1">pointsArray</span>.<span class="me1">length</span><span class="sy0">;</span> k<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> currItem <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//if the container has a list then select the lis</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hasList<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span>obj.<span class="me1">containerId</span><span class="br0">&#41;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;ul&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;li&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>k<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//otherwise select whatever is there.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span>obj.<span class="me1">containerId</span><span class="br0">&#41;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;*&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>k<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//If there are items to render then...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>currItem<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem._x <span class="sy0">=</span> screenPoints<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">x</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem._y <span class="sy0">=</span> screenPoints<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">y</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">scale</span> <span class="sy0">=</span> screenPoints<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">scaleFactor</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Render the CSS.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">position</span> <span class="sy0">=</span> <span class="st0">&quot;absolute&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">top</span> <span class="sy0">=</span> currItem._y<span class="sy0">+</span><span class="st0">'px'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">left</span> <span class="sy0">=</span> currItem._x<span class="sy0">+</span><span class="st0">'px'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">fontSize</span> <span class="sy0">=</span> <span class="nu0">100</span><span class="sy0">*</span>currItem.<span class="me1">scale</span><span class="sy0">+</span><span class="st0">'%'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>currItem<span class="br0">&#41;</span>.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span>opacity<span class="sy0">:</span><span class="br0">&#40;</span>currItem.<span class="me1">scale</span><span class="sy0">-</span>.5<span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Center for rotation</span><br />
<span class="kw2">var</span> axisRotation <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<h4>Add To Scene</h4>
<p>First thing you’ll see is the addToScene function.&#160; This basically populates the array that is used to render the scene.&#160; If you object is in this array it will get rendered, if it isn’t….it missed the bus.</p>
<p>&#160;</p>
<h4>Transform 3D point to 2D</h4>
<p>Next is the Transform3DPointsTo2DPoints function.&#160; This is probably the most important part of the engine.&#160; What it does is it takes a 3D point in space (x,y,z) and through a little magic converts it into a 2D point that can be displayed on screen.</p>
<p>&#160;</p>
<h4>Render Camera</h4>
<p>The renderCamera function doesn’t do anything too complicated.&#160; It’s sole purpose is to display the items on screen.&#160; It does this by looping through the objects in the scene, and passes each one into the Transform3DPointsTo2DPoints function.&#160; The function will return a 2D point that can be plotted using CSS.&#160; You might have noticed I’m using JavaScript for the CSS and selecting of the DOM instead of jQuery.&#160; Initially I used jQuery but found the browser was crawling, so I went back to the old fashion way.</p>
<p>&#160;</p>
<h2>The Cube</h2>
<p>I’ve put the Cube class in a separate file so you can import objects as you need them instead of having to load ones you aren’t using.&#160; </p>
<p>The class isn’t overly complicated.&#160; It’s creating an array and placing all the points on the cube into that array.&#160; It uses the make3DPoint function from the DisplayObject3D class to create each point. </p>
<p>Here is the code:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Cube <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>size<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//if the size is not set then give a default</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>size <span class="sy0">===</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; size <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Create a 3d point for every point on the cube.</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span> <span class="sy0">=</span> <span class="br0">&#91;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//make3dpoint is a function inherited from</span><br />
&nbsp; &nbsp; <span class="co1">//DisplayObject3D</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Inherit DisplayObject3d methods and properties</span><br />
Cube.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>&#160;</p>
<h2>Using the 3D Engine</h2>
<p>There are a few steps that need to be done in order for this to work.&#160;&#160; First we’ll need some HTML. I’ll just create a div with an id and place a &lt;ul&gt; full of smiley faces.&#160; If you wanted you can leave the div blank and it will automatically create a bunch of +’s for you.</p>
<p>Here is the HTML:</p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-1">&lt;!-- List of smiley faces --&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
<br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;3DEngine.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc-1">&lt;!-- </span><br />
<span class="sc-1">&nbsp; &nbsp; Each 3d object is a seperate js so you only </span><br />
<span class="sc-1">&nbsp; &nbsp; have to import what you need.</span><br />
<span class="sc-1">--&gt;</span><br />
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;Cube.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>Next comes the jQuery. There are a couple of steps you need to do:</p>
<ol>
<li>Create a camera and initialize it. </li>
<li>Create an Object Holder (Object3D) </li>
<li>Create an Object and put it in the holder. </li>
<li>Create a Scene and put the holder in it. </li>
</ol>
<p>Here is the jQuery:</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace">$<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">ready</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<br />
<span class="co1">//Create a camera</span><br />
<span class="kw2">var</span> camera <span class="sy0">=</span> <span class="kw2">new</span> Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//initialize it.</span><br />
camera.<span class="me1">init</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">300</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Create an object holder.</span><br />
<span class="kw2">var</span> <span class="kw1">item</span> <span class="sy0">=</span> <span class="kw2">new</span> Object3D<span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//add a new cube.</span><br />
<span class="kw1">item</span>.<span class="me1">addChild</span><span class="br0">&#40;</span><span class="kw2">new</span> Cube<span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="co1">//Create a scene</span><br />
<span class="kw2">var</span> scene <span class="sy0">=</span> <span class="kw2">new</span> Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Place the object Holder in the scene.</span><br />
scene.<span class="me1">addToScene</span><span class="br0">&#40;</span><span class="kw1">item</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Animates the cube.</span><br />
<span class="kw2">var</span> animateIt <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//rotates on the y and x axis.</span><br />
&nbsp; &nbsp; axisRotation.<span class="me1">y</span> <span class="sy0">+=</span> .01<br />
&nbsp; &nbsp; axisRotation.<span class="me1">x</span> <span class="sy0">-=</span> .01<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//Render the scene.</span><br />
&nbsp; &nbsp; scene.<span class="me1">renderCamera</span><span class="br0">&#40;</span>camera<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
setInterval<span class="br0">&#40;</span>animateIt<span class="sy0">,</span> <span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<p>I didn’t get a chance to make it interact with the mouse. You can do that just by adjusting the axisRotation x, y and z values when the mouse moves.&#160; Perhaps I’ll do this in my next post.</p>
<p>&#160;</p>
<h2>That’s All For Now</h2>
<p>Stay tuned for the next couple of posts.&#160; I plan to make a couple different shapes for this.&#160; If you feel frisky by all means try and create your own shapes.&#160; Just create an array with a bunch of 3D Points.&#160;&#160; </p>
<p>There are still a couple of kinks to work out, but for now here is all the code together.</p>
<p>3DEngine.js</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/*<br />
* DisplayObject3D ----------------------------------------------<br />
*/</span><br />
<span class="kw2">var</span> DisplayObject3D <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
DisplayObject3D.<span class="me1">prototype</span>._x <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
DisplayObject3D.<span class="me1">prototype</span>._y <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Create 3d Points</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">make3DPoint</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> point <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">z</span> <span class="sy0">=</span> z<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> point<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="co1">//Create 2d Points</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">make2DPoint</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span> depth<span class="sy0">,</span> scaleFactor<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> point <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">depth</span> <span class="sy0">=</span> depth<span class="sy0">;</span><br />
&nbsp; &nbsp; point.<span class="me1">scaleFactor</span> <span class="sy0">=</span> scaleFactor<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> point<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">container</span> <span class="sy0">=</span> undefined<span class="sy0">;</span><br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">pointsArray</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
DisplayObject3D.<span class="me1">prototype</span>.<span class="me1">init</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">container</span> <span class="sy0">=</span> $<span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">containerId</span> <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">container</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">//if there isn't a ul than it creates a list of +'s</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$<span class="br0">&#40;</span>container<span class="sy0">+</span><span class="st0">&quot;:has(ul)&quot;</span><span class="br0">&#41;</span>.<span class="me1">length</span> <span class="sy0">===</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> <span class="kw1">this</span>.<span class="me1">pointsArray</span>.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">container</span>.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">'&lt;b id=&quot;item'</span><span class="sy0">+</span>i<span class="sy0">+</span><span class="st0">'&quot;&gt;+&lt;/b&gt;'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span>&nbsp; <br />
<br />
<span class="coMULTI">/*<br />
* DisplayObject3D End ----------------------------------------------<br />
*/</span><br />
<br />
<br />
<span class="coMULTI">/*<br />
* Camera3D ----------------------------------------------<br />
*/</span><br />
<span class="kw2">var</span> Camera3D <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">x</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">y</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">z</span> <span class="sy0">=</span> <span class="nu0">500</span><span class="sy0">;</span><br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">focalLength</span> <span class="sy0">=</span> <span class="nu0">1000</span><span class="sy0">;</span><br />
<br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">scaleRatio</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="kw1">item</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">this</span>.<span class="me1">focalLength</span><span class="sy0">/</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">focalLength</span> <span class="sy0">+</span> <span class="kw1">item</span>.<span class="me1">z</span> <span class="sy0">-</span> <span class="kw1">this</span>.<span class="me1">z</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Camera3D.<span class="me1">prototype</span>.<span class="me1">init</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="sy0">,</span>focalLength<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">x</span> <span class="sy0">=</span> x<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">y</span> <span class="sy0">=</span> y<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">z</span> <span class="sy0">=</span> z<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">focalLength</span> <span class="sy0">=</span> focalLength<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<br />
<span class="coMULTI">/*<br />
* Camera3D End ----------------------------------------------<br />
*/</span><br />
<br />
<br />
<span class="coMULTI">/*<br />
* Object3D ----------------------------------------------<br />
*/</span><br />
<span class="kw2">var</span> Object3D <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">container</span> <span class="sy0">=</span> $<span class="br0">&#40;</span>container<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Object3D.<span class="me1">prototype</span>.<span class="me1">objects</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<br />
Object3D.<span class="me1">prototype</span>.<span class="me1">addChild</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>object3D<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">objects</span>.<span class="me1">push</span><span class="br0">&#40;</span>object3D<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; object3D.<span class="me1">init</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">container</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> object3D<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="coMULTI">/*<br />
* Object3D End ----------------------------------------------<br />
*/</span><br />
<br />
<br />
<span class="coMULTI">/*<br />
* Scene3D ----------------------------------------------<br />
*/</span><br />
<br />
<span class="kw2">var</span> Scene3D <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">sceneItems</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">addToScene</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>object<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">sceneItems</span>.<span class="me1">push</span><span class="br0">&#40;</span>object<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">Transform3DPointsTo2DPoints</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span>points<span class="sy0">,</span> axisRotations<span class="sy0">,</span>camera<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> TransformedPointsArray <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sx <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>axisRotations.<span class="me1">x</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> cx <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>axisRotations.<span class="me1">x</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sy <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>axisRotations.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> cy <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>axisRotations.<span class="me1">y</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> sz <span class="sy0">=</span> Math.<span class="me1">sin</span><span class="br0">&#40;</span>axisRotations.<span class="me1">z</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> cz <span class="sy0">=</span> Math.<span class="me1">cos</span><span class="br0">&#40;</span>axisRotations.<span class="me1">z</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> x<span class="sy0">,</span>y<span class="sy0">,</span>z<span class="sy0">,</span> xy<span class="sy0">,</span>xz<span class="sy0">,</span> yx<span class="sy0">,</span>yz<span class="sy0">,</span> zx<span class="sy0">,</span>zy<span class="sy0">,</span> scaleFactor<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw2">var</span> i <span class="sy0">=</span> points.<span class="me1">length</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>i<span class="sy0">--</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy0">=</span> points<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">x</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy0">=</span> points<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">y</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy0">=</span> points<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">z</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// rotation around x</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; xy <span class="sy0">=</span> cx<span class="sy0">*</span>y <span class="sy0">-</span> sx<span class="sy0">*</span>z<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; xz <span class="sy0">=</span> sx<span class="sy0">*</span>y <span class="sy0">+</span> cx<span class="sy0">*</span>z<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// rotation around y</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; yz <span class="sy0">=</span> cy<span class="sy0">*</span>xz <span class="sy0">-</span> sy<span class="sy0">*</span>x<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; yx <span class="sy0">=</span> sy<span class="sy0">*</span>xz <span class="sy0">+</span> cy<span class="sy0">*</span>x<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// rotation around z</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; zx <span class="sy0">=</span> cz<span class="sy0">*</span>yx <span class="sy0">-</span> sz<span class="sy0">*</span>xy<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; zy <span class="sy0">=</span> sz<span class="sy0">*</span>yx <span class="sy0">+</span> cz<span class="sy0">*</span>xy<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; scaleFactor <span class="sy0">=</span> camera.<span class="me1">focalLength</span><span class="sy0">/</span><span class="br0">&#40;</span>camera.<span class="me1">focalLength</span> <span class="sy0">+</span> yz<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy0">=</span> zx<span class="sy0">*</span>scaleFactor<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy0">=</span> zy<span class="sy0">*</span>scaleFactor<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy0">=</span> yz<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> displayObject <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; TransformedPointsArray<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> displayObject.<span class="me1">make2DPoint</span><span class="br0">&#40;</span>x<span class="sy0">,</span> y<span class="sy0">,</span> <span class="sy0">-</span>z<span class="sy0">,</span> scaleFactor<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> TransformedPointsArray<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Scene3D.<span class="me1">prototype</span>.<span class="me1">renderCamera</span> <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>camera<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i <span class="sy0">=</span> <span class="nu0">0</span> <span class="sy0">;</span> i<span class="sy0">&lt;</span> <span class="kw1">this</span>.<span class="me1">sceneItems</span>.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">sceneItems</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">objects</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> screenPoints <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">Transform3DPointsTo2DPoints</span><span class="br0">&#40;</span>obj.<span class="me1">pointsArray</span><span class="sy0">,</span> axisRotation<span class="sy0">,</span> camera<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> hasList <span class="sy0">=</span> <span class="br0">&#40;</span>document.<span class="me1">getElementById</span><span class="br0">&#40;</span>obj.<span class="me1">containerId</span><span class="br0">&#41;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;ul&quot;</span><span class="br0">&#41;</span>.<span class="me1">length</span> <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>k<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> k <span class="sy0">&lt;</span> obj.<span class="me1">pointsArray</span>.<span class="me1">length</span><span class="sy0">;</span> k<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> currItem <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hasList<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span>obj.<span class="me1">containerId</span><span class="br0">&#41;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;ul&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;li&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>k<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span>obj.<span class="me1">containerId</span><span class="br0">&#41;</span>.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span><span class="st0">&quot;*&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>k<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>currItem<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem._x <span class="sy0">=</span> screenPoints<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">x</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem._y <span class="sy0">=</span> screenPoints<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">y</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">scale</span> <span class="sy0">=</span> screenPoints<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">scaleFactor</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">position</span> <span class="sy0">=</span> <span class="st0">&quot;absolute&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">top</span> <span class="sy0">=</span> currItem._y<span class="sy0">+</span><span class="st0">'px'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">left</span> <span class="sy0">=</span> currItem._x<span class="sy0">+</span><span class="st0">'px'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currItem.<span class="me1">style</span>.<span class="me1">fontSize</span> <span class="sy0">=</span> <span class="nu0">100</span><span class="sy0">*</span>currItem.<span class="me1">scale</span><span class="sy0">+</span><span class="st0">'%'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>currItem<span class="br0">&#41;</span>.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span>opacity<span class="sy0">:</span><span class="br0">&#40;</span>currItem.<span class="me1">scale</span><span class="sy0">-</span>.5<span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
<span class="coMULTI">/*<br />
* Scene3D End ----------------------------------------------<br />
*/</span><br />
<br />
<br />
<span class="co1">//Center for rotation</span><br />
<span class="kw2">var</span> axisRotation <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>Cube.js</p>
<div class="codecolorer-container javascript " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td><div class="javascript codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">var</span> Cube <span class="sy0">=</span> <span class="kw2">function</span> <span class="br0">&#40;</span>size<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>size <span class="sy0">===</span> undefined<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; size <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">pointsArray</span> <span class="sy0">=</span> <span class="br0">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,-</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">make3DPoint</span><span class="br0">&#40;</span><span class="sy0">-</span>size<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span>size<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
Cube.<span class="me1">prototype</span> <span class="sy0">=</span> <span class="kw2">new</span> DisplayObject3D<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>index.html</p>
<div class="codecolorer-container html4strict " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br /></div></td><td><div class="html4strict codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span>Untitled Page<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/title.html"><span class="kw2">title</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">&quot;screen&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #item{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height:100px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin:0 auto;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; top:300px;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; position: relative;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ul{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list-style-type: none;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background-color: #111;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: #69c;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-family: Arial, &quot;MS Trebuchet&quot;, sans-serif;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-weight: bold;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; font-size:2em;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/style.html"><span class="kw2">style</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><span class="sc1">&amp;#x263A;</span><span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>&gt;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;jquery-1.3.2.min.js&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;3DEngine.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;Cube.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">charset</span><span class="sy0">=</span><span class="st0">&quot;utf-8&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; //<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.ready<span class="br0">&#40;</span>function<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var camera <span class="sy0">=</span> new Camera3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; camera.init<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">300</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var item <span class="sy0">=</span> new Object3D<span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="st0">&quot;#item&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.addChild<span class="br0">&#40;</span>new Cube<span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var scene <span class="sy0">=</span> new Scene3D<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scene.addToScene<span class="br0">&#40;</span>item<span class="br0">&#41;</span>;</span><br />
<br />
<span class="sc2">&nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var animateIt <span class="sy0">=</span> function<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.y +<span class="sy0">=</span> .01</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; axisRotation.x -<span class="sy0">=</span> .01</span><br />
<br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; scene.renderCamera<span class="br0">&#40;</span>camera<span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setInterval<span class="br0">&#40;</span>animateIt, <span class="nu0">20</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</span><br />
<span class="sc2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">//</span><span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>&#160;</p>
<div class="resources"><a class="Download" href="http://www.devirtuoso.com/Examples/3D-Engine/example.zip" target="_blank">Download</a> <a class="Example" href="http://www.devirtuoso.com/Examples/3D-Engine/" target="_blank">Example</a></div>
<p>&#160;</p>
<h3>Related</h3>
<table border="0" cellspacing="5" cellpadding="5">
<tr>
<td>
			<a href="http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/" target="_blank">3D Plane</a><br />
 <a href="http://www.devirtuoso.com/2009/09/3d-plane-for-jquery-3d-engine/" target="_blank"><img src="http://www.devirtuoso.com/wp-content/uploads/2009/09/3d-plane.jpg" alt="3d Plane" title="3d Plane" width="100" height="100" /></a>
		</td>
<td>
			 <a href="http://www.devirtuoso.com/2009/09/creating-a-wobbling-3d-carousel/" target="_blank">Wobbling Carousel</a><br />
 <a href="http://www.devirtuoso.com/2009/09/creating-a-wobbling-3d-carousel/" target="_blank"> <img src="http://www.devirtuoso.com/wp-content/uploads/2009/09/wobbling-carousel.jpg" width="100" height="100" alt="wobbling carousel" title="wobbling carousel" /></a></p>
</td>
<td>
 <a href="http://www.devirtuoso.com/2009/09/3d-sphere-using-jquery/" target="_blank">3D Sphere</a><br />
			 <a href="http://www.devirtuoso.com/2009/09/3d-sphere-using-jquery/" target="_blank"><img src="http://www.devirtuoso.com/wp-content/uploads/2009/09/3d-sphere.jpg" alt="3d sphere" width="100" height="100" title="3d sphere" /></a>
		</td>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/09/making-a-3d-engine-in-jquery/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>JavaScript Experiment &#8211; Browser Ball</title>
		<link>http://www.devirtuoso.com/2009/09/javascript-experiment-browser-ball/</link>
		<comments>http://www.devirtuoso.com/2009/09/javascript-experiment-browser-ball/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 14:45:18 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Front End Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[showcase]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1111</guid>
		<description><![CDATA[I killed about 20 minutes playing with this one.&#160; We’ve all seen physics experiments with balls in a browser window.&#160; This is the first one that I’ve seen that uses multiple windows.
 


Try it out



&#160;
My hat goes off to Mark Mahoney for this one.&#160; It was done really well.
Fantastic work.
If you know of any other [...]]]></description>
			<content:encoded><![CDATA[<p>I killed about 20 minutes playing with this one.&#160; We’ve all seen physics experiments with balls in a browser window.&#160; This is the first one that I’ve seen that uses multiple windows.</p>
<p> <span id="more-1111"></span>
</p>
<h3></h3>
<h3><a href="http://experiments.instrum3nt.com/markmahoney/ball/" target="_blank">Try it out</a></h3>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:71679ff5-6a05-4c53-a540-6562dae857c5" class="wlWriterEditableSmartContent">
<div><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/3al8prbfK5o&amp;hl=en"></param><embed src="http://www.youtube.com/v/3al8prbfK5o&amp;hl=en" type="application/x-shockwave-flash" width="425" height="355"></embed></object></div>
</div>
<p>&#160;</p>
<p>My hat goes off to <a href="http://www.weareinstrument.com/#/team/mark-mahoney" target="_blank">Mark Mahoney</a> for this one.&#160; It was done really well.</p>
<p>Fantastic work.</p>
<p>If you know of any other experimental developments that are worth a look, don’t hesitate to contact us.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/09/javascript-experiment-browser-ball/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Experimental JavaScript &#8211; Wavy Scrollbars</title>
		<link>http://www.devirtuoso.com/2009/08/experimental-javascript-wavy-scrollbars/</link>
		<comments>http://www.devirtuoso.com/2009/08/experimental-javascript-wavy-scrollbars/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 01:33:11 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Experimental]]></category>
		<category><![CDATA[experiment]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.devirtuoso.com/?p=1024</guid>
		<description><![CDATA[This is by far the most creative use of scrollbars that I’ve seen.  Who would have thought to create an interactive wave with scrollbars.  Fantastic work.

The experiment can be viewed here : http://the389.com/experiment/
It requires that you have safari 4 or google chrome.  In case you don’t have either one, here is a video of the [...]]]></description>
			<content:encoded><![CDATA[<p>This is by far the most creative use of scrollbars that I’ve seen.  Who would have thought to create an interactive wave with scrollbars.  Fantastic work.</p>
<p><span id="more-1024"></span></p>
<p>The experiment can be viewed here : <a href="http://the389.com/experiment/">http://the389.com/experiment/</a></p>
<p>It requires that you have safari 4 or google chrome.  In case you don’t have either one, here is a video of the experiment.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="307" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3794595&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="307" src="http://vimeo.com/moogaloop.swf?clip_id=3794595&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/3794595">Scrollbars Experiment</a></p>
<p>Much respect goes out to the author.  This is the kind of work that makes my day.  I’m just sad I didn’t think of it first <img src='http://www.devirtuoso.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.devirtuoso.com/2009/08/experimental-javascript-wavy-scrollbars/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
