<?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>Stumbling Toward &#039;Awesomeness&#039;</title>
	<atom:link href="http://www.chrisevans3d.com/pub_blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.chrisevans3d.com/pub_blog</link>
	<description>A Technical Art Blog</description>
	<lastBuildDate>Sun, 29 Aug 2010 06:53:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Perforce Triggers in Python (Pt 1)</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=551</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=551#comments</comments>
		<pubDate>Wed, 25 Aug 2010 22:33:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[industry]]></category>
		<category><![CDATA[perforce]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[p4]]></category>
		<category><![CDATA[p4python]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=551</guid>
		<description><![CDATA[Perforce is a wily beast. A lot of companies use it, but I feel few outside of the IT department really have to deal with it much. As I work myself deeper and deeper into the damp hole that is asset validation, I have really been writing a lot of python to deal with certain [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.perforce.com/" target="_blank">Perforce</a> is a wily beast. A lot of companies use it, but I feel few outside of the IT department really have to deal with it much. As I work myself deeper and deeper into the damp hole that is asset validation, I have really been writing a lot of python to deal with certain issues; but always scripts that work from the outside.</p>
<p>Perforce has a system that allows you to write scripts that are run, server side, when <a href="http://www.perforce.com/perforce/doc.current/manuals/p4sag/06_scripting.html" target="_blank">any number of events</a> are triggered. You can use many scripting languages, but I will only touch on Python.</p>
<h2>Test Environment</h2>
<p>To follow along here, you should set up a test environment. Perforce is <a href="http://www.perforce.com/perforce/downloads/index.html" target="_blank">freely downloadable</a>, and free to use with 2 users. Of course you are going to need python, and <a href="http://www.perforce.com/perforce/loadsupp.html" target="_blank">p4python</a>. So get your server running and add two users, a user and an administrator.</p>
<h2>Your First Trigger</h2>
<p>Let&#8217;s create the simplest python script. It will be a submit trigger that says &#8216;Hello World&#8217; then passes or fails. If it passes, the item will be checked in to perforce, if it fails, it will not. exiting while returning a &#8216;1&#8242; is considered a fail, &#8216;0&#8242; a pass.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">'Hello World!'</span>
<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">'No checkin for you!'</span>
<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">exit</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>Ok, so save this file as hello_trigger.py. Now go to a command line and enter &#8216;p4 triggers&#8217; this will open a text document, edit that document to point to your trigger, like so (but point to the location of your script on disk):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Triggers:
	hello_trigger change-submit //depot/... &quot;python X:/projects/2010/p4/hello_trigger.py&quot;</pre></div></div>

<p>Close/save the trigger TMP file, you should see &#8216;Triggers saved.&#8217; echo&#8217;d at the prompt. Now, when we try to submit a file to the depot, we will get this:</p>
<p><img src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/08/triggers01.png" alt="" /></p>
<p>So: awesome, <strong><span style="color: #ff0000;">you just DENIED your first check-in!</span></strong></p>
<h2>Connecting to Perforce from Inside a Trigger</h2>
<p>So we are now denying check-ins, but let&#8217;s try to do some other things, let&#8217;s connect to perforce from inside a trigger.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">from</span> P4 <span style="color: #5F8BC7;font-weight:bold;">import</span> P4, P4Exception
&nbsp;
p4 = P4<span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">try</span>:
	<span style="color: #808080; font-style: italic;">#use whatever your admin l/p was</span>
	<span style="color: #808080; font-style: italic;">#this isn't the safest, but it works at this beginner level</span>
	p4.<span style="color: #dc143c;">user</span> = <span style="color: #483d8b;">&quot;admin&quot;</span>
	p4.<span style="color: #C0C0C0;">password</span> = <span style="color: #483d8b;">&quot;admin&quot;</span>
	p4.<span style="color: #C0C0C0;">port</span> = <span style="color: #483d8b;">&quot;1666&quot;</span>
	p4.<span style="color: #C0C0C0;">connect</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
	info = p4.<span style="color: #C0C0C0;">run</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">&quot;info&quot;</span><span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #5F8BC7;font-weight:bold;">print</span> info
	<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">exit</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#this will return any errors</span>
<span style="color: #5F8BC7;font-weight:bold;">except</span> P4Exception:
	<span style="color: #5F8BC7;font-weight:bold;">for</span> e <span style="color: #5F8BC7;font-weight:bold;">in</span> p4.<span style="color: #C0C0C0;">errors</span>: <span style="color: #5F8BC7;font-weight:bold;">print</span> e
	<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">exit</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>So now when you try to submit a file to depot you will get this:</p>
<p><img src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/08/triggers02.png" alt="" /></p>
<h2>Passing Info to the Trigger</h2>
<p>Now we are running triggers, accepting or denying checkins, but we really don&#8217;t know much about them. Let&#8217;s try to get enough info to where we could make a decision about whether or not we want the file to pass validation. Let&#8217;s make another python trigger, trigger_test.py, and let&#8217;s query something from the perforce server in the submit trigger. To do this we need to edit our trigger file like so:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Triggers:
	test change-submit //depot/... &quot;python X:/projects/2010/p4/test_trigger.py %user% %changelist%&quot;</pre></div></div>

<p>This will pass the user and changelist number into the python script as an arg, the same way dragging/dropping passed args to python in my previous example. So let&#8217;s set that up, save the script from before as &#8216;test_trigger.py&#8217; as shown above, and add the following:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #5F8BC7;font-weight:bold;">from</span> P4 <span style="color: #5F8BC7;font-weight:bold;">import</span> P4, P4Exception
&nbsp;
p4 = P4<span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
describe = <span style="color: #C0C0C0;">&#91;</span><span style="color: #C0C0C0;">&#93;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">try</span>:
	p4.<span style="color: #dc143c;">user</span> = <span style="color: #483d8b;">&quot;admin&quot;</span>
	p4.<span style="color: #C0C0C0;">password</span> = <span style="color: #483d8b;">&quot;admin&quot;</span>
	p4.<span style="color: #C0C0C0;">port</span> = <span style="color: #483d8b;">&quot;1666&quot;</span>
	p4.<span style="color: #C0C0C0;">connect</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">except</span> P4Exception:
	<span style="color: #5F8BC7;font-weight:bold;">for</span> e <span style="color: #5F8BC7;font-weight:bold;">in</span> p4.<span style="color: #C0C0C0;">errors</span>: <span style="color: #5F8BC7;font-weight:bold;">print</span> e
	<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">exit</span><span style="color: #C0C0C0;">&#40;</span>1<span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">argv</span><span style="color: #C0C0C0;">&#41;</span>
describe = p4.<span style="color: #C0C0C0;">run</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'describe'</span>,<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">argv</span><span style="color: #C0C0C0;">&#91;</span>2<span style="color: #C0C0C0;">&#93;</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>describe<span style="color: #C0C0C0;">&#41;</span>
&nbsp;
p4.<span style="color: #C0C0C0;">disconnect</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">exit</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>So, as you can see, it has returned the user and changelist number:</p>
<p><img src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/08/triggers03.png" alt="" /></p>
<p>However, for this changelist to be useful, we query p4, asking the server to describe the changelist. This returns a lot of information about the changelist.</p>
<h2>Where to Go From here</h2>
<p>The few simple things shown here really give you the tools to do many more things. Here are some examples of triggers that can be  created with the know-how above:</p>
<ul>
<li>Deny check-ins of a certain filetype (like deny compiled source files/assets)</li>
<li>Deny check-ins whose hash digest matches an existing file on the server</li>
<li>Deny/allow a certain type of file check-in from a user in a certain group</li>
<li>Email a lead any time a file in a certain folder is updated</li>
</ul>
<p>Did you find this helpful? What creative triggers have you written?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=551</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sigma 8mm vs 4.5mm Comparison on Nikon APS-C</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=537</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=537#comments</comments>
		<pubDate>Sun, 08 Aug 2010 12:56:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[industry]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[vfx]]></category>
		<category><![CDATA[aps-c]]></category>
		<category><![CDATA[fisheye]]></category>
		<category><![CDATA[hdr]]></category>
		<category><![CDATA[lenses]]></category>
		<category><![CDATA[nikon]]></category>
		<category><![CDATA[panorama]]></category>
		<category><![CDATA[photo]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=537</guid>
		<description><![CDATA[I have been researching the best options available for the D300 when it comes to quickly generating some lightprobes/panoramas. This of course means fisheye lenses. Currently, Sigma is the only company that makes a 180 degree circular fisheye. They come in two flavors, 8mm, and 4.5mm. The 8mm projects a full circle onto a full [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_540" class="wp-caption aligncenter" style="width: 610px"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/08/8mm_apsc_compare.jpg"><img class="size-medium wp-image-540" title="8mm_apsc_compare" src="http://chrisevans3d.com/images/blog/8mm_apsc_compare_600px.jpg" alt="" width="600" height="292" /></a><p class="wp-caption-text">click to enlarge</p></div>
<p>I have been researching the best options available for the D300 when it comes to quickly generating some lightprobes/panoramas. This of course means fisheye lenses. Currently, Sigma is the only company that makes a 180 degree circular fisheye. They come in two flavors, 8mm, and 4.5mm. The 8mm projects a full circle onto a full 35mm sensor (full frame), but on an APS-C sensor it is cropped. The 4.5mm however, throws a perfect circular image onto an APS-C sized sensor; I believe it is the only lens that does this.</p>
<h2>The Pixels</h2>
<p>You would think that the 4.5mm would be the way to go, I did until I took a look at both. It really comes down to the pixels. The width in pixels of the image thrown by the 4.5mm lens is roughly 2285px in diameter. So while you can shoot less, an entire panorama taking about 3 shots, it will come out as a &lt;4k equirectangular. However, using the 8mm, you need 4 shots, plus one zenith (5 shots total) and it generates an 8k image.  While the 4.5mm does generate a 180 degree image across, as you can see it is very wasteful.</p>
<p><span style="color: #bf4035;">So why doesn&#8217;t the lens have full coverage in at least the short dimension? I think it&#8217;s because it&#8217;s a lens designed to fit Canon and Sigma cameras, not just Nikon. Canon sensors have a 1.6 crop factor and Sigma&#8217;s Foveon X3 has a 1.7 crop factor (13.8mm)! The coverage is so small because Nikon DX format has a 1.5 crop factor, the APS-C sensor is much larger than Canon or Sigma. The actual circle measures 12.3mm, even small for the Sigma, which makes me believe they future-proofed it for Four Thirds.<br />
</span></p>
<p>For an APS-C sensor like the D300, I would recommend the 8mm, unless you really need a full uncropped image. The 4.5mm, while being more expensive, also has an aperture of 2.8, compared to the 8mm (f/3.5)</p>
<p>I am not super constrained on time, if you are on set and shooting bracketed probes between takes or something, the 4.5mm will save you two shots (18 pictures) and this might be preferable. That said, it will only generate a 4k image in the end (which might be enough)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=537</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: Simple Decorator Example</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=530</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=530#comments</comments>
		<pubDate>Mon, 28 Jun 2010 07:06:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[decorators]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=530</guid>
		<description><![CDATA[In Python, a Decorator is a type of macro that allows you to inject or modify code in functions or classes. I was turned onto this by my friend Matt Chapman at ILM, but never fully grasped the importance.

class myDecorator&#40;object&#41;:
	def __init__&#40;self, f&#41;:
		self.f = f
	def __call__&#40;self&#41;:
		print &#34;Entering&#34;, self.f.__name__
		self.f&#40;&#41;
		print &#34;Exited&#34;, self.f.__name__
&#160;
@myDecorator
def aFunction&#40;&#41;:
	print &#34;aFunction running&#34;
&#160;
aFunction&#40;&#41;

When you run the [...]]]></description>
			<content:encoded><![CDATA[<p>In Python, a <a href="http://en.wikipedia.org/wiki/Python_syntax_and_semantics#Decorators" target="_blank">Decorator</a> is a type of macro that allows you to inject or modify code in functions or classes. I was turned onto this by my friend Matt Chapman at ILM, but never fully grasped the importance.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">class</span> myDecorator<span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">object</span><span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>, f<span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">f</span> = f
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__call__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span><span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Entering&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">f</span>.__name__
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">f</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Exited&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">f</span>.__name__
&nbsp;
@myDecorator
<span style="color: #5F8BC7;font-weight:bold;">def</span> aFunction<span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;aFunction running&quot;</span>
&nbsp;
aFunction<span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>When you run the code above you will see the following:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">&gt;&gt;Entering aFunction
&gt;&gt;aFunction running
&gt;&gt;Exited aFunction</pre></div></div>

<p>So when we call a decorated function, we get a completely different behavior. You can wrap any existing functions, here is an example of wrapping functions for error reporting:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">class</span> catchAll:
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>, function<span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">function</span> = function
&nbsp;
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__call__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args<span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #5F8BC7;font-weight:bold;">try</span>:
			<span style="color: #5F8BC7;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">function</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #66cc66;">*</span>args<span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #5F8BC7;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, e:
			<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error: %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #C0C0C0;">&#40;</span>e<span style="color: #C0C0C0;">&#41;</span>
&nbsp;
@catchAll
<span style="color: #5F8BC7;font-weight:bold;">def</span> unsafe<span style="color: #C0C0C0;">&#40;</span>x<span style="color: #C0C0C0;">&#41;</span>:
  <span style="color: #5F8BC7;font-weight:bold;">return</span> 1 / x
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;unsafe(1): &quot;</span>, unsafe<span style="color: #C0C0C0;">&#40;</span>1<span style="color: #C0C0C0;">&#41;</span>
<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;unsafe(0): &quot;</span>, unsafe<span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>So when we run this and divide by zero we get:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">unsafe(1):  1
unsafe(0):  Error: integer division or modulo by zero</pre></div></div>

<p>Using decorators you can make sweeping changes to existing code with minimal effort, like the error reporting function above, you could go back and just sprinkle these in older code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=530</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python: Special Class Methods</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=524</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=524#comments</comments>
		<pubDate>Sat, 26 Jun 2010 20:16:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=524</guid>
		<description><![CDATA[I have really been trying to learn some Python fundamentals lately, reading some books and taking an online class. So: wow. I can&#8217;t believe that I have written so many tools, some used by really competent people at large companies, without really understanding polymorphism and other basic Python concepts.
Here&#8217;s an example of my sequence method [...]]]></description>
			<content:encoded><![CDATA[<p>I have really been trying to learn some Python fundamentals lately, reading some books and taking an online class. So: wow. I can&#8217;t believe that I have written so many tools, some used by really competent people at large companies, without really understanding polymorphism and other basic Python concepts.</p>
<p>Here&#8217;s an example of my sequence method from before, but making it a class using special <a href="http://docs.python.org/reference/datamodel.html#specialnames" target="_blank">class methods</a>:</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://docs.python.org/reference/datamodel.html#specialnames</div>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">class</span> imSequence:
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #008000;">dir</span> = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">dirname</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #008000;">file</span> = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">basename</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span>
		segNum = <span style="color: #dc143c;">re</span>.<span style="color: #C0C0C0;">findall</span><span style="color: #C0C0C0;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\d</span>+'</span>, <span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>-1<span style="color: #C0C0C0;">&#93;</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">numPad</span> = <span style="color: #008000;">len</span><span style="color: #C0C0C0;">&#40;</span>segNum<span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">baseName</span> = <span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span>segNum<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>0<span style="color: #C0C0C0;">&#93;</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">fileType</span> = <span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>-1<span style="color: #C0C0C0;">&#93;</span>
		globString = <span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">baseName</span>
		<span style="color: #5F8BC7;font-weight:bold;">for</span> i <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: #C0C0C0;">&#40;</span>0,<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">numPad</span><span style="color: #C0C0C0;">&#41;</span>: globString += <span style="color: #483d8b;">'?'</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">images</span> = <span style="color: #dc143c;">glob</span>.<span style="color: #dc143c;">glob</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">dir</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>'</span>+globString+<span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span>segNum<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>1<span style="color: #C0C0C0;">&#93;</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__len__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span><span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #5F8BC7;font-weight:bold;">return</span> <span style="color: #008000;">len</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">images</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__iter__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span><span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #5F8BC7;font-weight:bold;">return</span> <span style="color: #008000;">iter</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">images</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>Here&#8217;s an example of use:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">seq = imSequence('seq\\test_00087.tga')
print len(seq)
&gt;&gt;94
print 'BaseName: %s  FileType: %s  Padding: %s' % (seq.baseName, seq.fileType, seq.numPad)
&gt;&gt;BaseName: test_  FileType: tga  Padding: 5
for image in seq: print image
&gt;&gt;seq\test_00000.tga
&gt;&gt;seq\test_00001.tga
&gt;&gt;seq\test_000002.tga
...</pre></div></div>

<p>[More info and examples: <a href='http://diveintopython.org/object_oriented_framework/special_class_methods2.html' target=blank>Dive Into Python: Special Class Methods</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=524</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nikon D300 Stereo Rig [$30 DIY]</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=507</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=507#comments</comments>
		<pubDate>Sun, 02 May 2010 22:27:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[photography]]></category>
		<category><![CDATA[stereo3d]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[d300]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[stereo 3d]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=507</guid>
		<description><![CDATA[
This is what the final product will look like. Two D300s, mounted as close as possible, sync&#8217;d metering, focus, flash, and shutter. Rig cost: Less than 30 dollars! Of course you are going to need two d300s and paired lenses, primes or zooms with a wide rubberband spanning them if you are really hardcore. Keep [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-510" title="final_rig" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/05/final1.jpg" alt="" width="600" height="290" /></p>
<p>This is what the final product will look like. Two D300s, mounted as close as possible, sync&#8217;d metering, focus, flash, and shutter. Rig cost: Less than 30 dollars! Of course you are going to need two d300s and paired lenses, primes or zooms with a wide rubberband spanning them if you are really hardcore. Keep in mind, the intraoccular is 13.5cm, this is a tad more than double the normal human width, but it&#8217;s the best we can do with the d300 [horizontal].</p>
<h2>Creating the Camera Bar</h2>
<p>This mainly involves you going to the local hardware store with your D300 and looking at the different L-brackets available. It&#8217;s really critical that you get the cameras as close as possible, so mounting one upside down is preferable. It may look weird, but heck, it already looks weird; might as well go full retard.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-508" title="final_product" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/05/final.jpg" alt="" width="600" height="319" /></p>
<p>I usually get an extra part for the buttons, because they will need to be somewhere that you can easily reach</p>
<h2>Creating the Cabling</h2>
<p>Nikon cables with Nikon 10-pin connectors aren&#8217;t cheap! The <a href="http://www.nikonusa.com/Find-Your-Nikon/ProductDetail.page?pid=4652" target="_blank">MC-22</a>, <a href="http://www.nikonusa.com/Find-Your-Nikon/Photography-Accessories/Other-Cords/4653/MC-23-Connecting-Cord.html" target="_blank">MC-23</a>, <a href="http://www.nikonusa.com/Find-Your-Nikon/Photography-Accessories/Other-Cords/4655/MC-25-Adapter-Cord.html" target="_blank">MC-25</a>, or <a href="http://www.nikonusa.com/Find-Your-Nikon/ProductDetail.page?pid=4660" target="_blank">MC-30</a> are all over 60 dollars! I bought remote shutter cables at <a href="http://www.dealextreme.com/" target="_blank">DealExtreme.com</a>. I wanted to make my own switch, and also be able to use my GPS, and change the intraoccular, so the below describes that setup. If you just want to sync two identical cams, the fastest way is to buy a knock-off MC-23, which is the <a href="http://www.cnjjc.cc/products/seoth-ma23.htm" target="_blank">JJ MA-23</a> or <a href="http://www.fotografdunyasi.com.tr/JJC-MR23-Nikon-Makinalar-icin-Stereo-Cekim-Baglanti-Kablosu,PR-550.html" target="_blank">JJ MR-23</a>. I bought two <a href="http://www.dealextreme.com/details.dx/sku.15812" target="_blank">JueYing  RS-N1</a> remote shutters and cut them up. [$6 each]</p>
<p><img class="aligncenter size-full wp-image-515" title="pinout" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/05/pinout.jpg" alt="" width="561" height="224" /></p>
<p>I only labeled the pins most people would be interested in, for a more in depth pin-out that covers more than AE/AF and shutter (GPS, etc), have a look <a href="http://www.schneordesign.com/Avi/F100/diy_02.htm" target="_blank">here</a>. I decided to use molex connectors from RC cars, they make some good ones that are sealed/water-resistant and not too expensive.</p>
<p><img class="aligncenter size-full wp-image-513" title="DSC_4724" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/05/DSC_4724.jpg" alt="" width="600" height="243" /></p>
<p>So the cables have a pretty short lead. This so that I can connect them as single, double, have an intraoccular as wide or as short as any cable I make.. The next thing is to wire these to a set of AF/AE and shutter buttons.</p>
<p><img class="aligncenter size-full wp-image-514" title="soldering" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/05/soldering.jpg" alt="" width="600" height="442" /></p>
<p>Black focuses/meters and red is the shutter release. It&#8217;s not easy to find buttons that have two press states: half press and full press. If you see above, shutter is the combination of AF/AE, ground, and shutter. This is before the heat shrink is set in place.</p>
<h2>Altogether</h2>
<p>So that should be it. Here&#8217;s my first photo with sync&#8217;d metering, focus, flash, and shutter. They can even do bursts at high speed. Next post I will try to look into the software side, and take a look at lens distortion, vignetting, and other issues.</p>
<p><img class="aligncenter size-full wp-image-519" title="d300_01_anaglyph" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/05/d300_01_anaglyph.jpg" alt="" width="600" height="466" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=507</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dealing with File Sequences in Python</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=499</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=499#comments</comments>
		<pubDate>Mon, 19 Apr 2010 16:49:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[file sequences]]></category>
		<category><![CDATA[image sequences]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=499</guid>
		<description><![CDATA[I have been parsing through the files of other people a lot lately, and finally took the time to make a little function to give me general information about a sequence of files. It uses regex to yank the numeric parts out of a filename, figure out the padding, and glob to tell you how [...]]]></description>
			<content:encoded><![CDATA[<p>I have been parsing through the files of other people a lot lately, and finally took the time to make a little function to give me general information about a sequence of files. It uses regex to yank the numeric parts out of a filename, figure out the padding, and glob to tell you how many files in the sequence. Here&#8217;s the code and an example usage:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#returns [base name, padding, filetype, number of files, first file, last file]</span>
<span style="color: #5F8BC7;font-weight:bold;">def</span> getSeqInfo<span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #008000;">dir</span> = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">dirname</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #008000;">file</span> = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">basename</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span>
	segNum = <span style="color: #dc143c;">re</span>.<span style="color: #C0C0C0;">findall</span><span style="color: #C0C0C0;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\d</span>+'</span>, <span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>-1<span style="color: #C0C0C0;">&#93;</span>
	numPad = <span style="color: #008000;">len</span><span style="color: #C0C0C0;">&#40;</span>segNum<span style="color: #C0C0C0;">&#41;</span>
	baseName = <span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span>segNum<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>0<span style="color: #C0C0C0;">&#93;</span>
	fileType = <span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>-1<span style="color: #C0C0C0;">&#93;</span>
	globString = baseName
	<span style="color: #5F8BC7;font-weight:bold;">for</span> i <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">0</span>,numPad<span style="color: #C0C0C0;">&#41;</span>: globString += <span style="color: #483d8b;">'?'</span>
	theGlob = <span style="color: #dc143c;">glob</span>.<span style="color: #dc143c;">glob</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">dir</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>'</span>+globString+<span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span>segNum<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>1<span style="color: #C0C0C0;">&#93;</span><span style="color: #C0C0C0;">&#41;</span>
	numFrames = <span style="color: #008000;">len</span><span style="color: #C0C0C0;">&#40;</span>theGlob<span style="color: #C0C0C0;">&#41;</span>
	firstFrame = theGlob<span style="color: #C0C0C0;">&#91;</span>0<span style="color: #C0C0C0;">&#93;</span>
	lastFrame = theGlob<span style="color: #C0C0C0;">&#91;</span>-1<span style="color: #C0C0C0;">&#93;</span>
	<span style="color: #5F8BC7;font-weight:bold;">return</span> <span style="color: #C0C0C0;">&#91;</span>baseName, numPad, fileType, numFrames, firstFrame, lastFrame<span style="color: #C0C0C0;">&#93;</span></pre></div></div>

<p>Here is an example of usage:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">print getSeqInfo('E:\\data\\data\\Games\\Project\\CaptureOutput\\Frame000547.jpg')
&gt;&gt;['Frame', 6, 'jpg', 994, 'E:\\data\\data\\Games\\Project\\CaptureOutput\\Frame000000.jpg', 'E:\\data\\data\\Games\\Project\\CaptureOutput\\Frame000993.jpg']</pre></div></div>

<p>I know this is pretty simple, but I looked around a bit online and didn&#8217;t see anything readily available showing how to deal with different numbered file sets. I have needed something like this for a while that will work with anything from OBJs sent from external contractors, to images from After Effects&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=499</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Drop Files on a Python Script</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=494</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=494#comments</comments>
		<pubDate>Sun, 11 Apr 2010 22:33:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[registry]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=494</guid>
		<description><![CDATA[So I have always been wondering how you can create almost like a &#8216;droplet&#8217; to steal the photoshop lingo, from a python script. A while ago I came across some sites showing how to edit shellex in regedit to allow for files to be dropped on any python script and fed to it as args [...]]]></description>
			<content:encoded><![CDATA[<p>So I have always been wondering how you can create almost like a &#8216;droplet&#8217; to steal the photoshop lingo, from a python script. A while ago I came across some sites showing how to edit shellex in regedit to allow for files to be dropped on any python script and fed to it as args (Windows).</p>
<p>It&#8217;s really simple, you grab this reg file [<a href="http://chrisevans3d.com/files/py_drag_n_drop.reg">py_drag_n_drop.reg</a>] and install it.</p>
<p>Now when you drop files onto a python script, their filenames will be passed as args, here&#8217;s a simple script to test.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
&nbsp;
f = <span style="color: #008000;">open</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'c:<span style="color: #000099; font-weight: bold;">\\</span>tmp.txt'</span>, <span style="color: #483d8b;">'w'</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #5F8BC7;font-weight:bold;">for</span> arg <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">argv</span>:
    f.<span style="color: #C0C0C0;">write</span><span style="color: #C0C0C0;">&#40;</span>arg + <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #C0C0C0;">&#41;</span>
f.<span style="color: #C0C0C0;">close</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>When you save this, and drop files onto its icon, it will create tmp.txt, which will look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">X:\projects\2010\python\drag_and_drop\drag_n_drop.py
X:\photos\2010.04 - easter weekend\fuji\DSCF9048.MPO
X:\photos\2010.04 - easter weekend\fuji\DSCF9049.MPO
X:\photos\2010.04 - easter weekend\fuji\DSCF9050.MPO
X:\photos\2010.04 - easter weekend\fuji\DSCF9051.MPO
X:\photos\2010.04 - easter weekend\fuji\DSCF9052.MPO</pre></div></div>

<p>The script itself is the first arg, then all the files. This way you can easily create scripts that accept drops to do things like convert files, upload files, etc..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=494</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MPO to JPS and PNS</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=486</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=486#comments</comments>
		<pubDate>Sun, 11 Apr 2010 20:31:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[photography]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[stereo3d]]></category>
		<category><![CDATA[fuji w1]]></category>
		<category><![CDATA[jps]]></category>
		<category><![CDATA[mpo]]></category>
		<category><![CDATA[pns]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=486</guid>
		<description><![CDATA[I got some good feedback from the last post and updated the script to export JPEG Stereo (JPS) and PNG Stereo (PNS, really.) This way you can convert your images into a single lossless image that you can pop into photoshop and adjust hsv/levels, etc.

import mpo
mpo.makePNS&#40;'DSCF9463.MPO'&#41;
#&#62;&#62;Saving image: DSCF9463.PNS
#&#62;&#62;Save complete.

This is a super simple python script, [...]]]></description>
			<content:encoded><![CDATA[<p>I got some good feedback from the last post and updated the <a href="http://www.chrisevans3d.com/files/mpo.zip">script </a>to export JPEG Stereo (JPS) and PNG Stereo (PNS, really.) This way you can convert your images into a single lossless image that you can pop into photoshop and adjust hsv/levels, etc.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">import</span> mpo
mpo.<span style="color: #C0C0C0;">makePNS</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'DSCF9463.MPO'</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;Saving image: DSCF9463.PNS</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;Save complete.</span></pre></div></div>

<p>This is a super simple python script, no error padding. Also, keep in mind that coming from most modern camera rigs, you are saving like a 20-40 megapixel PNG compressed file here, wait until it says it is done saving, it may take a few seconds.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=486</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Splitting MPO Files with ExifTool and Python</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=479</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=479#comments</comments>
		<pubDate>Sun, 11 Apr 2010 00:58:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[photography]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[stereo3d]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[exif]]></category>
		<category><![CDATA[exiftool]]></category>
		<category><![CDATA[fuji w1]]></category>
		<category><![CDATA[splitting mpo file into two images]]></category>
		<category><![CDATA[stereo]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=479</guid>
		<description><![CDATA[Many stereo cameras are using the new MPO format to store multiple images in a file. Unfortunately, nothing really works with these files (Other than Stereo Photo Maker). Here is a simple python wrapper around ExifTool that will extract the Right and Left image, and return EXIF data as a dict. I think this is [...]]]></description>
			<content:encoded><![CDATA[<p>Many stereo cameras are using the new MPO format to store multiple images in a file. Unfortunately, nothing really works with these files (Other than <a href="http://stereo.jpn.org/eng/stphmkr/" target="_blank">Stereo Photo Maker</a>). Here is a simple <a href="http://www.ChrisEvans3D.com/files/mpo.zip">python wrapper</a> around <a href="http://www.sno.phy.queensu.ca/~phil/exiftool/" target="_blank">ExifTool </a>that will extract the Right and Left image, and return EXIF data as a dict. I think this is probably easier than explaining how to use ExifTool, but you can see from looking at the simple wrapper code.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">import</span> mpo
&nbsp;
<span style="color: #808080; font-style: italic;">#Name of MPO file, name of output, whether or not you want all EXIF in a txt log</span>
mpo.<span style="color: #C0C0C0;">extractImagePair</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'DSCF9463.MPO'</span>, <span style="color: #483d8b;">'DSCF9463'</span>, <span style="color: #008000;">True</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;Created DSCF9463_R.jpg</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;Created DSCF9463_L.jpg</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;Writing EXIF data</span></pre></div></div>

<p>The above leaves you with two images and a text file that has all the EXIF data, even attributes that xnView and other apps do not read:</p>
<p style="text-align: center;"><img class="size-full wp-image-480 aligncenter" title="mpo_py" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/04/mpo_py.gif" alt="" width="488" height="240" /></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">exif =  getExif<span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'DSCF9463.MPO'</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #5F8BC7;font-weight:bold;">print</span> exif<span style="color: #C0C0C0;">&#91;</span><span style="color: #483d8b;">&quot;Convergence Angle&quot;</span><span style="color: #C0C0C0;">&#93;</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;0</span>
<span style="color: #5F8BC7;font-weight:bold;">print</span> exif<span style="color: #C0C0C0;">&#91;</span><span style="color: #483d8b;">&quot;Field Of View&quot;</span><span style="color: #C0C0C0;">&#93;</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;53.7 deg</span>
<span style="color: #5F8BC7;font-weight:bold;">print</span> exif<span style="color: #C0C0C0;">&#91;</span><span style="color: #483d8b;">&quot;Focal Length&quot;</span><span style="color: #C0C0C0;">&#93;</span>
<span style="color: #808080; font-style: italic;">#&gt;&gt;6.3 mm (35 mm equivalent: 35.6 mm)</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=479</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PyQt4 UIC Module Example</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=468</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=468#comments</comments>
		<pubDate>Wed, 07 Apr 2010 21:54:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[ui file]]></category>
		<category><![CDATA[uic]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=468</guid>
		<description><![CDATA[I have been really amazing myself at how much knowledge I have forgotten in the past five or six months&#8230; Most of the work I did in the past year utilized the UIC module to load UI files directly, but I can find very little information about this online. I was surprised to see that [...]]]></description>
			<content:encoded><![CDATA[<p>I have been really amazing myself at how much knowledge I have forgotten in the past five or six months&#8230; Most of the work I did in the past year utilized the UIC module to load UI files directly, but I can find very little information about this online. I was surprised to see that even the trusty old <a href="http://www.amazon.com/Programming-Python-Prentice-Software-Development/dp/product-description/0132354187" target="_blank">Rapid GUI Programming with Python and Qt</a> book doesn&#8217;t cover loading UI files with the UIC module.</p>
<p>So, here is a tiny script with UI file [<a href="http://www.ChrisEvans3d.com/files/pyqt_tutorial.ui" target="_blank">download</a>] that will generate a pyqt example window that does &#8217;stuff&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #5F8BC7;font-weight:bold;">from</span> PyQt4 <span style="color: #5F8BC7;font-weight:bold;">import</span> QtGui, QtCore, uic
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">class</span> TestApp<span style="color: #C0C0C0;">&#40;</span>QtGui.<span style="color: #C0C0C0;">QMainWindow</span><span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span><span style="color: #C0C0C0;">&#41;</span>:
		QtGui.<span style="color: #C0C0C0;">QMainWindow</span>.<span style="color: #0000cd;">__init__</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">ui</span> = uic.<span style="color: #C0C0C0;">loadUi</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'X:/projects/2010/python/pyqt_tutorial/pyqt_tutorial.ui'</span><span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">show</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">connect</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">doubleSpinBox</span>, QtCore.<span style="color: #C0C0C0;">SIGNAL</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">&quot;valueChanged(double)&quot;</span><span style="color: #C0C0C0;">&#41;</span>, spinFn<span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">connect</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">comboBox</span>, QtCore.<span style="color: #C0C0C0;">SIGNAL</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">&quot;currentIndexChanged(QString)&quot;</span><span style="color: #C0C0C0;">&#41;</span>, comboFn<span style="color: #C0C0C0;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">connect</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">pushButton</span>, QtCore.<span style="color: #C0C0C0;">SIGNAL</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">&quot;clicked()&quot;</span><span style="color: #C0C0C0;">&#41;</span>, buttonFn<span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">def</span> spinFn<span style="color: #C0C0C0;">&#40;</span>value<span style="color: #C0C0C0;">&#41;</span>:
	win.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">doubleSpinBoxLabel</span>.<span style="color: #C0C0C0;">setText</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'doubleSpinBox is set to '</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>value<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #5F8BC7;font-weight:bold;">def</span> buttonFn<span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>:
	win.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">setWindowTitle</span><span style="color: #C0C0C0;">&#40;</span>win.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">lineEdit</span>.<span style="color: #C0C0C0;">text</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
<span style="color: #5F8BC7;font-weight:bold;">def</span> comboFn<span style="color: #C0C0C0;">&#40;</span>value<span style="color: #C0C0C0;">&#41;</span>:
	win.<span style="color: #C0C0C0;">ui</span>.<span style="color: #C0C0C0;">comboBoxLabel</span>.<span style="color: #C0C0C0;">setText</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>value<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">' is selected'</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
	app = QtGui.<span style="color: #C0C0C0;">QApplication</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">argv</span><span style="color: #C0C0C0;">&#41;</span>
	win = TestApp<span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #dc143c;">sys</span>.<span style="color: #C0C0C0;">exit</span><span style="color: #C0C0C0;">&#40;</span>app.<span style="color: #C0C0C0;">exec_</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>Change the path to reflect where you have saved the UI file, and when you run the script you should get this:</p>
<p><img class="size-full wp-image-469 alignnone" title="window" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/04/window.gif" alt="" width="286" height="164" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=468</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RigPorn: Uncharted 2</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=462</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=462#comments</comments>
		<pubDate>Wed, 07 Apr 2010 18:32:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[industry]]></category>
		<category><![CDATA[maya]]></category>
		<category><![CDATA[rigging]]></category>
		<category><![CDATA[rigporn]]></category>
		<category><![CDATA[judd simantov]]></category>
		<category><![CDATA[naughty dog]]></category>
		<category><![CDATA[uncharted 2]]></category>
		<category><![CDATA[uncharted2]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=462</guid>
		<description><![CDATA[
My friends Judd and Rich gave a talk on some of the Character Tech behind Uncharted 2. Here are the slides.
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/04/uncharted2.jpg"><img class="aligncenter size-full wp-image-463" title="uncharted2" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/04/uncharted2.jpg" alt="" width="590" height="205" /></a></p>
<p style="text-align: center;">My friends Judd and Rich gave a talk on some of the Character Tech behind Uncharted 2. <a href="http://cmpmedia.vo.llnwd.net/o1/vault/gdc10/slides/simantov_judd_uncharted2_character_pipeline.pdf" target="_blank">Here are the slides</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=462</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PyQt4 in wSciTE</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=458</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=458#comments</comments>
		<pubDate>Wed, 07 Apr 2010 18:04:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[scite]]></category>
		<category><![CDATA[wscite]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=458</guid>
		<description><![CDATA[I have gotten back into some pyqt in my spare time, just because it&#8217;s what I used on a daily basis at the last place I worked at. However, I had trouble getting it to run in my text editor of choice. (SciTE)
I couldn&#8217;t find a solution with like 45 minutes of googling. When trying [...]]]></description>
			<content:encoded><![CDATA[<p>I have gotten back into some <a href="http://www.riverbankcomputing.co.uk/software/pyqt/intro" target="_blank">pyqt</a> in my spare time, just because it&#8217;s what I used on a daily basis at the last place I worked at. However, I had trouble getting it to run in my text editor of choice. (<a href="http://www.scintilla.org/SciTE.html" target="_blank">SciTE</a>)</p>
<p>I couldn&#8217;t find a solution with like 45 minutes of googling. When trying to import PyQt4 it would give me a dll error, but I could paste the code into IDLE and it would execute fine. I found a solution by editing the python preferences of SciTE. I noticed that it wasn&#8217;t running python scripts the way IDLE was, but compiling them (?). I edited the last line to just run the script, and viola! It worked.</p>
<p>Find this line (usually the last):</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">command.1.*.py=python -c &quot;import py_compile; py_compile.compile(r'$(FilePath)')&quot;</pre></div></div>

<p>And change it to:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">command.1.*.py=python &quot;(r'$(FilePath)')&quot;</pre></div></div>

<p>I don&#8217;t really know if this messes anything else up, but it does allow the PyQt4 libs to load and do their thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=458</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>32K Sistine Chapel CubeMap [Python How-To]</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=451</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=451#comments</comments>
		<pubDate>Tue, 30 Mar 2010 17:42:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[michelangelo]]></category>
		<category><![CDATA[PIL]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=451</guid>
		<description><![CDATA[
The Vatican recently put up an interactive Sistine Chapel flash application. You can pan around the entire room and zoom in and out in great detail.
The Vatican is not very open with it&#8217;s art, the reason they scream &#8216;NO PHOTO&#8217; when you pull a camera out in the chapel is that they sold the ability [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/03/sistine_cubemap.jpg"><img class="aligncenter size-full wp-image-452" title="sistine_cubemap" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2010/03/sistine_cubemap.jpg" alt="" width="500" height="375" /></a></p>
<p>The Vatican recently put up an <a href="http://www.vatican.va/various/cappelle/sistina_vr/index.html">interactive Sistine Chapel flash application</a>. You can pan around the entire room and zoom in and out in great detail.</p>
<p>The Vatican is not very open with it&#8217;s art, the reason they scream &#8216;NO PHOTO&#8217; when you pull a camera out in the chapel is that they <a href="http://en.wikipedia.org/wiki/Restoration_of_the_Sistine_Chapel_frescoes">sold the ability to take photos of it to a Japanese TV Station</a> (Nippon TV) for 4.2 million dollars. Because the ceiling has long been in the public domain, the only way they can sell &#8216;the right to photograph&#8217; the ceiling is by screwing over us tourists who visit. If you take a photo, they have no control over that image &#8211;because they don&#8217;t own the copyright of the work.</p>
<p>Many of you who know me, know I am a huge fan of Michelangelo&#8217;s work, this data was just too awesomely tempting and when I saw it posted publicly online, I really wanted to get my hands on the original assets.</p>
<p>Here is a python script to grab all of the image tiles that the flash app reads, and then generate the 8k faces of the cubemap. In the end you will have a 32,000 pixel cubemap.</p>
<p>First we copy the swatches from the website:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">def</span> getSistineCubemap<span style="color: #C0C0C0;">&#40;</span>saveLoc<span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span>
	<span style="color: #808080; font-style: italic;">#define the faces of the cubemap, using their own lettering scheme</span>
	faces = <span style="color: #C0C0C0;">&#91;</span><span style="color: #483d8b;">'f'</span>,<span style="color: #483d8b;">'b'</span>,<span style="color: #483d8b;">'u'</span>,<span style="color: #483d8b;">'d'</span>,<span style="color: #483d8b;">'l'</span>,<span style="color: #483d8b;">'r'</span><span style="color: #C0C0C0;">&#93;</span>
	<span style="color: #808080; font-style: italic;">#location of the images</span>
	url = <span style="color: #483d8b;">'http://www.vatican.va/various/cappelle/sistina_vr/Sistine-Chapel.tiles/l3_'</span>
	<span style="color: #808080; font-style: italic;">#copy all the swatches to your local drive</span>
	<span style="color: #5F8BC7;font-weight:bold;">for</span> face <span style="color: #5F8BC7;font-weight:bold;">in</span> faces:
		<span style="color: #5F8BC7;font-weight:bold;">for</span> x <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: #C0C0C0;">&#40;</span>1,9<span style="color: #C0C0C0;">&#41;</span>:
			<span style="color: #5F8BC7;font-weight:bold;">for</span> y <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: #C0C0C0;">&#40;</span>1,9<span style="color: #C0C0C0;">&#41;</span>:
				<span style="color: #008000;">file</span> = <span style="color: #C0C0C0;">&#40;</span>face + <span style="color: #483d8b;">'_'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>y<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">'_'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>x<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">'.jpg'</span><span style="color: #C0C0C0;">&#41;</span>
				<span style="color: #dc143c;">urllib</span>.<span style="color: #C0C0C0;">urlretrieve</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#40;</span>url + face + <span style="color: #483d8b;">'_'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>y<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">'_'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>x<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">'.jpg'</span><span style="color: #C0C0C0;">&#41;</span>, <span style="color: #C0C0C0;">&#40;</span>saveLoc + <span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
				<span style="color: #dc143c;">urllib</span>.<span style="color: #C0C0C0;">urlcleanup</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#41;</span>
				<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;saved &quot;</span> + <span style="color: #008000;">file</span></pre></div></div>

<p>Next we use <a href="http://www.pythonware.com/products/pil/">PIL </a>to stitch them together:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">def</span> stitchCubeMapFace<span style="color: #C0C0C0;">&#40;</span>theImage, x, y, show<span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">from</span> PIL <span style="color: #5F8BC7;font-weight:bold;">import</span> Image, ImageDraw
	<span style="color: #5F8BC7;font-weight:bold;">from</span> <span style="color: #dc143c;">os</span> <span style="color: #5F8BC7;font-weight:bold;">import</span> path
&nbsp;
	<span style="color: #008000;">file</span> = theImage.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span>-1<span style="color: #C0C0C0;">&#93;</span>
	fileSplit = <span style="color: #008000;">file</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'_'</span><span style="color: #C0C0C0;">&#41;</span>
	im = Image.<span style="color: #008000;">open</span><span style="color: #C0C0C0;">&#40;</span>theImage<span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #808080; font-style: italic;">#create an 8k face from the first swatch</span>
	im = im.<span style="color: #C0C0C0;">resize</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #ff4500;">8000</span>, <span style="color: #ff4500;">8000</span><span style="color: #C0C0C0;">&#41;</span>, Image.<span style="color: #C0C0C0;">NEAREST</span><span style="color: #C0C0C0;">&#41;</span>
	thePath = path.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span>theImage<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: #C0C0C0;">&#93;</span>
&nbsp;
	xPixel = <span style="color: #ff4500;">0</span>
	yPixel = <span style="color: #ff4500;">0</span>
	<span style="color: #808080; font-style: italic;">#loop through the swatches, stitching them together</span>
	<span style="color: #5F8BC7;font-weight:bold;">for</span> y_ <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: #C0C0C0;">&#40;</span>1, x+1<span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #5F8BC7;font-weight:bold;">for</span> x_ <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: #C0C0C0;">&#40;</span>1,y+1<span style="color: #C0C0C0;">&#41;</span>:
			<span style="color: #5F8BC7;font-weight:bold;">if</span> yPixel == <span style="color: #ff4500;">8000</span>:
				yPixel = <span style="color: #ff4500;">0</span>
			nextImage = <span style="color: #C0C0C0;">&#40;</span>thePath + <span style="color: #483d8b;">'/'</span> + fileSplit<span style="color: #C0C0C0;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: #C0C0C0;">&#93;</span> + <span style="color: #483d8b;">'_'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>x_<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">'_'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>y_<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">'.jpg'</span><span style="color: #C0C0C0;">&#41;</span>
			<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'Merging '</span> + nextImage + <span style="color: #483d8b;">' @'</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>xPixel<span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">','</span> + <span style="color: #008000;">str</span><span style="color: #C0C0C0;">&#40;</span>yPixel<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
			loadImage = Image.<span style="color: #008000;">open</span><span style="color: #C0C0C0;">&#40;</span>nextImage<span style="color: #C0C0C0;">&#41;</span>
			im.<span style="color: #C0C0C0;">paste</span><span style="color: #C0C0C0;">&#40;</span>loadImage, <span style="color: #C0C0C0;">&#40;</span>xPixel, yPixel<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
			yPixel += <span style="color: #ff4500;">1000</span>
		xPixel += <span style="color: #ff4500;">1000</span>
	saveImageFile = <span style="color: #C0C0C0;">&#40;</span>thePath + <span style="color: #483d8b;">'/'</span> + fileSplit<span style="color: #C0C0C0;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: #C0C0C0;">&#93;</span> + <span style="color: #483d8b;">'_face.jpg'</span><span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'Saving face: '</span> + saveImageFile<span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #808080; font-style: italic;">#save the image</span>
	im.<span style="color: #C0C0C0;">save</span><span style="color: #C0C0C0;">&#40;</span>saveImageFile, <span style="color: #483d8b;">'JPEG'</span><span style="color: #C0C0C0;">&#41;</span>
	<span style="color: #808080; font-style: italic;">#load the image in default image viewer for checking</span>
	<span style="color: #5F8BC7;font-weight:bold;">if</span> show == <span style="color: #008000;">True</span>:
		<span style="color: #5F8BC7;font-weight:bold;">import</span> <span style="color: #dc143c;">webbrowser</span>
		<span style="color: #dc143c;">webbrowser</span>.<span style="color: #008000;">open</span><span style="color: #C0C0C0;">&#40;</span>saveImageFile<span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>Here is an example of the input params:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">getSistineCubemap<span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'D:/sistineCubeMap/'</span><span style="color: #C0C0C0;">&#41;</span>
stitchCubeMapFace<span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">'D:/sistineCubeMap/r_1_1.jpg'</span>, 8, 8, <span style="color: #008000;">True</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=451</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Avatar: Aspect Ratio Note</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=447</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=447#comments</comments>
		<pubDate>Thu, 31 Dec 2009 17:41:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[film]]></category>
		<category><![CDATA[industry]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[avatar]]></category>
		<category><![CDATA[ilm]]></category>
		<category><![CDATA[stereo]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=447</guid>
		<description><![CDATA[
Theaters presenting Avatar in 2D and Real3D, show a cropped 2.35:1 version, while 3D IMAX shows the original work at 1.85:1. You might not think that this matters, but you are losing a lot of the image in the crop. If you want to see it as the artists/director intended it looks like IMAX 3D [...]]]></description>
			<content:encoded><![CDATA[<p><center><div id="attachment_448" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-448" title="cameron-avatar-aspectratios-compimg" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/cameron-avatar-aspectratios-compimg1.jpg" alt="cameron-avatar-aspectratios-compimg" width="500" height="281" /><p class="wp-caption-text">Size Matters.</p></div></center></p>
<p style="text-align: center;">Theaters presenting Avatar in 2D and Real3D, show a cropped 2.35:1 version, while 3D IMAX shows the original work at 1.85:1. You might not think that this matters, but you are losing a lot of the image in the crop. If you want to see it as the artists/director intended it looks like IMAX 3D is your only option.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=447</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Update</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=417</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=417#comments</comments>
		<pubDate>Sun, 27 Dec 2009 00:34:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=417</guid>
		<description><![CDATA[I haven&#8217;t posted in a while, lots of changes going on, I left ILM after Avatar, and have moved back to Germany where my girlfriend is finishing medical school. I promise a good tech art post soon (my pick for tech art game of the year!) I look to be rejoining Crytek next year, working [...]]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t posted in a while, lots of changes going on, I left ILM after Avatar, and have moved back to Germany where my girlfriend is finishing medical school. I promise a good tech art post soon (my pick for tech art game of the year!) I look to be rejoining Crytek next year, working on Crysis 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Decode the Hype: HP DreamScreen 130 Review</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=409</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=409#comments</comments>
		<pubDate>Sun, 27 Dec 2009 00:33:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=409</guid>
		<description><![CDATA[
Decode the Hype
Being digital artists, photo frames might look like attractive ways to showcase art and content, these devices are being pushed more and more. I got HPs &#8216;flagship&#8217; model as a present, it retails for $300! I was so excited, but not for long. Unable to find any info online especially reviews, I thought [...]]]></description>
			<content:encoded><![CDATA[<p><center><div id="attachment_419" class="wp-caption aligncenter" style="width: 476px"><img class="size-full wp-image-419" title="FAIL" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/HP-DreamScreen.jpg" alt="FAIL." width="466" height="336" /><p class="wp-caption-text">FAIL.</p></div></center></p>
<h2>Decode the Hype</h2>
<p>Being digital artists, photo frames might look like attractive ways to showcase art and content, these devices are being pushed more and more. I got HPs &#8216;flagship&#8217; model as a present, it retails for $300! I was so excited, but not for long. Unable to find any info online especially reviews, I thought I would post this here.</p>
<p>Lets first just get some things out of the way before I talk about the quality of what the device DOES do lets talk about what it does not, yet claims to do.</p>
<h2>Downright Lies</h2>
<p>The following quotes are from the HP site itself:</p>
<blockquote><p>The HP DreamScreen is a gateway to the Internet using your wireless network to access<br />
weather info, Snapfish and your favorite web destinations.</p></blockquote>
<p>This is just untrue. There is no integrated web browser. It has three web &#8216;apps&#8217; on it: SnapFish, Pandora, Facebook. That&#8217;s it. It does not read RSS feeds, or do much of anything you probably want it to do, simple things like display news or recipes.</p>
<blockquote><p>Stay current with social network sites like Facebook</p></blockquote>
<p>&#8216;Like&#8217; facebook? There is only Facebook: nothing else.</p>
<blockquote><p>Be organized with a built-in alarm clock &amp; calendar.</p></blockquote>
<p>This is laughable. Wondering how to sync the calendar with outlook or google or anything; maybe even just add appointments, I finally consulted their online documentation. Here, seriously, is the feature list for the calendar &#8216;app&#8217;:</p>
<blockquote><p>View the current month, press right or left to view the next or previous month.</p></blockquote>
<p>BWAH HA HA HA&#8230; *sigh*</p>
<blockquote><p>Easy wireless access to your digital entertainment</p></blockquote>
<p>It shows an icon for a video, but actually; it doesn&#8217;t stream video, it plays some videos, only at specific resolutions from specific codecs; off physical media.</p>
<blockquote><p><strong>Touch-enabled controls</strong>—Get fast, easy access to information and entertainment with simple touch controls embedded in the display</p></blockquote>
<p>This is referring to some buttons around the bezel of the screen and is just so untrue they would have to change the marketing campaign in Europe or get sued. This does however remind me of the old In Living Color sketch where the handcapped superhero always says he is &#8216;not handicapped, but HANDY-CAPABLE!&#8217;.</p>
<blockquote><p><strong>Videos</strong>—Watch home movies and video clips in full screen – Its simple!</p></blockquote>
<p>It&#8217;s as simple as taking your video, recompressing it to a supported video codec, resizing it to a specific resolution, and then physically transferring it ot the device &#8211;so simple grandma could do it! (with gordian knot, virtualdub, CCCP, and all those other video tools she has)</p>
<h2>Decode the Hype: The Screen</h2>
<p><strong>Resolution</strong></p>
<p>The thing is a frickin&#8217; 300 dollar photo frame, but it&#8217;s resolution is 800 x 480, this equates to <span style="color: #ff0000;">0.38 megapixels</span>, at the time the frame came out, the average cheap point n shoot ranks 9 to 10 megapixels: this is well over twenty times the resolution of the screen!</p>
<p>Because of this,<span style="color: #ff0000;"> it can take 10 full seconds to load a photo and downsample it to 800 pixels from it&#8217;s original resolution. </span>This makes browsing photos a pain, and loading photos from your camera cards nearly useless. Power users will use photoshop or xnView to batch all their content to 800 pixels.</p>
<p><span style="color: #ff0000;">There is aliasing galore</span>, as 800 pixels is the resolution of many phones and handheld devices, not 13&#8243; photo frames!</p>
<p><span style="color: #ff6600;"><strong>UPDATE: </strong>I have talked to HP and done some hunting, uncovering something that is just ridiculous: The DreamScreen 130 has a 1280&#215;800 resolution. However, HPs software only works ar 800&#215;480, the resolution of the cheapest screen, (the 100). To get around this, they upscale to 1280 pixels. This means they down sample your image to 800 pixels, then they upscale it with a software upscaler, so your pictures will <strong><span style="color: #ff0000;">ALWAYS LOOK LIKE JAGGY AND SOFT: NO MATTER WHAT YOU DO.</span></strong> This is a joke, HP should be ashamed of themselves.</span></p>
<p style="text-align: center;"><span style="color: #ff6600;"> </span></p>
<p><center><div id="attachment_437" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/upscaler.jpg"><img class="size-medium wp-image-437 " title="upscaler" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/upscaler-300x150.jpg" alt="Notice the terrible artifacts from the 1280 image, which was downscaled by the frame software, then upscaled to fit the panel." width="300" height="150" /></a><p class="wp-caption-text">Notice the terrible artifacts from the 1280 image, which was downscaled by the frame software, then upscaled to fit the panel.</p></div></center></p>
<p><strong>Color Reproduction</strong></p>
<p>It is a cheap TN panel, the gamma of your images widely fluctuates depending on the angle they are viewed. I would be ok if they had a low resolution but used a nice<a href="http://en.wikipedia.org/wiki/TFT_LCD#In-plane_switching_.28IPS.29" target="_blank"> IPS, SIPS</a>, or <a href="http://en.wikipedia.org/wiki/Oled" target="_blank">OLED </a>panel, but this is just unremarkable. The black point is a dark shade of grey, in all seriousness, the panel quality seems on par with something like the panels they use in the dashboard of a Prius, or other industrial UI readouts.</p>
<p><center><div id="attachment_439" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/banding.jpg"><img class="size-medium wp-image-439" title="banding" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/banding-300x226.jpg" alt="banding" width="300" height="226" /></a><p class="wp-caption-text">Pretty terrible banding</p></div></p>
<p style="text-align: center;">
<p></center></p>
<p><center><div id="attachment_440" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/black_point.jpg"><img class="size-medium wp-image-440 " title="black_point" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/black_point-300x180.jpg" alt="Pretty bad black point" width="300" height="180" /></a><p class="wp-caption-text">Pretty bad black point</p></div></p>
<p style="text-align: center;">
<p></center></p>
<p><center><div id="attachment_441" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/white_point.jpg"><img class="size-medium wp-image-441 " title="white_point" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/white_point-300x245.jpg" alt="Pretty bad white point" width="300" height="245" /></a><p class="wp-caption-text">Pretty bad white point</p></div></p>
<p style="text-align: center;">
<p></center></p>
<p><center><div id="attachment_442" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/contrast.jpg"><img class="size-medium wp-image-442 " title="contrast" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/contrast-300x251.jpg" alt="Pretty mediocre contrast" width="300" height="251" /></a><p class="wp-caption-text">Pretty mediocre contrast</p></div></center></p>
<h2>Decode the Hype: Misc Tech Tidbits</h2>
<p><strong>Streaming / Network<br />
</strong></p>
<p>Streaming requires lots of Microsoft Windows Media software and services running on a PC server in your house that is always on, they relied on this instead of doing the footwork themselves. If you were under the impression from their marketing that it could read files off samba shares or work with Macintosh, you would be wrong.</p>
<p><strong>Software / User Interface<br />
</strong></p>
<p>The software is pretty terrible. It is very clunky and unresponsive. Many times it does not recognize that physical media has been inserted and must be rebooted. The UI graphics themselves show terrible compression artifacts.</p>
<p><center><img class="aligncenter size-full wp-image-432" title="dscreen" src="http://www.chrisevans3d.com/pub_blog/wp-content/uploads/2009/12/dscreen.jpg" alt="dscreen" width="385" height="112" /></center></p>
<p>When you bring up the on screen keyboard to type in, say, the name of the device, it clearly shows buttons like [HTTP://], [www.], [.com], and others to make it easier to browse the web, however there is no web browser! <span style="color: #ff0000;">There are other places in the print ads and UI itself that refer to features the device just does not have!</span></p>
<p><strong>&#8220;Touch Screen&#8221;<br />
</strong></p>
<p>The device claims to have a &#8216;touch sensitive screen&#8217;, and IT DOES! A small area around the bezel of the screen has botons that can be pressed/touched! <span style="color: #ff0000;">This product is in NO WAY a touch screen device, and has no touch sensitivity, other than the buttons on the bezel, the marketing is a lie.</span></p>
<p><strong>Open Source?<br />
</strong></p>
<p>On the CD that ships with it, they have a ton of readme files showing they used a lot of GPL&#8217;d code, however the source installer did not work on my windows 7, x64.</p>
<h2>Conclusion</h2>
<p>Pros:</p>
<ul>
<li>They used Linux and GPL&#8217;d code so they will have to release theirs soon, hopefully it will be taken under the wing of the open source community and all these issues can be fixed by hard working college students and kids in their spare time.</li>
<li>The packaging/box is very high quality with a great look and feel</li>
</ul>
<p>Cons:</p>
<ul>
<li>The screen is low res and low quality</li>
<li>The device is way overpriced for the quality of it&#8217;s screen and software</li>
<li>The docs and UI refer to features that just do not exist</li>
<li>No battery, it must always remain plugged into the wall</li>
<li>Super-glossy, all you may be seeing is windows!</li>
<li>Software-wise, the average cellphone is vastly superior in extensibility and quality (browsing photos, playing mp3s, videos&#8230;)</li>
<li>The UI looks like a rip of cell phone UIs, but only in pictures&#8230; There are no smooth animated transitions, nothing in common with the user interfaces they seemed to want to copy. To an experienced person, the UI feels like something HP outsourced to Asia and sent them a poor art-bible of the end product they were expecting&#8230;</li>
<li>The device seems unfinished</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=409</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>See 25 Minutes of Avatar this Friday, Free!</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=405</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=405#comments</comments>
		<pubDate>Mon, 17 Aug 2009 17:02:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[film]]></category>
		<category><![CDATA[vfx]]></category>
		<category><![CDATA[avatar]]></category>
		<category><![CDATA[ilm]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=405</guid>
		<description><![CDATA[
http://www.avatarmovie.com/
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="avatarPoster" src="http://www.wildaboutmovies.com/images_7/AvatarPoster_000.jpg" alt="" width="325" height="486" /></p>
<p style="text-align: center;"><a href="http://www.avatarmovie.com/" target="_blank">http://www.avatarmovie.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=405</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buggy Camera Issues In Maya on x64</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=399</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=399#comments</comments>
		<pubDate>Wed, 08 Jul 2009 08:43:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[industry]]></category>
		<category><![CDATA[maya]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[overlay]]></category>
		<category><![CDATA[videocard]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=399</guid>
		<description><![CDATA[Many, many people are having weird, buggy camera issues where you rotate a view and it snaps back to the pre-tumbled state (view does not update properly). There are posts all over, and Autodesk&#8217;s official response is &#8220;Consumer gaming videocards are not supported&#8221;. Really? That&#8217;s basically saying: All consumer video cards, gaming or not, are [...]]]></description>
			<content:encoded><![CDATA[<p>Many, many people are having weird, buggy camera issues where you rotate a view and it snaps back to the pre-tumbled state (view does not update properly). There are posts all over, and Autodesk&#8217;s official response is &#8220;Consumer gaming videocards are not supported&#8221;. Really? That&#8217;s basically saying: All consumer video cards, gaming or not, are unsupported. I have had this issue on my laptop, which is surely not a &#8216;gaming&#8217; machine. Autodesk says the &#8216;fix&#8217; is to upgrade to an expensive pro-level video card. But what they maybe would tell you if they weren&#8217;t partnered with nVidia is: It&#8217;s an easy fix!</p>
<p>Find your Maya ENV file:</p>
<p>C:\Documents and Settings\Administrator\My Documents\maya\2009-x64\Maya.env</p>
<p>And add this environment variable to it:</p>
<p>MAYA_GEFORCE_SKIP_OVERLAY=1</p>
<p>Autodesk buried this information in their <a href="http://images.autodesk.com/adsk/files/maya2009latebreakingreleasenotes0.pdf" target="_blank">Maya 2009 Late Breaking Release Notes</a>, <strong>and it fixes the issue completely!</strong> However, even on their official forum, Autodesk employees and moderators reply to these draw errors as follows:</p>
<blockquote><p>Maya 2009 was tested with a finite number of graphics cards from ATI and Nvidia, with drivers from each vendor that provided the best performance, with the least amount of issues. (at the time of product launch).  A list of officially qualified hardware can be found here: <a href="http://www.autodesk.com/maya-hardware" target="_blank">http://www.autodesk.com/maya-hardware</a>. Maya is not qualified/supported on consumer gaming cards.  Geforce card users can expect to have issues.  This is clearly stated in the official qualification charts mentioned above.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=399</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Critical Analysis</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=394</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=394#comments</comments>
		<pubDate>Tue, 30 Jun 2009 03:00:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[film]]></category>
		<category><![CDATA[industry]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=394</guid>
		<description><![CDATA[One of the Year&#8217;s Worst Films
Transformer&#8217;s 2 was rated by critics at around a 18% as shown on Rottentomatoes.com. This is possibly one of the lowest ratings for a hugely expensive summer blockbuster that I can remember. This makes the movie less well reviewed than Species III, Rambo IV, or even Rush Hour III.
But it [...]]]></description>
			<content:encoded><![CDATA[<h2>One of the Year&#8217;s Worst Films</h2>
<p>Transformer&#8217;s 2 was rated by critics at around a 18% as shown on Rottentomatoes.com. This is possibly one of the lowest ratings for a hugely expensive summer blockbuster that I can remember. This makes the movie less well reviewed than <a href="http://www.rottentomatoes.com/m/species_iii/">Species III</a>, <a href="http://www.rottentomatoes.com/m/john_rambo/">Rambo IV</a>, or even <a href="http://www.rottentomatoes.com/m/rush_hour_3/">Rush Hour III</a>.</p>
<p>But it has now shown to have had the second largest opening weekend of all time; raking in over 200 million dollars domestically and 390 million worldwide in it&#8217;s first 5 days. <a href="http://www.boxofficemojo.com/alltime/grossbydays.htm?days=5&amp;p=.htm">This is within 1%</a> of the current reigning champion, Batman: The Dark Knight. Paramount&#8217;s national exit polling revealed that more than 90% of those surveyed said the new movie was as good as or better than the first film. About 67% of moviegoers polled said the film was &#8220;excellent,&#8221; an even better score than that generated by Paramount&#8217;s &#8220;Star Trek,&#8221; one of the year&#8217;s best-reviewed movies.</p>
<p>The critics unanimously told their readers this film was trash, and word of mouth brought the film to within one percent of the Dark Knight. Hell, Transformer&#8217;s 2 was shown on less screens and even grossed more dollars per screen than the Dark Knight.</p>
<h2>So how did a movie that so many flocked to see; nearly toppling the current reigning all time champ, get reviewed so viciously?</h2>
<p>As reviews started to roll in, I saw an interesting thing happen. Some reviews were posted before people had seen the film, trashing the Michael Bay, and not really referencing anything from the film itself. (These were not logged as &#8216;top critics&#8217; on the site.) But it initiated a torrent of others jumping on the hatewagon; beating their chests and scampering in competition to come up with better, more scurrilous, insulting, and defamatory witticisms trashing the director and his film. It became what I termed a giant &#8217;snoodBall&#8217;. Each critic seemed to feel that in order to stand out above the rest, he had to give an even worse, more scathing review. This led to professional critics actually printing things I just find ridiculous:</p>
<p><em>&#8220;I hated every one of the 149 minutes. This is so bad it&#8217;s immoral. Michael Bay is a time-sucking vampire who will feast off your lost time.&#8221;</em><br />
- Victoria Alexander</p>
<p><em>&#8220;Michael Bay has once again transformed garbage into something resembling a film..&#8221;</em><br />
- Jeffrey M. Anderson</p>
<p><em>&#8220;Transformers: The Revenge of The Fallen is beyond bad, it carves out its own category of godawfulness.&#8221;</em><br />
- Peter Travers (<a href="http://www.rollingstone.com/reviews/movie/25458013/review/28840142/transformers_revenge_of_the_fallen">Rolling Stone</a>)</p>
<p>Who can say they actively <strong>*hated*</strong> every minute of a movie? I was so surprised. I had seen an advance screening of the film here at ILM, and I knew it was no Citizen Kane, but it surely isn&#8217;t an 18%! It seems the reviewers are so disjointed from the public they serve. Apparently there comes a certain time when you simply cannot write a decent review for a movie that all your peers said was garbage, and that is when you are just adding to this gigantic hate machine and not really reviewing anything.</p>
<p>If the film would have been reviewed even a little more realistically (I mean come on, Terminator IV even has a 33%!) it would have easily had the 1% more to topple the Dark Knight; possibly becoming the worst reviewed #1 box office hit of all time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=394</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Common Character Issues: Attachments</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=330</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=330#comments</comments>
		<pubDate>Wed, 04 Mar 2009 09:25:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[animation]]></category>
		<category><![CDATA[industry]]></category>
		<category><![CDATA[rigging]]></category>
		<category><![CDATA[games]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=330</guid>
		<description><![CDATA[
I love this picture. It illustrates a few large problems with video games. One of which I have wanted to talk about for a while: Attachments of course. I am talking about the sword (yes, there is a sword, follow her arm to the left side of the image..)
Attaching props to a character that has [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Theres a sword in this image?" src="http://ChrisEvans3D.com/images/blog/attach01.jpg" alt="" width="580" height="326" /></p>
<p>I love this picture. It illustrates a few <em>large </em>problems with video games. One of which I have wanted to talk about for a while: Attachments of course. I am talking about the sword (yes, there is a sword, follow her arm to the left side of the image..)</p>
<p>Attaching props to a character that has to dynamically be seen from every angle through thousands of animations can be difficult. So difficult that people often give up. This was a promotional image for an upcoming Soul Calibur title, this goes to show you how difficult the issue is. Or maybe no one even noticed she was holding a sword. So let&#8217;s look at a promotional image from another game:</p>
<p><img class="aligncenter" title="A more wholesome pic" src="http://ChrisEvans3D.com/images/blog/attach02.jpg" alt="" width="580" height="392" /></p>
<h2>Why does it happen?</h2>
<p>Well, props are often interchangeable. Many different props are supposed to attach to the same location throughout the game. This is generally done by marking up the prop and the skeleton with two attachment points that snap to one another.</p>
<p>In this case you often have one guy modeling the prop, one guy placing the skeleton, and one guy creating the animation. All these people have to work together.</p>
<h2>How can we avoid these problems?</h2>
<p>This problem is most noticeable at the end of the line: you would really only see it in the game. But this is one of the few times you will hear me say that checking it &#8216;in the engine&#8217; is a bad idea. It&#8217;s hard enough to get animators to check their animation, much less test all the props in a &#8216;prop test level&#8217; of sorts.</p>
<p>I feel problems like this mainly show up in magazines and final games because you are leaving it up to QA and other people who don&#8217;t know what to look for. There was a saying I developed while at Crytek when trying to impart some things on new tech art hires: &#8220;Does QA know what your alien should deform like? And should they?&#8221; The answer is no, and it also goes for the things above. Who knows how robotnik grips his bow.. you do, the guy rigging the character.</p>
<p>So in this case I am all for systems that allow animators to instantly load any common weapons and props from the game directly onto the character in the DCC app. You need a system that allows animators to be able to attach any commonly used prop at any time during any animation (especially movement anims)</p>
<h2>Order of operations</h2>
<p>Generally I would say:</p>
<ol>
<li>The animator picks a pivot point on the character. They will be animating/pivoting around this.</li>
<li>The tech artist &#8216;marks&#8217; up the skeleton with the appropriate offset transform.</li>
<li>The modeler &#8216;marks&#8217; his prop and tests it (iteratively) on one character</li>
<li>The tech artist adds the marked up prop (or low res version) to a special file that is streamlined for automagically merging in items. Then adds a UI element that allows the animator to select the prop from a drop down and see it imported and attached to the character.</li>
</ol>
<h2>Complications</h2>
<p>I can remember many heated discussions about problems like this. The more people that really care about hte final product, and the more detailed or realistic games and characters get, the more things like this will be scrutinized.</p>
<p>This is more of a simple problem that just takes care and diligence, whereas things like multiple hand positions and hand poses are a little more difficult. Or attachments that attach via a physics constraint in the engine. There are also other, much more difficult issues in this realm, like exact positioning of AI characters for interacting with each other and the environment, which is another tough &#8217;snap me into the right place&#8217; problem dealing with marking up a character and an item in the world to interact with.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=330</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Make a 3D Game for the Right Reasons! (My SF4 post)</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=298</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=298#comments</comments>
		<pubDate>Mon, 02 Mar 2009 10:15:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[animation]]></category>
		<category><![CDATA[industry]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[sf4]]></category>
		<category><![CDATA[street fighter 4]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=298</guid>
		<description><![CDATA[I ran out and got Street Fighter 4 (SF4) just like everyone else. Street Fighter was &#8216;the game&#8217; you had to beat all the kids in the neighborhood at for an entire generation (sadly replaced by PES), and I have very fond memories of playing it.
SF4 is the first 3D game in the series created [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">I ran out and got Street Fighter 4 (SF4) just like everyone else. Street Fighter was &#8216;the game&#8217; you had to beat all the kids in the neighborhood at for an entire generation (sadly replaced by <a href="http://en.wikipedia.org/wiki/Pro_Evolution_Soccer" target="_blank">PES</a>), and I have very fond memories of playing it.</p>
<p style="text-align: left;">SF4 is the first 3D game in the series created by Capcom, in the past, <a href="http://en.wikipedia.org/wiki/Street_Fighter_EX" target="_blank">Street Fighter EX</a> was developed by <a href="http://en.wikipedia.org/wiki/Arika" target="_blank">Arika</a>, a company formed by one of the creators of the original game as well as many other Capcom employees. Even though porting the franchise to 3D was largely considered a complete and utter failure, they decided to give it another go, this time &#8216;officially&#8217;.</p>
<h2 style="text-align: left;">Strengths and Weaknesses</h2>
<p style="text-align: left;">As artistic mediums, 2D and 3D are very different. 3D art is perspective correct, it is clean, sterile and perfect. It is much simpler to do rotations and transformations of rigid objects in 3D, this is why Disney started doing vehicles as cel shaded 3D objects in their later films. However, it is very difficult to add <em>character </em>to 3D geometry. As an example, think of <a href="http://www.youtube.com/watch?v=MjLVPT9CWJI" target="_blank">Cruella Deville&#8217;s car</a> from 101 Dalmatians, it has <em>character</em>. (When it&#8217;s not overly-rotoscoped from a real life model)</p>
<p style="text-align: left;">2D lends itself to organic shapes, which can be gestural, and are &#8216;rendered&#8217; by a human being; so they&#8217;re never perfect. 3D is great for vehicles and space ships, anything that generally lacks character. 3D is also the only way you are going to get a photo-real gaming experience. For instance; when we were making Crysis, we knew this was the only way, there was never a question of which medium to use.</p>
<p style="text-align: left;">When I go on my &#8216;2D/3D rant&#8217;, I usually hearken back to something I love, so let&#8217;s take a look at the transition of an older game from 2D to 3D: the Monkey  Island Series.</p>
<p style="text-align: left;"><img class="aligncenter" title="The evolution of Guybrush Threepwood" src="http://ChrisEvans3D.com/images/blog/sf4/monkey.jpg" alt="" width="580" height="251" /></p>
<p style="text-align: left;">Many years ago developers felt that in order to compete, they had to ship games with the latest 3D technology. This is really unfortunate, and leads to them choosing to sometimes develop an &#8216;ok&#8217; 3D game over a &#8216;beautiful&#8217; 2D game. I believe in Curse of Monkey Island (last 2D title in the series (so far)), in the options menu there was an option to &#8220;Enable<strong> </strong>3D acceleration&#8221;, upon clicking it, the words &#8220;We were only kidding&#8221; <a href="http://www.mobygames.com/images/shots/original/1087166805-00.gif" target="_blank">and other phrases</a> pop up next to the radio button. The developers were already feeling the pressure to release a 3D game.</p>
<p style="text-align: left;">2D games are still profitable, just look at Xbox Live, where 2D games like <a href="http://www.castlecrashers.com/" target="_blank">Castle Crashers</a> have been some of the top selling titles this year.</p>
<p style="text-align: left;">Lastly, lets not forget that 3D games are actually cheaper, or have been, historically. However, maybe not with some current-gen titles; where garbage cans have 4k texture maps and take two weeks to sculpt in Z Brush. But animation is definitely easier than it ever was. Of course the other side of that argument is that you can now have 6k animations in a game.</p>
<h2 style="text-align: left;">Street Fighter 4 Is A Three Dimensional &#8216;2D&#8217; Game</h2>
<p style="text-align: left;">Before going on, it&#8217;s important to note that in SF4, the characters still move on a 2D plane as they always have. It&#8217;s actually nearly identical to all the other games in the series as far as design.</p>
<p style="text-align: left;">As always, you are pitting your guy up against someone else, and both of your characters are the focal point, they are the only interactive things in a game which centers around them. This is a series that has always been about <em>character</em>, and has always been 2D with great hand drawn art. Remember: Capcom offered fans a 3D game and they did not want it.</p>
<p style="text-align: left;">So, SF4 is a game that takes place in 2D space and focuses on only two characters at any given time. This is great news, it means you can really focus on the characters, moreso than almost any other game genre.</p>
<h2 style="text-align: left;">The Constraints of a 3D Character Art Style</h2>
<p style="text-align: left;">3D characters are driven by &#8216;joints&#8217; or &#8216;bones&#8217;. Each joint has some 3D points rigidly &#8216;glued&#8217; to it, because of this, 3D characters, especially in games, look rigid; like action figures. In my opinion SF4 characters feel like lifeless marionettes. In a 2D game, you can quickly and easily draw any form you want. The more you want to alter the &#8216;form&#8217; a 3D character, the more joints it takes, and the more complex the &#8216;rig&#8217; that drives the character. Also, on consoles, the number of joints you can use are limited. This is easily distinguished when comparing 2D and 3D art:</p>
<p style="text-align: left;"><img class="aligncenter" title="Comparison of 2D and 3D art styles" src="http://ChrisEvans3D.com/images/blog/sf4/compare.jpg" alt="" width="583" height="543" /></p>
<p style="text-align: left;">Notice how the 3D characters look lifeless? They don&#8217;t have to, it&#8217;s just more difficult. Whereas before, adding a cool facial expression meant simply drawing it by hand. Now it means sculpting a 3D shape: by hand. It&#8217;s tedious and difficult. Also, notice how in 3D Chun Li&#8217;s cloth is &#8216;clipping&#8217; into her leg, or Cammy&#8217;s wrist guard is &#8216;clipping&#8217; into her bicep. 3D is much more difficult to get right, because you are messing with sculptures, not drawings. You could also say the foreshortening on Chun Li&#8217;s arm in 2D looks weird; there are trade-offs, but in a 2D pipeline is also much easier to alter character proportions and fix things.</p>
<p style="text-align: left;"><img class="aligncenter" title="SF4 closeups!" src="http://ChrisEvans3D.com/images/blog/sf4/faces.jpg" alt="" width="580" height="193" /></p>
<p style="text-align: left;">There are entire web pages dedicated to the weird faces of SF4 characters. It seems one of the easiest ways to make a character look in &#8216;pain&#8217; was to translate the eyeballs out of the head: it looks ridiculous when compared to the hand-drawn hit reactions:</p>
<p style="text-align: left;"><img class="aligncenter" title="2D Faces" src="http://ChrisEvans3D.com/images/blog/sf4/faces_2d.jpg" alt="" width="580" height="193" /></p>
<p style="text-align: left;">Whereas before you had one guy drawing pictures of a character in motion (maybe someone to color), now it takes a team to do the same job. You often have a modeler, technical artist, and animator, then hopefully a graphics engineer for rendering. That&#8217;s a lot of people to do something one person used to handle, and it introduces not only beaurocracy, but a complicated set of choreographed events that culminate in the final product.</p>
<p style="text-align: center;"><img class="aligncenter" title="Capcom press image" src="http://ChrisEvans3D.com/images/blog/sf4/chunli.jpg" alt="" width="300" height="372" /></p>
<p style="text-align: left;">This is a Capcom press image of Chun Li and it highlights my point exactly. It is harder and much more complicated to <em>sculpt </em>a form than draw it. Not to mention <em>sculpt </em>it over time, using complicated mathematical tools to manipulate geometry. However, it&#8217;s not an impossible task, and to think that this is &#8216;ok&#8217; enough to release as a press image for an upcoming AAA game is crazy.</p>
<p style="text-align: left;">It&#8217;s not just deformation and posing, but animation in general. There is a lot of laziness associated with 3D animation. Let me be more precise: it is easier to &#8216;create&#8217; animation because the computer interpolates between poses for you. As an animator, you have to work much harder to not fall into this &#8216;gap&#8217; of letting the machine do the work for you. Playing SF4 you will see sweeps, hurricane kicks, and various other animations that just rotate the entire character as if on a pin. They also share and recycle the same animations on different characters, this was not possible in 2D.</p>
<p style="text-align: left;"><img class="aligncenter" title="motionblur" src="http://ChrisEvans3D.com/images/blog/sf4/mblur.jpg" alt="" width="591" height="171" /></p>
<p style="text-align: left;">One thing I find interesting is that, though the new game is 3D, it really has no motionblur. The 2D games had Chuck-Jonesesque motionblur drawn into the frames to add a quickness and &#8217;snap&#8217;, but it also adds an organic quality that is lacking in SF4.</p>
<p style="text-align: left;"><strong><span style="color: #d2372d;">EDIT: Having now logged a lot more time playing, there is indeed a weird kind of motion blur, it&#8217;s barely noticeable at all and looks almost hand painted/added.</span></strong></p>
<p style="text-align: left;">Another odd thing, I can spot mocap when I see it, and I think the technique was used on some of the background characters, like the children playing under the bridge. The motion is so stellar that it puts the main characters to shame. That&#8217;s kind of sad. Though, all new characters introduced on the console seem to have much better animation, so maybe this is something Capcom have worked on more.</p>
<h2 style="text-align: left;">So Why Make A 3D Street Fighter?</h2>
<p style="text-align: left;">If you aren&#8217;t going to make a game where characters can move through 3D space (no Z depth), why use a 3D art style, especially when it is harder to create expressive characters?</p>
<p style="text-align: left;">I will offer some reasons to &#8216;reboot&#8217; the Street Fighter franchise as a 3D fighter:</p>
<ul style="text-align: left;">
<li>Finally use collision detection to not have characters clip into one another as they always have</li>
<li>Use physics to blend ragdoll into hit reactions, also for hit detection and impulse generation; maybe allow a punch to actually connect with the opponent (gasp)</li>
<li>Use jiggly bones for something other than breasts/fat, things like muscles and flesh to add a sense of weight</li>
<li>Employ a cloth solver, c&#8217;mon this is a character showcase; if NBA games can solve cloth for all on court characters, you can surely do nice cloth for two.</li>
<li>Markup the skeletons to allow for &#8216;grab points&#8217; so that throw hand positions vary on char size and are unique</li>
<li>Attach proxies to the feet and have them interact with trash/grass on the ground in levels</li>
<li>Use IK in a meaningful way to always look at your opponent, dynamically grab him in mid animation, always keep feet on slightly uneven ground, or hit diff size opponents (or parameterize the anims to do these)</li>
<li>Play different animations on different body parts at different times, you are not locked into the same full body on a frame like 2D</li>
<li>For instance: se &#8216;offset animations&#8217; blended into the main animation set to dynamically create the health of the character, or heck, change the facial animation to make them look more tired/hurt.</li>
<li>Shaders! In 3D you can use many complex shaders, to render &#8216;photorealistic or non-photorealistic images (like cartoons)</li>
<li>You can also write shaders to do things like calculate/add motionblur!</li>
</ul>
<p style="text-align: left;">Unfortunately: <strong>Capcom did none of these</strong>. Sure, a few of the above would have been somewhat revolutionary for the franchise, but as it stands, 3D characters add nothing to SF4, I believe they actually <strong>degrade the quality of the visuals</strong>.</p>
<p style="text-align: left;"><strong><span style="color: #d2372d;">EDIT: After playing more I have noticed that they are using IK (look IK) on just the head bone, shorter characters look up when a large character jumps in front of them.</span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=298</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>First Transformers 2 Teaser Trailer!</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=290</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=290#comments</comments>
		<pubDate>Mon, 02 Feb 2009 08:11:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[trans2]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=290</guid>
		<description><![CDATA[
It&#8217;s exciting that you can see some of our work already! Check out the teaser trailer, be sure to click [watch in high quality]
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="teaserShot" src="http://i62.photobucket.com/albums/h82/mgmanm1/MovieGifs/Xform/dvstr11.gif" alt="" width="440" height="248" /></p>
<p style="text-align: center;">It&#8217;s exciting that you can see some of our work already! Check out the teaser trailer, be sure to click [<a title="trailer link" href="http://www.youtube.com/watch?v=mUNzwZMQYMQ">watch in high quality</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=290</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kavan et al Have Done It!</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=283</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=283#comments</comments>
		<pubDate>Wed, 17 Dec 2008 10:16:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[industry]]></category>
		<category><![CDATA[maxscript]]></category>
		<category><![CDATA[rigging]]></category>
		<category><![CDATA[bake deformation]]></category>
		<category><![CDATA[ladislav kavan]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=283</guid>
		<description><![CDATA[
Ladislav Kavan is presenting a paper entitled &#8216;Automatic Linearization of Nonlinear Skinning&#8216; at the 2009 Symposium on Interactive 3D Graphics and Games on skinning arbitrary deformations! Run over to his site and check it out. In my opinion, this is the holy grail of sorts. You rig any way you want, have complex deformation that [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignnone" title="Read the paper and watch the video!" src="http://ChrisEvans3D.com/images/blog/kavan.png" alt="" width="291" height="156" /></p>
<p>Ladislav Kavan is presenting a paper entitled &#8216;<strong>Automatic Linearization of Nonlinear Skinning</strong>&#8216; at the 2009 Symposium on Interactive 3D Graphics and Games on skinning arbitrary deformations! Run over to <a href="http://isg.cs.tcd.ie/kavanl/" target="_blank">his site</a> and check it out. In my opinion, this is the holy grail of sorts. You rig any way you want, have complex deformation that can only solve at 1 frame an hour? No problem, bake a range of motion to pose-driven, procedurally placed, animated, and weighted joints. People, Kavan included, have been presenting papers in the past with systems somewhat like this, but nothing this polished and final. I have talked to him about this stuff in the past and it&#8217;s great to see the stuff he&#8217;s been working on and that it really is all I had hoped for!</p>
<p>This <em>will </em>change things.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=283</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Quantic Dreams</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=272</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=272#comments</comments>
		<pubDate>Sat, 13 Dec 2008 04:53:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[animation]]></category>
		<category><![CDATA[industry]]></category>
		<category><![CDATA[motion capture]]></category>
		<category><![CDATA[mocap]]></category>
		<category><![CDATA[quantic dream]]></category>
		<category><![CDATA[uncanny valley]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=272</guid>
		<description><![CDATA[




No longer working for Crytek, maybe I can comment on some industry related things without worrying that my opinions could be misconstrewn as those of my former employer.
EuroGamer visited Quantic Dream this week, the studio working on the game &#8216;Heavy Rain&#8217;, who&#8217;s founder, de Fondaumière, arrogantly proclaimed that there was &#8216;no longer an uncanny valley&#8216;, [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter" style="width: 576px;">
<dt class="wp-caption-dt"><img title="This is what it looks like on the other side of the uncanny valley." src="http://images.eurogamer.net/assets/articles//a/3/1/0/3/9/9/ss_preview_2.jpg.jpg" alt="This is what it looks like on the other side of the uncanny valley." width="566" height="317" /></dt>
</dl>
</div>
<p>No longer working for Crytek, maybe I can comment on some industry related things without worrying that my opinions could be misconstrewn as those of my former employer.</p>
<p>EuroGamer visited Quantic Dream this week, the studio working on the game &#8216;Heavy Rain&#8217;, who&#8217;s founder, de Fondaumière, arrogantly proclaimed that there was &#8216;<a href="http://www.ps3fanboy.com/2007/12/18/heavy-rain-devs-have-conquered-the-uncanny-valley/" target="_blank">no longer an uncanny valley</a>&#8216;, and that there are &#8216;<a href="http://www.eurogamer.net/article.php?article_id=310434" target="_blank">very, very few</a>&#8216; real artists in the video game industry. (A real class act, no?)</p>
<p>So their article starts with &#8220;We can&#8217;t tell you how Heavy Rain looks, sounds or plays&#8230;&#8221;, which I find kind of ridiculous seeing as how the studio&#8217;s only real claim to fame right now is the hype of it&#8217;s co-founder who casually claims they have accomplished one of the most amazing visual feats in the history of computer graphics (in real-time no less!).</p>
<p>Across the world there are thousands of outstanding artists chasing this same dream, from Final Fantasy, to Polar Express and Beowulf; people have tried to cross the &#8216;uncanny valley&#8217; for years, and are getting closer every day. At Christmas you will be treated to what is probably one of the <a href="http://www.youtube.com/watch?v=07kBrLhByUk&amp;feature=related" target="_blank">closest attempts yet</a>. (Digital Domain&#8217;s work in Benjamin Button)</p>
<p>Not really having any videos to back up the hyperbole, they gave the EuroGamer staff a laundry list of <a href="http://www.eurogamer.net/article.php?article_id=310435" target="_blank">statistics about their production</a>.</p>
<p>I have yet to see anything stunning to back up the talk, 8 months after making his statement about crossing the uncanny valley, they released <a href="http://www.youtube.com/watch?v=MP260in3ph4" target="_blank">this video</a>, which was just not even close, to be frank.</p>
<p>It looks like they aren&#8217;t using performance capture. <a href="http://images.eurogamer.net/assets/articles//a/3/1/0/4/5/3/ss_preview_IMG_7017.JPG.jpg" target="_blank">Without markers on the face</a> this means they have to solve the facial animation from elsewhere, usually a seated actress who pretends to be saying lines that were said in the other full body capture session. There&#8217;s a reason why studios like Imageworks don&#8217;t do this, it&#8217;s hard to sync the two performances together. If they have accomplished what other&#8217;s have not, with much less hardware/technology, it means they have some of the best artists/animators out there, and I say hats off to them.</p>
<p>But with every image they do release, and every arrogant statement, it is digging the hole deeper. The sad thing is they could release of of the greatest interactive experiences yet, but their main claim is the most realistic cg humans yet to be seen, and if they fail at this, it will overshadow everything.</p>
<p>At least they know how their fellow ps3 devs over at Guerilla must have been feeling for a few years now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=272</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>24&#8243;+ Monitor Panels in One Easy Table (TN/PVA/IPS)</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=236</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=236#comments</comments>
		<pubDate>Sun, 30 Nov 2008 05:25:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[displays]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[monitors]]></category>
		<category><![CDATA[tn]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=236</guid>
		<description><![CDATA[The market is flooded with cheap &#8216;TN&#8217; TFT panels. TN (twisted nematic) panels are terrible when it comes to reproducing color and have a very limited viewing angle. I used to have one and if I just slouched in my chair (or sat up too straight) the black level would change drastically. These panels are [...]]]></description>
			<content:encoded><![CDATA[<p>The market is flooded with cheap &#8216;TN&#8217; <a href="http://en.wikipedia.org/wiki/TFT_LCD" target="_self">TFT panels</a>. TN (twisted nematic) panels are terrible when it comes to reproducing color and have a very limited viewing angle. I used to have one and if I just slouched in my chair (or sat up too straight) the black level would change drastically. These panels are much cheaper to manufacture, so vendors have been flocking to them for years.</p>
<p>As artists, we need at least _decent_ color, even on our home machines. Because it can sometimes be difficult to determine the actual panel used in a diaplay, and because I care, I have compiled a list of &gt; 24&#8243; monitors and their panel type. I really would have liked to have seen this last week.</p>
<table id="tblMain" border="0" cellpadding="0" cellspacing="0" BORDERCOLOR=DIMGRAY>
<tbody>
<tr>
<td>
<table id="tblMain_0" class="tblGenFixed" style="width: 491px; height: 1161px;" border="1" cellpadding="0" cellspacing="0" BORDERCOLOR=DIMGRAY>
<tbody>
<tr>
<td style="width: 159px;"><b>Product</b></td>
<td style="width: 87px;"><b>Panel Type</b></td>
<td style="width: 37px;"><b>Size</b></td>
<td style="width: 41px;"><b>HDMI</b></td>
<td style="width: 40px;"><b>Price</b></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 2433BW</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG T240HD</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 2443BWX</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 2443BW </td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 2493HM</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 245BW</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG T260HD</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 2693HM</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG 305T</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">1100</td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG XL30</td>
<td style="width: 87px;"><font color=green>PVA / LED</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">3000</td>
</tr>
<tr>
<td style="width: 159px;">SAMSUNG SM2693HM</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">NEC LCD2690WUXi</td>
<td style="width: 87px;"><font color=green>IPS</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">1200</td>
</tr>
<tr>
<td style="width: 159px;">NEC LCD3090WQXi</td>
<td style="width: 87px;"><font color=green>IPS</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">2200</td>
</tr>
<tr>
<td style="width: 159px;">NEC S2409W</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">NEC 24WMGX3</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">DELL 2407WFP</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">YES</td>
<td style="width: 40px;">&#8211;</td>
</tr>
<tr>
<td style="width: 159px;">DELL 2408WFP</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">YES</td>
<td style="width: 40px;">517</td>
</tr>
<tr>
<td style="width: 159px;">DELL 3008WFP</td>
<td style="width: 87px;"><font color=green>IPS</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">YES</td>
<td style="width: 40px;">2000</td>
</tr>
<tr>
<td style="width: 159px;">DELL 3007WFP-HC</td>
<td style="width: 87px;"><font color=green>IPS</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">1400</td>
</tr>
<tr>
<td style="width: 159px;">DELL 2709W</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">27&#8243;</td>
<td style="width: 41px;">YES</td>
<td style="width: 40px;">900</td>
</tr>
<tr>
<td style="width: 159px;">DELL S2409W</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">EIZO SX3031W</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">3000</td>
</tr>
<tr>
<td style="width: 159px;">EIZO SX2761W</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">27&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">2000</td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">GATEWAY XHD3000</td>
<td style="width: 87px;"><font color=green>PVA</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">YES</td>
<td style="width: 40px;">1000</td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">HP W2408C</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">HP W2558HC</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">HP LP3065</td>
<td style="width: 87px;"><font color=green>IPS</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">1260</td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">LG W2600H-PF</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">LG W3000H-Bn</td>
<td style="width: 87px;"><font color=green>IPS</font></td>
<td style="width: 37px;">30&#8243;</td>
<td style="width: 41px;">NO</td>
<td style="width: 40px;">1240</td>
</tr>
<tr>
<td style="width: 159px;">LG W2452T</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">24&#8243;</td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;"></td>
<td style="width: 87px;"></td>
<td style="width: 37px;"></td>
<td style="width: 41px;"></td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">VIEWSONIC VP2650WB</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">VIEWSONIC VA2626WM</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">26&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
<tr>
<td style="width: 159px;">VIEWSONIC VX2835WM</td>
<td style="width: 87px;"><font color=red>TN</font></td>
<td style="width: 37px;">28&#8243;</td>
<td style="width: 41px;">&#8211;</td>
<td style="width: 40px;"></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=236</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Best Buy? I think not!</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=230</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=230#comments</comments>
		<pubDate>Sat, 29 Nov 2008 05:50:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[best buy]]></category>
		<category><![CDATA[customers]]></category>
		<category><![CDATA[lie]]></category>
		<category><![CDATA[overpriced]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[rip off]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=230</guid>
		<description><![CDATA[I really needed a stick of 800mhz DDR2. There&#8217;s a Best Buy somewhat close to here so I went over. When I get there, I see they have one stick of Kingston Value RAM, however it&#8217;s 145 DOLLARS. Thinking this was clearly a typo, I headed to the &#8216;Geek Squad&#8217; guy at the register who [...]]]></description>
			<content:encoded><![CDATA[<p>I really needed a stick of 800mhz DDR2. There&#8217;s a Best Buy somewhat close to here so I went over. When I get there, I see they have one stick of Kingston Value RAM, however it&#8217;s <a href="http://www.bestbuy.com/site/olspage.jsp?skuId=8986332&amp;type=product&amp;id=1218005634725" target="_blank">145 DOLLARS</a>. Thinking this was clearly a typo, I headed to the &#8216;Geek Squad&#8217; guy at the register who scanned it and told me:</p>
<p>&#8216;<strong>Nope, that&#8217;s how much this kind of RAM costs, it&#8217;s really a special kind</strong>&#8216;. (yeah &#8216;value&#8217;)</p>
<p>I replied that it certainly was not. That is should be under 50 bucks &#8216;at any store&#8217;, he then laughed and told me that they match prices, but not &#8216;<strong>online only stores</strong>&#8216;, to which I replied: &#8216;<strong>name a store, any store and that&#8217;s the price I will use</strong>&#8216;. He said Fry&#8217;s (a popular brick and mortar store in Palo Alto) and we pulled up the website. The same RAM was <a href="http://shop4.frys.com/product/5622651?site=sr:SEARCH:MAIN_RSLT_PG" target="_blank">33 DOLLARS</a>! Not on sale; nothing.</p>
<p>He called the manager, who came and said they couldn&#8217;t price match with a difference that large. I leveled with them&#8230; &#8216;<strong>Guys, look, it&#8217;s one stick of &#8216;value&#8217; RAM. My PC is broken. I rode my bike here. Fry&#8217;s is in Palo Alto. I would pay double what it is at Frys, I am not tryin to rip you off, but I will not, on principle, bend over and take it like this; five times normal retail price is ridiculous!</strong>&#8216;</p>
<p>The manager, seeing people behind me, started to talk down to me &#8216;<strong>We aren&#8217;t ripping you off, you are trying to price match to another store&#8217;s black friday ad! we only price match to real, non-sale prices!</strong>&#8216;</p>
<p>I said &#8216;<strong>Look, it&#8217;s not a sale item, your own guy brought it up, name any store, where will you price match to?</strong>&#8216; He thought for a min &#8216;<strong>Central Computers, on Howard..</strong>&#8216; (they are not a chain and it would probably be more expensive..) &#8216;Ok, pull that up!&#8217; We pulled the site up and the ram was <a href="http://www.centralcomputers.com/commerce/catalog/product.jsp?product_id=59469&amp;czuid=1227936558453" target="_blank">34 DOLLARS</a>!</p>
<p>He turned to me quietly: &#8216;<strong>50 is as low as we can go.</strong>&#8216;   &#8216;<strong>Sold!</strong>&#8216;</p>
<p>I used to think Best Buy was decent, when you needed a component, if they had it, why go anywhere else? They are such a large chain that they can really discount items because they purchase in bulk. Like I said, this is what I used to think&#8230; While I have been in Germany the past 4 years apparently things have changed.</p>
<p>Have any of you seen anything this bad? <span style="color: #ff0000;"><strong>Charging $145 for something all other retailers have for &lt; $35 is just wrong.</strong></span> It irks me that they pay these &#8216;geeks&#8217; in their &#8217;squad&#8217; to tell people lies from behind this knowledgeable facade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=230</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Change of Venue</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=224</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=224#comments</comments>
		<pubDate>Sun, 16 Nov 2008 07:19:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[industry]]></category>
		<category><![CDATA[ilm]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=224</guid>
		<description><![CDATA[I am now living in San Francisco! My last day at Crytek was October 31st, and it was pretty difficult for me as it is one of the best companies I have ever worked for. I have so much respect for all the guys that helped constantly push the envelope and make Crytek the renowned [...]]]></description>
			<content:encoded><![CDATA[<p>I am now living in San Francisco! My last day at Crytek was October 31st, and it was pretty difficult for me as it is one of the best companies I have ever worked for. I have so much respect for all the guys that helped constantly push the envelope and make Crytek the renowned world player that it is today.</p>
<p>I started last week as a Creature TD at Industrial Light + Magic; about the only thing that could wrench me away from Frankfurt. I have always been so interested in creatures and anatomy, and, from a young age, considered ILM the best of the best when it came to these. I feel very lucky to be able to join another great team of people, and not only that, but learn so much from them on a daily basis.</p>
<p>I don&#8217;t know what effect that will have on this blog. I can continue to comment on games stuff, but, being a large company ILM is a lot more restrictive in what I can do (even in my spare time!) versus Crytek. Not to mention I will be very, very busy the next few months.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=224</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Weekend Python Snippet- IsItThere.py (Pt. 2)</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=216</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=216#comments</comments>
		<pubDate>Sun, 26 Oct 2008 12:54:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[filesystem]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=216</guid>
		<description><![CDATA[So, before we looked at just outputting a list of the files that were on device1 and not device2, now I will copy the files to a folder on the main device.
The tricky thing about this is I want the directory structure intact. After looking as os.path, and pywin32, I didn&#8217;t see anything like &#8216;mkdir&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>So, before we looked at just outputting a list of the files that were on device1 and not device2, now I will copy the files to a folder on the main device.</p>
<p>The tricky thing about this is I want the directory structure intact. After looking as os.path, and pywin32, I didn&#8217;t see anything like &#8216;mkdir&#8217; where it would make all the folders deep needed to recreate the branch that a file was in. I did however find a function <a href="http://code.activestate.com/recipes/82465/" target=blank>online</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">def</span> mkdir<span style="color: #C0C0C0;">&#40;</span>newdir<span style="color: #C0C0C0;">&#41;</span>:
    <span style="color: #5F8BC7;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">isdir</span><span style="color: #C0C0C0;">&#40;</span>newdir<span style="color: #C0C0C0;">&#41;</span>:
        <span style="color: #5F8BC7;font-weight:bold;">pass</span>
    <span style="color: #5F8BC7;font-weight:bold;">elif</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">isfile</span><span style="color: #C0C0C0;">&#40;</span>newdir<span style="color: #C0C0C0;">&#41;</span>:
        <span style="color: #5F8BC7;font-weight:bold;">raise</span> <span style="color: #008000;">OSError</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #483d8b;">&quot;a file with the same name as the desired &quot;</span> \
                      <span style="color: #483d8b;">&quot;dir, '%s', already exists.&quot;</span> <span style="color: #66cc66;">%</span> newdir<span style="color: #C0C0C0;">&#41;</span>
    <span style="color: #5F8BC7;font-weight:bold;">else</span>:
        head, tail = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">split</span><span style="color: #C0C0C0;">&#40;</span>newdir<span style="color: #C0C0C0;">&#41;</span>
        <span style="color: #5F8BC7;font-weight:bold;">if</span> head <span style="color: #5F8BC7;font-weight:bold;">and</span> <span style="color: #5F8BC7;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">isdir</span><span style="color: #C0C0C0;">&#40;</span>head<span style="color: #C0C0C0;">&#41;</span>:
            mkdir<span style="color: #C0C0C0;">&#40;</span>head<span style="color: #C0C0C0;">&#41;</span>
        <span style="color: #5F8BC7;font-weight:bold;">if</span> tail:
            <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">mkdir</span><span style="color: #C0C0C0;">&#40;</span>newdir<span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>To copy the files and create the directories, I altered the previous script a bit:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">for</span> <span style="color: #C0C0C0;">&#40;</span>path, dirs, files<span style="color: #C0C0C0;">&#41;</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">walk</span><span style="color: #C0C0C0;">&#40;</span>path2<span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">for</span> <span style="color: #008000;">file</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> files:
		<span style="color: #5F8BC7;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">basename</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span> <span style="color: #5F8BC7;font-weight:bold;">not</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> filenames:
			newPath = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">abspath</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">join</span><span style="color: #C0C0C0;">&#40;</span>path,<span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>.<span style="color: #C0C0C0;">replace</span><span style="color: #C0C0C0;">&#40;</span>path2,<span style="color: #C0C0C0;">&#40;</span>path1 + <span style="color: #483d8b;">'isItThere//'</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
			fileFull = <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">abspath</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">join</span><span style="color: #C0C0C0;">&#40;</span>path,<span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
			<span style="color: #5F8BC7;font-weight:bold;">print</span> fileFull + <span style="color: #483d8b;">&quot; not found in &quot;</span> + path1 + <span style="color: #483d8b;">&quot; file cloud&quot;</span>
			<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Copying &quot;</span> + fileFull + <span style="color: #483d8b;">&quot; &gt;&gt;&gt; &quot;</span> + newPath
			<span style="color: #5F8BC7;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">isdir</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">dirname</span><span style="color: #C0C0C0;">&#40;</span>newPath<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span> == <span style="color: #008000;">False</span>:
				mkdir<span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">dirname</span><span style="color: #C0C0C0;">&#40;</span>newPath<span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
			win32file.<span style="color: #C0C0C0;">CopyFile</span> <span style="color: #C0C0C0;">&#40;</span>fileFull, newPath, <span style="color: #ff4500;">0</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span></pre></div></div>

<p>The results printed should look like below, the files should have been copied accordingly and the directories created.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">U:\photos\Crystal\Orlando - Lauras wedding\P0003270.jpg not found in D:\photos\Crystal\ file cloud
Copying U:\photos\Crystal\Orlando - Lauras wedding\P0003270.jpg &gt;&gt;&gt; D:\photos\Crystal\isItThere\Orlando - Lauras wedding\P0003270.jpg
U:\photos\Crystal\Orlando - Lauras wedding\P0003271.jpg not found in D:\photos\Crystal\ file cloud
Copying U:\photos\Crystal\Orlando - Lauras wedding\P0003271.jpg &gt;&gt;&gt; D:\photos\Crystal\isItThere\Orlando - Lauras wedding\P0003271.jpg
U:\photos\Crystal\Orlando - Lauras wedding\P0003272.jpg not found in D:\photos\Crystal\ file cloud</pre></div></div>

<p>If I had time, or perhaps when I have time, I&#8217;ll add MD5 checks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=216</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Weekend Python Snippet- IsItThere.py (Pt. 1)</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=209</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=209#comments</comments>
		<pubDate>Sat, 25 Oct 2008 16:01:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[filesysetm]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=209</guid>
		<description><![CDATA[I am anal-retentive about data retention. There, I said it. There are many times when I find myself in the situation of having two storage devices, that may or may not have duplicate files. I then want to erase one, but do I have all those files backed up?
I use two existing programs to aid [...]]]></description>
			<content:encoded><![CDATA[<p>I am anal-retentive about data retention. There, I said it. There are many times when I find myself in the situation of having two storage devices, that may or may not have duplicate files. I then want to erase one, but do I have all those files backed up?</p>
<p>I use two existing programs to aid me in my anal-retentivity: <a href="http://www.codesector.com/teracopy.php" target=blank>TerraCopy</a> and <a href="http://www.winmerge.org/" target=blank>WinMerge</a>. Terracopy replaces the windows default copy with something much better (can hash check files when they are copied, etc). With WinMerge, I can right click a folder and say &#8216;Compare To&#8230;&#8217; then right click another and say &#8216;Compare&#8217;. This tells me any differences between the two file/folder trees.</p>
<p>However, here&#8217;s an example I have not yet found a good solution for:</p>
<p>I want to erase a camera card I have, I am pretty certain I copied the images off &#8211;but how can I be sure! I took those images and sorted them into folders by location or date taken.</p>
<p>So I wrote a small and I am sure inefficient python script to help:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #5F8BC7;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
filenames = <span style="color: #C0C0C0;">&#91;</span><span style="color: #C0C0C0;">&#93;</span>
&nbsp;
i = <span style="color: #ff4500;">1</span>
&nbsp;
path1 = <span style="color: #483d8b;">'D://photos//south america//'</span>
path2 = <span style="color: #483d8b;">'N://DCIM//100ND300//'</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">isdir</span><span style="color: #C0C0C0;">&#40;</span>path1<span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">isdir</span><span style="color: #C0C0C0;">&#40;</span>path2<span style="color: #C0C0C0;">&#41;</span>:
		<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;creating index..&quot;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">for</span> <span style="color: #C0C0C0;">&#40;</span>path, dirs, files<span style="color: #C0C0C0;">&#41;</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">walk</span><span style="color: #C0C0C0;">&#40;</span>path1<span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">for</span> <span style="color: #008000;">file</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> files:
		filenames.<span style="color: #C0C0C0;">append</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">basename</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span>
&nbsp;
<span style="color: #5F8BC7;font-weight:bold;">for</span> <span style="color: #C0C0C0;">&#40;</span>path, dirs, files<span style="color: #C0C0C0;">&#41;</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">walk</span><span style="color: #C0C0C0;">&#40;</span>path2<span style="color: #C0C0C0;">&#41;</span>:
	<span style="color: #5F8BC7;font-weight:bold;">for</span> <span style="color: #008000;">file</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> files:
		<span style="color: #5F8BC7;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">basename</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span> <span style="color: #5F8BC7;font-weight:bold;">not</span> <span style="color: #5F8BC7;font-weight:bold;">in</span> filenames:
			<span style="color: #5F8BC7;font-weight:bold;">print</span> <span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">abspath</span><span style="color: #C0C0C0;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: #C0C0C0;">path</span>.<span style="color: #C0C0C0;">join</span><span style="color: #C0C0C0;">&#40;</span>path,<span style="color: #008000;">file</span><span style="color: #C0C0C0;">&#41;</span><span style="color: #C0C0C0;">&#41;</span> + <span style="color: #483d8b;">' not found in '</span> + path1 + <span style="color: #483d8b;">' file cloud'</span></pre></div></div>

<p>This will print something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">N:/DCIM/100ND300/image.NEF not found in D:/photos/south america/ file cloud</pre></div></div>

<p>I don&#8217;t use python that often at all, please lemme know if there&#8217;s a better way to be doing this.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=209</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Autodesk Acquires Softimage for 35 Million</title>
		<link>http://www.chrisevans3d.com/pub_blog/?p=207</link>
		<comments>http://www.chrisevans3d.com/pub_blog/?p=207#comments</comments>
		<pubDate>Fri, 24 Oct 2008 10:50:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.chrisevans3d.com/pub_blog/?p=207</guid>
		<description><![CDATA[Really? Wow, I mean this isn&#8217;t as surprising as when they bought Alias 3 years ago (182 Million), but still. And 35 million? That&#8217;s the price of a single movie or three year videogame production these days. I thought the &#8216;desk bought Maya to kill it, but it&#8217;s still around&#8230; Wonder how long XSI will [...]]]></description>
			<content:encoded><![CDATA[<p>Really? Wow, I mean this isn&#8217;t as surprising as when they bought Alias 3 years ago (182 Million), but still. And 35 million? That&#8217;s the price of a single movie or three year videogame production these days. I thought the &#8216;desk bought Maya to kill it, but it&#8217;s still around&#8230; Wonder how long XSI will be around now.</p>
<p><a href="http://usa.autodesk.com/adsk/servlet/item?id=12022457&amp;siteID=123112" target="_blank">http://usa.autodesk.com/adsk/servlet/item?id=12022457&amp;siteID=123112</a></p>
<p>Maybe they will merge all three teams into one highly experienced, &#8216;all-star&#8217; development team to make a new 3d app to end all 3d apps.</p>
<p>Aren&#8217;t there laws about these kinds of monopolies? Looks like the Lightwave and C43D guys are your only alternative..</p>
<p>One less booth at SIGGRAPH..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisevans3d.com/pub_blog/?feed=rss2&amp;p=207</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
