<?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>Talk Unafraid &#187; camera</title>
	<atom:link href="http://www.talkunafraid.co.uk/tag/camera/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.talkunafraid.co.uk</link>
	<description>The (occasionally coherent) ramblings of a geek</description>
	<lastBuildDate>Sat, 07 Jan 2012 22:24:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Processing &#8211; Obsessive Camera Direction</title>
		<link>http://www.talkunafraid.co.uk/2008/10/processing-obsessive-camera-direction/</link>
		<comments>http://www.talkunafraid.co.uk/2008/10/processing-obsessive-camera-direction/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 09:12:13 +0000</pubDate>
		<dc:creator>James Harrison</dc:creator>
				<category><![CDATA[Processing]]></category>
		<category><![CDATA[camera]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://www.talkunafraid.co.uk/?p=26</guid>
		<description><![CDATA[Processing is awesome, and what better way to improve a sketch like a map viewer than to give it some juicy mouse/keyboard controls? The Obsessive Camera Direction library for Processing lets you do just that quite easily. Simply install the library and follow the guide for easy, awesome controls. You need to be using some [...]]]></description>
			<content:encoded><![CDATA[<p>Processing is awesome, and what better way to improve a sketch like a map viewer than to give it some juicy mouse/keyboard controls?</p>
<p>The <a href="http://www.cise.ufl.edu/~kdamkjer/processing/libraries/ocd/">Obsessive Camera Direction</a> library for Processing lets you do just that quite easily. Simply install the library and follow the guide for easy, awesome controls.</p>
<p><span id="more-26"></span></p>
<p>You need to be using some form of 3D rendering on your sketch already, be it OpenGL or P3D. You can do this by using the third argument to size- I use the <a href="http://users.design.ucla.edu/~acolubri/processing/glgraphics/home/index.html">GlGraphics </a>renderer (an extension of the OpenGL renderer), so my setup function looks like this (more or less):</p>
<div class="geshi no java">
<div class="head">void setup() {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; size<span class="br0">&#40;</span><span class="nu0">800</span>, <span class="nu0">600</span>, GLConstants.<span class="me1">GLGRAPHICS</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// use OPENGL instead of GLConstants.GLGRAPHICS here if you&#39;re</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// not using GlGraphics</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; background<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; frameRate<span class="br0">&#40;</span><span class="nu0">30</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now we move on and get down to business. We need to set up a few global variables.</p>
<div class="geshi no java">
<div class="head">// starting camera position</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> x = <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> y = <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> z = <span class="nu0">400</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// camera</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; Camera camera1<span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Next, we modify our setup function to initialise the camera at it&#8217;s starting point.</p>
<div class="geshi no java">
<div class="head">void setup() {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; size<span class="br0">&#40;</span><span class="nu0">800</span>, <span class="nu0">600</span>, GLConstants.<span class="me1">GLGRAPHICS</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// use OPENGL instead of GLConstants.GLGRAPHICS here if you&#39;re</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// not using GlGraphics</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; background<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; frameRate<span class="br0">&#40;</span><span class="nu0">30</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; camera1 = <span class="kw2">new</span> Camera<span class="br0">&#40;</span><span class="kw2">this</span>, x, y, z<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And finally, we need to set up this camera as our active camera feed in our draw function.</p>
<div class="geshi no java">
<div class="head">void draw() {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; background<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; camera1.<span class="me1">feed</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">// draw stuff!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>And there you have it- almost! So far we&#8217;ve just added a camera. Now we need a lengthy function to map keyboard and mouse to the camera movement controls.</p>
<div class="geshi no java">
<div class="head">// Function to manage mouse movement</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw4">void</span> mouseDragged<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mouseButton == CENTER<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Look around</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">truck</span><span class="br0">&#40;</span>mouseX &#8211; pmouseX<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">boom</span><span class="br0">&#40;</span>mouseY &#8211; pmouseY<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>mouseButton == LEFT<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">tilt</span><span class="br0">&#40;</span>radians<span class="br0">&#40;</span>mouseY &#8211; pmouseY<span class="br0">&#41;</span> / <span class="nu0">2.0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">pan</span><span class="br0">&#40;</span>radians<span class="br0">&#40;</span>mouseX &#8211; pmouseX<span class="br0">&#41;</span> / <span class="nu0">2.0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">dolly</span><span class="br0">&#40;</span><span class="br0">&#40;</span>pmouseX-mouseX<span class="br0">&#41;</span>+<span class="br0">&#40;</span>pmouseY-mouseY<span class="br0">&#41;</span>/<span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// One more to handle the keyboard</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> keyPressed<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> <span class="st0">&#39;r&#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// Reset camera position and orientation</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">jump</span><span class="br0">&#40;</span>x,y,z<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">aim</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> <span class="st0">&#39;w&#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// dolly forwards</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">dolly</span><span class="br0">&#40;</span><span class="nu0">-10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> <span class="st0">&#39;s&#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// dolly backwards</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">dolly</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> <span class="st0">&#39;a&#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// truck left</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">truck</span><span class="br0">&#40;</span><span class="nu0">-10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> <span class="st0">&#39;d&#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// truck right</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">truck</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> <span class="st0">&#39; &#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// boom up</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; camera1.<span class="me1">boom</span><span class="br0">&#40;</span><span class="nu0">-10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">case</span> CODED:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>keyCode == CONTROL<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">// boom down</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; camera1.<span class="me1">boom</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Right, finally done. This will map your mouse as follows:</p>
<ul>
<li>Left mouse button looks around</li>
<li>Right mouse button moves backwards/forwards</li>
<li>Centre mouse button (wheel click down on most mice) is left/right movement</li>
</ul>
<p>Your keyboard also gets some controls:</p>
<ul>
<li>r &#8211; Resets view to the default position</li>
<li>w &#8211; Moves view forwards</li>
<li>s &#8211; Moves view backwards</li>
<li>a &#8211; Moves view left</li>
<li>d &#8211; Moves view right</li>
<li>Control &#8211; Moves view down</li>
<li>Space &#8211; Moves view up</li>
</ul>
<p>All up/down/left/right is relative to the view axis.</p>
<p>Hope this helps someone else trying to achieve the same thing with Processing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.talkunafraid.co.uk/2008/10/processing-obsessive-camera-direction/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

