<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>3d-graphics &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/3d-graphics/</link>
	<description>Feed of posts on WordPress.com tagged "3d-graphics"</description>
	<pubDate>Sun, 06 Dec 2009 15:32:43 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[B-Splines: Better Math]]></title>
<link>http://exerciseforthereader.wordpress.com/2009/12/05/b-splines-better-math/</link>
<pubDate>Sun, 06 Dec 2009 02:13:57 +0000</pubDate>
<dc:creator>Seth Porter</dc:creator>
<guid>http://exerciseforthereader.wordpress.com/2009/12/05/b-splines-better-math/</guid>
<description><![CDATA[In the previous three parts of this series, we&#8217;d sorted out why B-splines are interesting curv]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>In the previous three parts of this series, we&#8217;d sorted out why <a title="B-splines are interesting curves" href="http://exerciseforthereader.wordpress.com/2009/11/01/the-b-spline-series-motivation/" target="_blank">B-splines are interesting curves</a>, <a title="attempted to sort out B-splines terminology" href="http://exerciseforthereader.wordpress.com/2009/11/01/b-spline-definitions/" target="_blank">attempted to sort out B-splines terminology</a>, and decided that <a title="it would be really nice to be able to evaluation them with uniform functions" href="http://exerciseforthereader.wordpress.com/2009/11/01/an-aside-about-uniformit/" target="_blank">it would be really nice to be able to evaluation them with uniform functions</a>. I&#8217;d tried some quick and dirty approaches to force it to be, and had gotten little in response. It was time to actually do some algebra and figure out what was going on.</p>
<h2 id="ANoteAboutTools">A Note About Tools</h2>
<p>That means there are going to be a lot of LaTex-created images in this section. Sorry, but it&#8217;s a lot less painful than trying to write out math in raw HTML. (Okay, writing this inspired me to search for LaTex to MathML translators, and of course the W3 itself maintains quite a <a title="LaTex to MathML translators" href="http://www.w3.org/Math/Software/mathml_software_cat_converters.html" target="_blank">nice list</a>. Oh well, I promise I&#8217;ll look into that for next time.) In the meantime, I&#8217;m using the wiki built into <a href="http://trac.edgewall.org/">Trac</a> to write this post, with the <a href="http://trac-hacks.org/wiki/TracMathPlugin">TracMath</a> plugin to take inline LaTeX blocks and render them as PNGs. This means that I just type</p>
<pre>#!latex
$$N_{i,k}(v)={{\left(
  T_{k+i} - v\right)\,N_{i+1,k-1}(v)}\over{T_{k+i}-T_{i+1}}} +
  {{\left(v-T_{i}\right)\,N_{i,k-1}(v)}\over{T_{k+i-1}-T_{i} }}$$
</pre>
<p>and I get</p>
<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><a href="http://exerciseforthereader.wordpress.com/files/2009/12/n_i_k_v.png"><img class="size-full wp-image-117" title="Sample LaTex equation" src="http://exerciseforthereader.wordpress.com/files/2009/12/n_i_k_v.png" alt="Sample LaTex equation" width="398" height="40" /></a></dt>
</dl>
</div>
<p>Well, okay, <em>I</em> don&#8217;t write that, because I can&#8217;t remember LaTeX math syntax to save my life. (I got pretty good at it in college, but it&#8217;s been a while.) Anyway, it&#8217;s hard to parse by eye, and I&#8217;m very prone to swap a <em>u</em> for a <em>v</em>, which can be unfortunate when you&#8217;ve just carefully <a title="drawn a distinction between them" href="http://exerciseforthereader.wordpress.com/2009/11/01/b-spline-definitions/" target="_blank">drawn a distinction between them</a>.</p>
<p>Instead, I&#8217;m using <a href="http://maxima.sourceforge.net/">Maxima</a>, a free Computer Algebra System. It&#8217;s stranger to pick up than Mathematica, but the price is right (and it&#8217;s quite powerful once you get used to its ways). It seems to be really flaky on recent Ubuntu releases, which is unfortunate, but I&#8217;m primarily using 5.17.0 for Windows and it works like a champ. It has a very nice <tt>tex</tt> function, which will spit out the TeX formatting for any given expression.</p>
<p>So in practice, I work the math in Maxima, have it convert to TeX, then paste that into the post. (Sometimes I tweak it slightly, for example to pull out a leading &#8220;1/2&#8243; rather than leaving the whole expression over 2 as Maxima seems to prefer. But for the most part, the expressions in the text are directly out of Maxima.) I have some ideas of writing a Trac plugin to close the loop and directly evaluate and typeset Maxima expressions in the text, but I haven&#8217;t got it all worked out yet: the equations in a piece generally build on each other, so you need enough lifecycle awareness to start and maintain a separate Maxima state for each page in flight. Also you probably need some non-displayed helper definitions and intermediate values, so you need a separate bit of syntax to indicate what should be rendered into the page. I think the fact of the existence of the <a href="http://trac.edgewall.org/browser/trunk/trac/wiki/macros.py">PageOutlineMacro</a> means it&#8217;s possible, but the fact that the PageOutlineMacro actually re-parses the whole page means it&#8217;s not necessarily easy. (I&#8217;d also still have to solve creating and maintaining enough state that the various individual blocks could fetch their expression / formatted results from the initial gather-and-run macro.) Anyway, for the moment I&#8217;ll do it the hard way.</p>
<h2 id="BacktotheMath">Back to the Math</h2>
<p>I&#8217;m going to run through a concrete k=3 (quadratic) example with 6 control points (so n=5), and claim that this demonstrates a general solution for k=3. I&#8217;m pretty sure it does, but it&#8217;s a lot easier to keep track of the indexes with a concrete number. Or so I claim.</p>
<p>So, the knot vector <strong>T</strong> should be the sequence <em>[0, 0, 0, 1, 2, 3, 4, 4, 4]</em>. Recall that indices are zero-based, and that N<sub>i,1</sub> is defined as</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/n_i_1_v.png"><img class="aligncenter size-full wp-image-118" title="N_(i,1)(v)" src="http://exerciseforthereader.wordpress.com/files/2009/12/n_i_1_v.png" alt="N_(i,1)(v) = (if t_i" width="297" height="18" /></a></p>
<p>Given this, the N<sub>i,1</sub> terms will start being interesting at <em>i=2</em>, where N<sub>2,1</sub>= 1 for 0 &#60;= u &#60; 1. From then on, each N<sub>i,1</sub> is non-zero on N<sub>i,1</sub>= 1 for i-2 &#60;= u &#60; i-2+1, up through the last value we need at N<sub>5,1</sub>. Using Maxima to evaluate the raw B-spline equation</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/b_3_v.png"><img class="aligncenter size-full wp-image-119" title="B_3_v" src="http://exerciseforthereader.wordpress.com/files/2009/12/b_3_v.png" alt="" width="162" height="45" /></a></p>
<p>for our knot vector <strong>T</strong> (again, this is the <em>k=3</em> case), we get a whomping huge expression in terms of the control points <strong>P</strong>, the N<sub>i,1</sub> &#8220;switches&#8221;, and of course <em>v</em>. I won&#8217;t reproduce the whole thing here (fully expanded, there are 33 terms, and even my new wider columns can&#8217;t handle that), but here&#8217;s the coefficient of the second control  point <strong>P<sub>1</sub></strong> for flavor:</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/b_3_v_expanded.png"><img class="aligncenter size-full wp-image-120" title="One term of B_3(v)" src="http://exerciseforthereader.wordpress.com/files/2009/12/b_3_v_expanded.png" alt="" width="549" height="42" /></a></p>
<h3 id="ExplicitEquationsforEachSegment">Explicit Equations for Each Segment</h3>
<p>The good thing is that we don&#8217;t ever really need the whole equation at once. Only one of the <em>N<sub>i,1</sub></em> terms will be 1 at any given time &#8212; this is what produces the curve segments. By setting N<sub>2,1</sub> through N<sub>5,1</sub> to 1 in turn (and the other N<sub>i,1</sub> terms to 0) we can produce the four curve segments. In turn, these are</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/explicit_bspline_segments.png"><img class="aligncenter size-full wp-image-121" title="Explicit B-spline segments" src="http://exerciseforthereader.wordpress.com/files/2009/12/explicit_bspline_segments.png" alt="Explicit B-spline segments" width="444" height="177" /></a></p>
<h3 id="MaximaScript">Maxima Script</h3>
<p>For anyone who&#8217;s following along at home, here&#8217;s the Maxima to get our results so far:</p>
<pre>N(N1, T, i, k, v) := if k = 1 then N1[i] else
(if T[i+k-1] = T[i] then 0 else (v- T[i])* N(N1, T, i, k-1, v) / (T[i+k-1] - T[i]))
 +
(if T[i+k] = T[i+1] then 0 else (T[i+k] - v) * N(N1, T, i+1, k-1, v) / (T[i+k] - T[i+1]));

BSpline(P, N1, T, n, k, v) := sum(P[i] * N(N1, T, i, k, v), i, 0, n);
T5Vals : [0, 0, 0, 1, 2, 3, 4, 4, 4];
T5[i] := T5Vals[i+1];

BSpline5_3(v) = BSpline(P, N1, T5, 5, 3, v);

makeN1Helper(curveSeg, n, k) := makelist(if j - k + 3 = curveSeg then 1 else 0, j, 0, n-1);
BSpline5_3_Seg(seg, P, u) := BSpline(P, makeN1Helper(seg, 5, 3), T5, 5, 3, u);
for seg : 1 step 1 thru 4 do disp(
  segment[seg] = facsum(ratsimp(
    BSpline5_3_Seg(seg, P, v)), P[seg-1], P[seg], P[seg+1]));
</pre>
<p>Note that Maxima lists are one-based, hence the helper function <em>T5</em> to preserve the zero-based indexing in the original definitions. Since <em>N<sub>i,0</sub></em> is never referenced, I can get away with a list starting at index 1 (though I admit this is made more confusing by the choice of a zero-based loop variable. Oops.) Also note that <em>BSpline5_3</em> wasn&#8217;t actually defined as a function there &#8212; that was just an equality, to make Maxima print it out nicely. Other than that, this is pretty much what it looks like. Oh, and notice that the recursive <em>N</em> definition has to avoid a couple of divide by zero cases to implement the &#8220;where 0/0 is defined to be 0&#8243; escape hatch.</p>
<h3 id="Reparamaterization">Reparamaterization</h3>
<p>Okay, those equations work but they look pretty ugly (and they&#8217;re different in each segment, but we&#8217;ll work on that in a minute). It took me a while to sort this out, but I sort of tipped my hand back in the &#8220;Definitions&#8221; post where I introduce <em>w</em> and <em>j</em>, so I&#8217;ll just repeat the equation from there: <em>v = u (n-k+2) = j+w-1</em>. Remember that <em>j</em> is the segment number ranging from 1 to <em>n-k+2</em>, which is exactly the subscript of <em>segment</em> in the explicit equations above. So we substitute <em>w-1</em> in the first equation, <em>1+w-1</em> in the second and so forth. Using the Maxima definitions above, this is just evaluating the <em>BSpline5_3_Seg</em> function above at <em>seg+w-1</em> rather than <em>v</em>:</p>
<pre class="wiki">for seg : 1 step 1 thru 4 do disp(
  segment[seg] = facsum(ratsimp(
    BSpline5_3_Seg(seg, P, seg+w-1)), P[seg-1], P[seg], P[seg+1]));
</pre>
<p>(the <em>facsum</em> bit just rearranges the terms) yielding</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/reparameterized_bspline_segments.png"><img class="aligncenter size-full wp-image-122" title="Reparameterized B-spline segments" src="http://exerciseforthereader.wordpress.com/files/2009/12/reparameterized_bspline_segments.png" alt="Reparameterized B-spline segments" width="415" height="177" /></a></p>
<p>Now we&#8217;re getting somewhere. The middle two equations are identical except for shifted subscripts on <strong>P</strong>. The first two and last two are different, but we can work that out in a minute. First let&#8217;s generalize the uniform version and check our claim that</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/b_uniform_k3.png"><img class="aligncenter size-full wp-image-123" title="Uniform B-spline for k=3" src="http://exerciseforthereader.wordpress.com/files/2009/12/b_uniform_k3.png" alt="Uniform B-spline for k=3" width="473" height="40" /></a></p>
<p>works for those middle terms. This will also give us a peek at the what&#8217;s going on with the end segments.</p>
<pre class="wiki">B3[uniform](P, j, w) := (-P[j]*(2*w^2-2*w-1)+P[j+1]*w^2+P[j-1]*(w-1)^2)/2;
for seg : 1 step 1 thru 4 do disp(
  difference[seg] = ratsimp(
    BSpline5_3_Seg(seg, P, seg+w-1) - B3[uniform](P, seg, w))
);
</pre>
<p>yielding</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/uniform_differences.png"><img class="aligncenter size-full wp-image-124" title="B-spline segment differences from uniform" src="http://exerciseforthereader.wordpress.com/files/2009/12/uniform_differences.png" alt="B-spline segment differences from uniform" width="416" height="131" /></a></p>
<p>What we&#8217;re computing here is the difference between the &#8220;real&#8221; equation for each of the four segments and what we get from using the uniform equation for all of the segments (ignoring the segment number).</p>
<p>Doesn&#8217;t look immediately promising, but there are two good things:</p>
<ul>
<li>the two middle segments are as predicted by the uniform function above</li>
<li>the two end segments&#8217; differences only involve two control points</li>
</ul>
<p>We know that <em>P<sub>1</sub></em> and <em>P<sub>4</sub></em> are used in the middle two segments as well as the end segments, so we can&#8217;t do anything to them. However, the two end points (<em>P<sub>0</sub></em> and <em>P<sub>5</sub></em>) are only used in the end segments. So what it we feed some different value (not the current <em>P<sub>0</sub></em>, but some combination of <em>P<sub>0</sub></em> and <em>P<sub>1</sub></em>) into the uniform equation? Can we make the result be the same as evaluating the &#8220;real&#8221; B-spline function on the original control points?</p>
<p>In the uniform version of segment 1, we replace <em>P<sub>0</sub></em> with a new variable <em>x</em>, then set it equal to the real first segment of the <em>k=3</em> B-spline:</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/seg_1_with_free_p0.png"><img class="aligncenter size-full wp-image-125" title="Segment 1 with p0 as free variable" src="http://exerciseforthereader.wordpress.com/files/2009/12/seg_1_with_free_p0.png" alt="Segment 1 with p0 as free variable" width="686" height="37" /></a></p>
<p>We then solve for <em>x</em> hoping we can eliminate all the <em>w</em> terms:</p>
<pre class="wiki">rightAnswer : ratsimp(BSpline5_3_Seg(1, P, 1+w-1));
uniformWithFreeP0 : ratsubst(x, P[0], B3[uniform](P, 1, w));
solve(uniformWithFreeP0 = rightAnswer, x);
</pre>
<p>and we get (<strong>drumroll, please</strong>)</p>
<p><a href="http://exerciseforthereader.wordpress.com/files/2009/12/2p_0-p_1.png"><img class="aligncenter size-full wp-image-126" title="x=2*p_0-p_1" src="http://exerciseforthereader.wordpress.com/files/2009/12/2p_0-p_1.png" alt="x=2*p_0-p_1" width="98" height="14" /></a></p>
<p>(Okay, that didn&#8217;t really need a LaTeX block, but it really did take me quite a while to figure out, and I was inexplicably happy when I found it (literally: one very really reason for this whole series is to explain to my wife why I was grinning so much that week). If I&#8217;d happened to have run into that formula up front I would have spared myself a great deal of frustrating math trying to figure out how to make sense of what I was seeing. Of course, I also wouldn&#8217;t have learned a lot about splines, so maybe it was better this way.)</p>
<p>Repeating the process for the last control point (in this case <em>P<sub>5</sub></em>), we get <em>x = 2 P<sub>5</sub>-P<sub>4</sub></em>:</p>
<pre class="wiki">rightAnswer2 : ratsimp(BSpline5_3_Seg(4, P, 4+w-1));
uniform2WithFreeP0 : ratsubst(x, P[5], B3[uniform](P, 4, w));
solve(uniform2WithFreeP0 = rightAnswer2, x);
</pre>
<p>This is a reassuring result &#8212; the equations are all symmetric, so it should be possible to reverse the control points and produce the same curve. Therefore, it&#8217;s nice to see that this formulation for the end-points is also symmetric.</p>
<p>So the practical upshot of this is that we now have a way to evaluate all the segments of a B-spline, even the &#8220;weird&#8221; end segments, with the same uniform equation. To do this, we have to massage the control points a little. Given the input sequence</p>
<blockquote><p><em>( P<sub>0</sub> , P<sub>1</sub> , &#8230; , P<sub>n-1</sub> , P<sub>n</sub> )</em></p></blockquote>
<p>we need to make a copy, so we can feed the uniform function the sequence</p>
<blockquote><p><em>( 2 P<sub>0</sub> &#8211; P<sub>1</sub> , P<sub>1</sub> , &#8230; , P<sub>n-1</sub> , 2 P<sub>n</sub> &#8211; P<sub>n-1</sub> )</em></p></blockquote>
<p>instead. That doesn&#8217;t seem like much of a price to pay for freedom (or at least for being able to evaluate all segments of all k=3 B-splines curves with the same straight-line evaluation code).</p>
<p>The same general approach works for k=4 curves (cubic B-splines). Because the cubic blending functions involve more points in each segment, we have to replace both <em>P0</em> and <em>P1</em> with free variables, and solve for them simultaneously (using the known equations for the first <em>two</em> segments, instead of just the first segment), but it&#8217;s the same logic and it works quite nicely. I haven&#8217;t tried to generalize a formula for any value of <em>k</em>, mostly because quadratic and cubic B-splines are far more common than other types.</p>
<p>This took much longer to post than I&#8217;d planned, but I hope it was worth the wait for someone. I can absolutely guarantee that this isn&#8217;t an original result, but I haven&#8217;t actually seen it in Wikipedia or MathWorld or the usual suspects, so I feel entitled to be slightly smug.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Visit Chyron at Government Video Expo]]></title>
<link>http://chyronchat.com/2009/11/25/visit-chyron-at-government-video-expo/</link>
<pubDate>Wed, 25 Nov 2009 18:17:42 +0000</pubDate>
<dc:creator>chyronchat</dc:creator>
<guid>http://chyronchat.com/2009/11/25/visit-chyron-at-government-video-expo/</guid>
<description><![CDATA[Don&#8217;t miss Chyron at Government Video Expo next week at booth 720!  Chyron understands your bu]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:center;"><img class="aligncenter" src="http://www.gvexpo.com/2009/images/widget.gif" alt="" /></p>
<p>Don&#8217;t miss Chyron at Government Video Expo next week at booth 720!  Chyron understands your business models and requirements and will be offering rapid ROI in a truly collaborative environment utilizing centralized graphics distribution &#38; resources.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Fanboy Friday: Tricks With Light]]></title>
<link>http://iblueyonder.wordpress.com/2009/11/06/fanboy-friday-tricks-with-light/</link>
<pubDate>Fri, 06 Nov 2009 21:34:05 +0000</pubDate>
<dc:creator>spotlope</dc:creator>
<guid>http://iblueyonder.wordpress.com/2009/11/06/fanboy-friday-tricks-with-light/</guid>
<description><![CDATA[Did you ever come across a screenshot from flight simulator that made you just stop and gape? One th]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Did you ever come across a screenshot from flight simulator that made you just stop and gape? One that, at first glance, looked like a photograph instead of a computer-based sim? I had one of those moments this week, and it got me thinking about what makes some simulated objects appear more or less &#8220;real&#8221; than others. Hint: it&#8217;s all in the lighting. <!--more--></p>
<p>Two add-on previews got me thinking about lighting; <a href="http://www.flytampa.org/forum/viewtopic.php?t=3846&#38;postdays=0&#38;postorder=asc&#38;start=30#top" target="_blank">Fly Tampa&#8217;s new Caribbean airports project</a>, and <a href="http://www.classics-hangar.de/vorschau_fw190_spaet_en.htm" target="_blank">Classics Hangar&#8217;s FW-190</a>. The two products couldn&#8217;t be more different in terms of subject matter, execution, or overall feel. What they share is a nuanced and detailed approach in representing how light interacts with objects, and how manipulating shadows and highlights can lend those objects weight and volume.</p>
<h3>Modeling Light, Not Just Objects</h3>
<p><a href="http://www.flytampa.org/forum/files/tvsb1_150.jpg"><img class="alignright" src="http://www.flytampa.org/forum/files/tvsb1_150.jpg" alt="" width="300" height="157" /></a>At right is the shot that first intrigued me. It&#8217;s not the fanciest model I&#8217;ve ever seen, nor is it a particularly daring composition.  What it does have is an excellent balance between light and shadow. The metal of the roofs is just shiny enough, bright but not overdone, and stands out in stark contrast with the even green of the jungle behind it. Looking below the roof line, you can see the shadows cast by the deep eaves onto the walls below. There&#8217;s a bit of reflection in the windows, but it&#8217;s subtle.</p>
<p><a href="http://www.flytampa.org/forum/files/tvsc1_517.jpg"><img class="alignleft" src="http://www.flytampa.org/forum/files/tvsc1_517.jpg" alt="" width="299" height="145" /></a>Then there&#8217;s this shot &#8211; another terminal at another airport in this package. Again, nothing dramatic, but look at how the shadows under those thatched peaks gives the recessed areas such depth. The thatch work isn&#8217;t shiny, so there&#8217;s not much contrast between the lights and darks, unlike the red roof nearby. In both shots, the overall contrast is low, which simulates the hazy, moisture-laden air of the tropics. You can almost hear the mosquitos buzzing and the brightly-colored birds twittering.</p>
<p>I&#8217;ve seen a lot of technically very proficient models not look half as real and alive as the ones in these two shots. Often times, a modeler will be so obsessed with making sure their textures are tack-sharp that they opt to repeat a small, detailed texture across a broad surface. Inevitably, the effect is less realistic, rather than more, because the human eye is so highly attuned to picking up patterns. All it takes is a whiff of perceived repetition, and all the visual trickery you&#8217;re striving for goes up in smoke.</p>
<p>Neither of the two FlyTampa screenshots depict overly sharp textures. Instead, they use their slight softness to good effect, by replacing repetition with natural variation. Look at the corrugated metal roofs in the first shot. Yes, technically, the surface is made up of repeating lines that form a pattern. But look closer&#8230; the metal has stains and streaks, random slight shadows and raised spots, none of which follow a pattern. It&#8217;s the little things that are barely noticable at first glance that give those buildings that extra presence.</p>
<h3>Hand-Drawn or Photos?</h3>
<p>In a very different vein, there are these preview pics of Classics Hangar&#8217;s upcoming <a href="http://www.classics-hangar.de/vorschau_fw190_spaet_en.htm" target="_blank">Focke-Wulf FW190 (Late Variants)</a> release. The more I see of this project, the more it blows me away. Nick Churchill has been churning out preview pics, and these shots are from <a href="http://forum.siminsider.co.uk/viewtopic.php?f=28&#38;t=554" target="_blank">the collection of shots on his forum</a>.</p>
<p><a href="http://www.screenshotartist.co.uk/images/classics_hangar/fw190/ch_fw190_000.jpg"><img class="alignright" src="http://www.screenshotartist.co.uk/images/classics_hangar/fw190/ch_fw190_000.jpg" alt="" width="300" height="187" /></a>Have a look at the dashboard to the right. If your first instinct is that it uses photographic textures, you could certainly be forgiven. This is a masterful example of a technique called &#8220;baking in&#8221; the shadows, in which the 3D modeling software analyzes the model&#8217;s geometry and factors in how light would bounce around the space. My favorite part of this shot? The ever-so-subtle shadows beneath the gauge bezels. That&#8217;s not FS lighting, my friends, that&#8217;s pure rendered shadowing, quite possibly heavily tweaked by the devs as well. Look at the shadow under the gyro compass to the right. It&#8217;s darker, deeper, and less distinct than those of its counterparts to the left, in keeping with the fact that the gauge itself stands out from the panel more. This is a perfect example of how shadows complement the gauges, increasing the sense of substance.</p>
<p><a href="http://www.screenshotartist.co.uk/images/classics_hangar/fw190/ch_fw190_001.jpg"><img class="alignleft" src="http://www.screenshotartist.co.uk/images/classics_hangar/fw190/ch_fw190_001.jpg" alt="" width="300" height="187" /></a>Here&#8217;s a close-up shot of the gauge faces. Notice the way the shadowing on the inner disc of the turn indicator suggests not only the slight backset to that part of the gauge, but that it&#8217;s a curved surface as well. Lean in a little closer, and you see something else &#8211; the needles in the gauges are casting shadows! Think about it. Not only have they modeled the shadow, but they&#8217;ve tied it to the needle movement, which means it&#8217;s not part of the gauge face, but a separately-moving item all its own. I&#8217;m not sure whether it&#8217;s done purely in the textures or with bump mapping, but even the stamped inscriptions on the gauge faces are there.</p>
<p>What these shots prove is that hand-drawn textures can actually trump photos in terms of perceived realism. Yes, it takes a great deal of skill and patience to work at this level, but the results are nothing short of phenomenal.</p>
<p>So the next time you&#8217;re thinking to yourself how much a particular add-on appeals to you, stop to consider how much the lighting has to do with it. Reflected light is the way we humans see things, so mimicking the play of that light across a surface is something that 3D modelers have to give a lot of thought to. How they handle it is what makes the difference between a good product and a great one.</p>
<p>Happy flying!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Orbx Unveils Pacific Northwest Video]]></title>
<link>http://iblueyonder.wordpress.com/2009/11/03/orbx-unveils-pacific-northwest-video/</link>
<pubDate>Tue, 03 Nov 2009 15:05:14 +0000</pubDate>
<dc:creator>spotlope</dc:creator>
<guid>http://iblueyonder.wordpress.com/2009/11/03/orbx-unveils-pacific-northwest-video/</guid>
<description><![CDATA[Cody Bergland of Jaggyroad Films just released his latest opus, a preview of Orbx&#8217;s upcoming F]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Cody Bergland of <a href="http://www.jaggyroadfilms.com/" target="_blank">Jaggyroad Films</a> just released his latest opus, a preview of Orbx&#8217;s upcoming FTX NA Blue: Pacific Northwest scenery. Not only do you get stunning views of this gorgeous part of the world (though I may be biased), but also a couple of peeks at the first two payware airports designed to fit within it &#8211; 1S2 Darrington Municipal, and 7S3 Stark&#8217;s Twin Oaks (okay, I&#8217;m definitely biased). Watch it below, sure, but this is one that&#8217;s worth downloading <a href="http://www.jaggyroadfilms.com/movies/commercial/flightsimulator/orbx_pnw_wmv.zip" target="_blank">the high res version</a>.</p>
<p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/xhApzPe9YrA&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;hd=0' /><param name='allowfullscreen' value='true' /><param name='wmode' value='transparent' /><embed src='http://www.youtube.com/v/xhApzPe9YrA&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;hd=0' type='application/x-shockwave-flash' allowfullscreen='true' width='425' height='350' wmode='transparent'></embed></object></span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[An Aside About Uniformity]]></title>
<link>http://exerciseforthereader.wordpress.com/2009/11/01/an-aside-about-uniformit/</link>
<pubDate>Sun, 01 Nov 2009 21:51:04 +0000</pubDate>
<dc:creator>Seth Porter</dc:creator>
<guid>http://exerciseforthereader.wordpress.com/2009/11/01/an-aside-about-uniformit/</guid>
<description><![CDATA[Before getting into a correct treatment of the problem, and deriving a correct way to handle these d]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Before getting into a correct treatment of the problem, and deriving a correct way to handle these differing end segments (as part of the B-spline series of posts), I should explain what I mean by &#8220;uniform&#8221; and why I&#8217;m so hung up on it. (That is, other than the fact that the B<sub>uniform</sub> function is an easily-understood mixing of three control points, while the recursive definition of the basis functions makes my head hurt.) In particular, why not just accept a solution along the lines of:</p>
<pre class="wiki">function evaluateBSplineWithConditional(u) =
v = u * (n-k+2)
segment = floor(v)
w = fractional_part(v)
if(segment &#60;= 1) then
  do weird thing(segment, w)
else
  do uniform thing(segment, w)</pre>
<p>(I may have got the indexing slightly wrong, but I think this works (and is a good illustration of why I was being so pedantic about u, v, and w above &#8212; it&#8217;s not complex math, but it&#8217;s easy to mess up the parameterization).) Also note that I&#8217;m only looking at the weirdness at the beginning of the curve; properly the conditional would need to check whether the segment was at <em>either</em> end of the curve. This is a simplified version to support the discussion, not an actual implementation.</p>
<p>Endpoints are often exceptional cases; why not just define the evaluation with that exceptional case and move on? All the more so since my attempted trick of &#8220;pre-conditioning the data&#8221; (replacing the original sequence of control points with a sequence with repeats at the beginning and end) didn&#8217;t work? (An important background assumption to the rest of this discussion is that this function is going to be run many many times, since we need a lot of points on that curve to make it look like a smooth curve when we draw it on-screen, or when we send the points to a CNC router to cut metal, or whatever we&#8217;re doing with it. If we only needed to do it once, this would probably be the right solution.)</p>
<h3 id="TheProblemwithBranching">The Problem with Branching</h3>
<p>The answer basically has to do with computer architecture and the way it has evolved over the past couple of decades. Once upon a time, when I was programming on my father&#8217;s hand-me-down Heathkit Z-80, this would have been a perfect solution &#8212; each time we needed to evaluate a B-spline, we&#8217;d simply decide if we were in the normal or weird section of the curve, and calculate accordingly. The problem is that as we poured billions of dollars into CPU fabrication techniques, we got more and more transistors, and needed some way to take advantage of them in order to make things run faster. One major solution is &#8220;pipelining&#8221;, which essentially can be described as doing many things at once. Rather than waiting for each step to complete before we start on the next step, the CPU will get a lot of things started at once, and pull them all together when needed. (Perhaps I&#8217;ve been watching too much Iron Chef, but this seems like partitioning work out to a sous chef.) In the extreme case of the P4 architecture, the pipeline was up to 20 stages long. A much more technical discussion can be found at <a class="ext-link" href="http://arstechnica.com/old/content/2001/05/p4andg4e.ars"><span class="icon">http://arstechnica.com/old/content/2001/05/p4andg4e.ars</span></a> but the basic takeaway is that for a modern CPU to run fast, it needs to be able to do many things at once.</p>
<p><!--more--></p>
<p>A conditional (the &#8220;if / then&#8221; in the pseudo-code above) wreaks holy hell on this scheme. Before the CPU can get started on &#8220;do uniform thing&#8221; or &#8220;do weird thing&#8221;, it has to know which one it needs to do. This is one cause of a &#8220;pipeline stall&#8221;, since instead of doing 20 things at once, we have to wait for the conditional to be evaluated (through all 20 stages) before doing anything. This is absolutely brutal on performance.</p>
<p>Modern CPUs actually try to work around this problem as well, using &#8220;speculative execution&#8221; and &#8220;branch prediction&#8221; &#8212; basically, they keep track of what happened last time we ran this code, and assume that the same thing will happen this time. If they guess right, when the conditional is finally evaluated they can just act as if they knew it all along. If they guess wrong, they have to throw away all the speculative work and start over on the correct path. This works, but it&#8217;s hugely complex, and it makes performance less predictable and more dynamic (because performance becomes directly tied to the accuracy of the branch prediction). In our case, things would run fast through the first curve segment, when the &#8220;weird&#8221; path is consistently followed. This would be followed by a period of degraded performance when it kept guessing &#8220;weird&#8221; but the real answer was &#8220;uniform&#8221;. At some point, the branch prediction unit would be retrained to guess &#8220;uniform&#8221; instead, and performance would recover until we hit another &#8220;weird&#8221; segment. In short, speculative execution and branch prediction are nice things to have, but no substitute for &#8220;straight-line&#8221;, branch-free code.</p>
<p>This whole preference for a single codepath is even more dramatically true when we talk about &#8220;SIMD&#8221; (Single Instruction, Multiple Data) parallelism. This approach to performance showed up on CPUs in the MMX and SSE instruction sets, and is one of the ways to really increase performance on modern silicon. Essentially, rather than evaluating points on the spline one at a time, we could stack up a list of points to be evaluated side-by-side, then grind through them four (or however many) at a time. See <a class="ext-link" href="http://arstechnica.com/old/content/2000/03/simd.ars"><span class="icon">http://arstechnica.com/old/content/2000/03/simd.ars</span></a> for a more responsible description. The challenge here is that &#8220;Single Instruction&#8221; bit &#8212; you have to be doing the <em>same</em> thing to your four data points, not looking at each one individually and deciding whether to give it the &#8220;uniform&#8221; or &#8220;weird&#8221; treatment. This is true of the SIMD instructions in modern Intel and AMD CPUs, and even more so of &#8220;shader programs&#8221; running on graphics cards&#8217; GPUs. In fact, early shader programs didn&#8217;t even <em>have</em> conditional instructions; everything <em>had</em> to be straight-line code. More recent cards allow you to branch on the GPU, but at a potentially fearsome cost to performance (see <a class="ext-link" href="http://forums.nvidia.com/index.php?showtopic=107865"><span class="icon">http://forums.nvidia.com/index.php?showtopic=107865</span></a> for instance).</p>
<h3 id="SeparateBatches">Separate Batches</h3>
<p>So we&#8217;re all agreed that branching is Bad. What can we do?</p>
<p>One approach is the &#8220;hoist the conditional&#8221; out of the inner loop. This somewhat compromises the nice clean interface of the evaluateBSplineWithConditional function, but often be a performance win. To describe this approach, we need to introduce another level of the program, namely the function which was calling the evaluateBSplineWithConditional function. Assume that we&#8217;re trying to fill an array with evenly-spaced points on the B-spline, in order to render them or drive a CNC router or whatever. Using the original definition we&#8217;d have something like</p>
<pre class="wiki">function naiveFillArrayWithSpline(array, numPoints)
  dU = 1 / (numPoints - 1)
  for(i = 0; i &#60; numPoints; i++)
    u = dU * i
    array[i] = evaluateBSplineWithConditional(u)</pre>
<p>The naiveFillArrayWithSpline function would really work on any parametric curve function that expects a <em>u</em> ranging from 0 to 1. Instead, we can give it some knowledge about the end-conditions of B-splines, to produce a version without any conditionals in the main loops:</p>
<pre class="wiki">function batchedFillArrayWithSpline(array, numPoints)
  numSegments = n-k+2
  pointsPerSegment = numPoints / numSegments
  dW = 1 / pointsPerSegment
  for(i = 0; i &#60; pointsPerSegment; i++)
    w = dW * i
    array[i] = do weird thing (1, w)
  for(j = 1; j &#60; numSegments - 1; j++)
    for(i = 0; i &#60; numPoints; i++)
      w = dW * j
      array[j*pointsPerSegment + i] = do uniform thing(j, w)</pre>
<p>(Again I&#8217;m ignoring the weirdness at the end of the curve, which would require another &#8220;do weird thing&#8221; loop. I&#8217;m also playing fast and loose with the array indexing, assuming that numPoints divides evenly into numSegments, and so forth &#8212; this is another strawman, in other words.)</p>
<p>This is a much uglier function than naiveFillArrayWithSpline. It also has a lot of specific knowledge about B-splines embedded in it; you couldn&#8217;t reuse this for, say, making an array filled with <em>sin(u)</em>. However, it has the huge virtue that there are no conditionals embedded in the inner loops. In fact, there are no conditionals at all &#8212; by changing the problem from &#8220;evaluate a B-spline at a given value of u&#8221; to &#8220;fill an array with evenly-spaced values of a B-spline&#8221; we&#8217;ve been able to significantly improve the performance characteristics.</p>
<p>This version still has flaws, however. One is a software engineering issue: we might need both this version <em>and</em> the evaluateBSplineWithConditional function, if we need to be able to fill arrays efficiently but also need to be able to evaluate arbitrary points (perhaps searching for an intersection). Maintaining two functions with different structure, but supposed to produce the same result, is a good recipe for maintenance pain. (In a prior job, we had exactly this situation &#8212; and in fact the single-value version did disagree with the bulk version, which was an on-going source of confusion.)</p>
<p>There&#8217;s an argument to be made that software engineering pain is the price of doing business, and perhaps a different language or some code generation approach would let us keep a single version of the source code while still producing these two versions for actual production use. There are two technical flaws (or two aspects of the same flaw), though, that mean this version is sub-optimal even ignoring maintenance considerations.</p>
<p>From the point of view of running this code on a CPU, the issue is code size. Instead of a single, small codepath we now have a rather larger function to evaluate. The on-disk size of a program is pretty much irrelevant in the modern world, but the actual in-use code size still matters because of caching. The CPU has a limited (and often surprisingly small) instruction cache on-die; it&#8217;s vastly faster to execute code from that cache than it is to load code from main memory. While it&#8217;s unlikely that the method above would actually be larger than the instruction cache, it&#8217;s definitely larger than a uniform version, which means it would occupy more of the instruction cache. If, say, the actual rendering loop has to be pushed out of the cache in order to load our spline evaluation method, then we&#8217;re paying a definite performance cost for code size (although one that&#8217;s very difficult to rigorously detect and characterize).</p>
<p>In the case where this code would run on the GPU, the cost is somewhat easier to see. Rendering commands are transferred from the CPU to the graphics card in &#8220;batches&#8221;, where everything in a batch is using the same shader programs, the same constants, and so forth (only the vertex data changes between data points). The GPU-based analogue of the method above would be to render the spline in three batches: one for the first &#8220;weird&#8221; segment, one for the uniform segments, and one for the final &#8220;weird&#8221; segment. The number of batches is very often a limiting factor in naive rendering approaches; magnifying the batch count by a factor of 3 is a quick way to become batch-limited. In these circumstances it can even be possible for the performance wins of GPU-native evaluation to be completely lost in the face of the communications overhead.</p>
<h3 id="ArithmeticConditionals">Arithmetic &#8220;Conditionals&#8221;</h3>
<p>If the cost of the computations is low enough, and the penalty for branching is high enough, there can be another answer. Instead of having the program explicitly branch, or separating the different conditions into different loops / different batches, we can simply do both branches. The obvious problem is that we&#8217;ll have two output values, but we need to produce exactly one (the right one). To solve this problem, we introduce a &#8220;condition variable&#8221; which is 1 in one conditional branch and 0 in the other. This is typically a &#8220;natural&#8221; operation because in C (and C-like languages) boolean variables are internally stored as an integer which is 1 for true and 0 for false. In this idiom, the core of the function becomes something like</p>
<pre class="wiki">function doBoth(segment, w)
isWeird = (segment &#60;= 1)
isNormal = 1 - isWeird

weirdResult = do weird thing(segment, w)
normalResult = do uniform thing(segment, w)

answer = weirdResult * isWeird + normalResult * isNormal</pre>
<p>This seems incredibly counter-intuitive as a speed-up, but it can actually be a win if the &#8220;weird&#8221; and &#8220;uniform&#8221; paths are both rather cheap to evaluate, and the cost of separate batches is high enough. A nice advantage of this approach is that we&#8217;re back to having a single method which can be used as the core of an array-filling loop and also used to evaluate &#8220;one-off&#8221; points.</p>
<p>In practical terms, I would guess that on the CPU, this approach is likely to be slower than the batchedFill method above, while on the graphics card it would be closer. (This reflects the fact that CPU instruction cache pressure is probably less critical than the communications overhead of sending batches to the GPU, combined with just how fast the GPU is at evaluating math &#8212; in the GPU case, the bar for &#8220;rather cheap to evaluate&#8221; is lower, and the cost of separate batches is higher). I haven&#8217;t done any benchmarking at all to test whether the B-spline functions actually fit these assumptions on the hardware I have available.</p>
<h3 id="TradeoffsandRealHardware">Tradeoffs and Real Hardware</h3>
<p>The last paragraph hints at why all of these approaches are kind of unfortunate. It&#8217;s very possible (in fact, likely) for the &#8220;right&#8221; answer to vary with different graphics cards, different CPUs, and different connections between CPU and GPU. For instance, within a given generation of graphics cards, the cost of evaluating functions tends to drop (as the cards get faster), but the cost of submitting a batch is typically fixed (by the interface between CPU and graphics card, which experiences much slower evolution). However, for on-board graphics (where the GPU is on the motherboard or even integrated into the CPU itself) the cost of batch submission may be almost zero, while these kinds of GPUs are typically computationally weak (so the cost of evaluating the functions would be higher).</p>
<p>One very common solution to this sort of dilemma is to optimize for performance on <em>your</em> hardware, and figure it&#8217;s reasonably representative of your customers. If there&#8217;s any validity to that assumption, this may be a reasonable approach, but it&#8217;s fraught with peril; if nothing else, the optimal solution will change over time (with new generations of hardware), so your program is unlikely to age well. It can also be embarrassing, if customers upgrade their hardware and notice that your program doesn&#8217;t take any advantage of their expensive new graphics card.</p>
<p>To really do this kind of thing right, across heterogenous hardware and with an eye toward future-proofing your program, you would need to &#8220;do it all&#8221;, with dynamic strategy selection. For each performance-critical routine, provide all three variants listed above, then benchmark <em>on the customer hardware</em> to figure out which is fastest in this particular computer. This approach actually can work, and is really used by some very performance-sensitive applications. (For instance, the ATLAS project <a class="ext-link" href="http://math-atlas.sourceforge.net/"><span class="icon">http://math-atlas.sourceforge.net/</span></a> does this for certain key linear algebra computations. Likewise, the &#8220;md&#8221; RAID system on Linux boxes will test several versions of the XOR routine at runtime to determine which is fastest. In both of these cases, a very small but very performance-critical part of the code is being optimized.) This approach is <em>very</em> expensive in programmer and testing time, and easy to get wrong if you don&#8217;t have a wide range of hardware available to validate your performance assumptions.</p>
<p>Sometimes you can instead leverage the work of other projects. For example, many problems can be coerced into problems of linear algebra, and you can then take advantage of the optimally-tuned ATLAS functions to solve them. There is typically overhead in expressing a problem this way, but it can be a win in time-to-market and coding complexity. Unfortunately, this isn&#8217;t a mechanical solution, and it isn&#8217;t applicable in all cases. In the case of B-splines, it would be possible to express the &#8220;do weird thing&#8221; and &#8220;do uniform thing&#8221; sections in terms of matrix multiplication, but it would not be easy to capture the general &#8220;do this or do that&#8221; problem as I&#8217;ve set it up here.</p>
<p>So the long and the short of it (after this very long digression) is that conditionals are a pain no matter how you slice it. Vastly better is to be able to precondition the data &#8212; that is, feed a fixed formula something clever to make it do what you want, rather than using two different formulas. (You can tell that I got it to work, or think I did, from my phrasing. If B-splines were inextricably <em>different</em> in their end segments, I&#8217;d be writing a very nice summation about how conditionals are hard but sometimes unavoidable, and the next section would be about how the real clever is solution is to have several B-splines to draw, and draw all the middles of <em>all</em> the curves in one batch, and all the end-segments in another batch. Which is actually pretty clever, now that I think of it. But it&#8217;s definitely not the way this post is going.)</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[The B-spline Series: Definitions (Abridged)]]></title>
<link>http://exerciseforthereader.wordpress.com/2009/11/01/b-spline-definitions/</link>
<pubDate>Sun, 01 Nov 2009 21:24:51 +0000</pubDate>
<dc:creator>Seth Porter</dc:creator>
<guid>http://exerciseforthereader.wordpress.com/2009/11/01/b-spline-definitions/</guid>
<description><![CDATA[This is the second part of a so-far three part series. See part one for some context. For a typical ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><em>This is the second part of a so-far three part series. See <a title="The B-spline Series: Motivation" href="http://exerciseforthereader.wordpress.com/2009/11/01/the-b-spline-series-motivation/" target="_blank">part one</a> for some context.</em></p>
<p>For a typical background you can look at <a href="http://mathworld.wolfram.com/B-Spline.html" target="_blank"><span class="icon">MathWorld</span></a> or <a href="http://en.wikipedia.org/wiki/B-spline" target="_blank"><span class="icon">Wikipedia</span></a>. These are pretty representative of the descriptions you&#8217;ll find on the internet in casual searching: technically correct, with nicely formatted equations, but not a whole lot of actual help if you&#8217;re trying to understand the things. In particular, the recursive definition of the basis functions are very clever but incredibly unintuitive as far as what they mean. (I also notice that the links share my own indecisiveness about how to title-case &#8220;B-spline&#8221;.)</p>
<p>A much more useful writeup can be found in the &#8220;B-spline Curves&#8221; section in <a href="http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/" target="_blank"><span class="icon">these excellent class notes</span></a>. This is a nice treatment with lots of pretty pictures, although I think the author makes things somewhat more complex by staying with the raw 0 to 1 parameterization throughout (so the elements of the knot vector end up as fractions rather than integers). Nothing wrong with it, just a different treatment (and I suspect one motivated by uniform representation <em>across many kinds of curves</em>, rather than my focus on uniform representation <em>for all segments of the B-spline</em> to ease high-volume computation).</p>
<p>(I should say at this point that I&#8217;m torn about how to present things. It&#8217;s very tempting to start with what I know now, tell a nice clean story, and maybe then offer an amusing anecdote about how even I didn&#8217;t quite get it at first&#8230; but that&#8217;s exactly what the textbook I was working from did (well, except for the amusing anecdote), and it didn&#8217;t serve me very well. So instead I&#8217;ll let the game tell the story, and just lay it out as it happened to me.)</p>
<p><!--more--></p>
<p>First I have to explain why I was motivated to take a shortcut, which is a mixture of raw intellectual laziness and premature optimization. Starting with the intellectual laziness, here&#8217;s the basic definition of a B-spline. First, some definitions and terminology (Note that wherever I say something condescending like &#8220;the casual reader could be confused&#8221;, I really mean &#8220;<strong>I</strong> was confused for about a day&#8221;):</p>
<dl>
<dt><em>u</em></dt>
<dd>The parametric input variable. In general usage, u definitionally ranges between 0 and 1 &#8212; this defines the extent of any parametric curve (one where <em>x=f(u)</em> and <em>y=g(u)</em>). However, spline literature, or at least the text I&#8217;m working from, is pretty casual about redefining <em>u</em> to work over various different ranges as convenient. To avoid confusion, I&#8217;ll use <em>u</em> in the traditional 0..1 sense, and <em>v</em> and <em>w</em> to track these other ranges. </dd>
<dt><strong>P</strong><sub>0..n</sub></dt>
<dd>The list of control points. This is probably the most important input to the B-spline curve. Note that indexing is zero-based, and there are <em>n+1</em> control points. Note that <strong>P</strong> is a list of <em>vectors</em>, and their dimensionality wholly determines the dimensionality of the output. In other words, if <strong>P</strong> is a list of <em>(x,y)</em> points, then the position of a B-spline defined on <strong>P</strong> at a given <em>u</em> will also be an <em>(x,y)</em> point. Likewise if <strong>P</strong> is defined in 3-space, that is <em>(x,y,z)</em> then the resulting curve is also defined in 3-space. </dd>
<dt><em>n</em></dt>
<dd>One less than the number of control points. </dd>
<dt><em>k</em></dt>
<dd>An input to the B-spline curve, this determines the degree of the polynomials used for each curve segment, as well as various other things. Most of this post considers the case of k=3. </dd>
<dt>degree</dt>
<dd>Generally: the highest exponent appearing in a polynomial: the degree of <em>u<sup>2</sup>+3 u + 1</em> is 2. Specifically, for the B-spline segments, <em>degree = k-1</em> (so my working example with k=3 produces a quadratic on <em>u</em>). </dd>
<dt><em>v</em></dt>
<dd>A variable in the range <em>[ 0 , n-k+2 ]</em>. This range is mapped to the 0 to 1 range of <em>u</em> in the obvious way: <em>v = u (n-k+2)</em> </dd>
<dt><span style="text-decoration:line-through;"><em>T<sub>0..n-k+2</sub></em></span><em><sub> </sub></em><em>T<sub>0..n+k+1</sub></em></dt>
<dd><em>[Edit 11/03/09 - there are n+k+2 total knots (numbered 0 through n+k+1), even though the highest number appearing in the knot vector is n-k+2.] </em>The <strong>knot vector</strong>. Note that the knot vector&#8217;s indexing is zero based. In the case we&#8217;re considering (uniform end-interpolating B-splines) it consists of a list of integers between 0 and n-k+2. The first <em>k</em> entries are 0, then the numbers 1 through <em>n-k+1</em>, then <em>k</em> copies of <em>n-k+2</em>. For example, the knot vector for a 6 control point (<em>n=5</em>), second degree (<em>k=3</em>) B-spline would be <em>T = { 0, 0, 0, 1, 2, 3, 4, 4, 4 }</em>. Note that these are not quite indices into the control point array (for one thing, they wouldn&#8217;t reference all <em>n+1</em> control points). These values actually are in the same parameter space as <em>v</em>, above, and basically they serve to knock out terms in the basis functions (when the same value appears repeatedly in the knot vector). </dd>
<dt><em>N<sub>i,k</sub>(v)</em></dt>
<dd>A B-spline basis function, parameterized on <em>i</em> and <em>k</em>. Defined in two parts, as<img class="aligncenter size-full wp-image-92" title="N_i_1" src="http://exerciseforthereader.wordpress.com/files/2009/11/n_i_1.png" alt="N_i,1(v) := (if t_i &#60;= v &#60;= t_{i+1} then 1 else 0)" width="297" height="18" /></dd>
</dl>
<p style="padding-left:30px;">and</p>
<p><img class="aligncenter size-full wp-image-93" title="N_i,k(v)" src="http://exerciseforthereader.wordpress.com/files/2009/11/n_i_k.png" alt="N_i,k(v) := (u- T[i])* N(i, k-1, u) / (T[i+k-1] - T[i]) + (T[i+k] - u) * N(i+1, k-1, u) / (T[i+k] - T[i+1])" width="398" height="40" /></p>
<p style="padding-left:30px;">where 0/0 is defined to be 0. This was the intimidating expression that inspired me to take any shortcut presented. In retrospect, I should have noticed that the denominator would be 1 in both terms unless you&#8217;re near an end of the curve, in which case one and then both terms will go to 0 (thanks to the slightly odd definition of dividing by zero). The rest of the time, the <em>N<sub>i,1</sub></em> terms will act as switches, picking a set of terms from each basis function which will be non-zero in the current section of the curve. Also, note that in much of the literature, this function is written as a function of <em>u</em>, but we&#8217;ve already made the jump to the <em>v</em> range as described above, so I replaced the u&#8217;s with v&#8217;s.</p>
<dl>
<dt><em>B<sub>k</sub>(v)</em></dt>
<dd>The actual B-spline curve, given a list of control points <em>p</em> and a degree-controlling <em>k</em>. This function is sometimes referred to as <em>p(u)</em>, but this is easily confused with the list of control points. Defined as<img class="aligncenter size-full wp-image-94" title="B-spline curve definition" src="http://exerciseforthereader.wordpress.com/files/2009/11/b_k.png" alt="BSpline(n, k, u) := sum(P[i] * N(i, k, u), i, 0, n);" width="163" height="45" /></dd>
</dl>
<hr />The key thing you&#8217;ll notice in this section is that B-splines come out of the mathematical world, not the computer world. The core clever trick is using the lowest-order basis functions as &#8220;switches&#8221; to select which terms are non-zero. (To their credit, though, at least the lists all use zero-based indices, which will save some tearing-out-of-hair later. (Well, it would if Maxima, the symbolic math program I&#8217;m using, didn&#8217;t insist on one-based indices&#8230;)) This allows a very pretty representation of the function as a whole (see <em>B(v)</em> above), at the expense of hiding all the conditionals way down deep inside these (recursively defined) basis functions. This makes for pretty math, but a hideously slow and ugly direct implementation. As far as I can tell, the intent was to get the top-level <em>B(v)</em> function to look a lot like the definition of Bezier and Hermite curves. Mission accomplished, but with a twist &#8212; the definitions of <em>those</em> functions are quite friendly to naive implementation, while this one is pure pain. See <a class="ext-link" href="http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve-coef.html"><span class="icon">http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve-coef.html</span></a> for a discussion of this and a different evaluation approach than I will examine here.</p>
<p>&#160;</p>
<p>I looked at all that, winced hard, and skipped ahead to where they&#8217;d solved the uniform version, giving the nice-ish equation for a single segment of</p>
<p><img class="aligncenter size-full wp-image-95" title="B-spline uniform version for k=3" src="http://exerciseforthereader.wordpress.com/files/2009/11/b_uniform_k3.png" alt="$$B_{uniform,k=3,i}(u)=\frac{1}{2}\,\left( -{p}_{i}\,\left( 2\,{u}^{2}-2\,u-1\right) +{p}_{i+1}\,{u}^{2}+{p}_{i-1}\,{\left( u-1\right) }^{2}\right)$$" width="511" height="29" /></p>
<p>or in matrix form,</p>
<p><img class="aligncenter size-full wp-image-96" title="B-spline uniform formulation for k=3, matrix form" src="http://exerciseforthereader.wordpress.com/files/2009/11/b_uniform_k3_matrix.png" alt="$$B_{uniform,k=3,i}(u)=\frac{1}{2}\,\left( \begin{pmatrix}{u}^{2} &#38; u &#38; 1\end{pmatrix}.\begin{pmatrix}1 &#38; -2 &#38; 1\cr -2 &#38; 2 &#38; 0\cr 1 &#38; 1 &#38; 0\end{pmatrix}.\begin{pmatrix}{P}_{i-1}\cr {P}_{i}\cr {P}_{i+1}\end{pmatrix}\right)$$" width="469" height="57" /></p>
<p>This was what I wanted anyway, an invariant equation where I could just feed it different parameter values and it would produce an x and y. To prevent completely following the path of my own confusion, I&#8217;ll point out here that this function is actually defined in terms of</p>
<dl>
<dt><em>w</em></dt>
<dd>Yet another parameterization. In this case, w ranges from 0 to 1 <em>within each curve segment</em>. This is a reinterpretation of the <em>v</em> parameter as the sum of an integer part (the segment number) and a fractional part (<em>w</em>). </dd>
<dt><em>j</em></dt>
<dd>The curve segment number, not to be confused with the <em>i</em> which goes from 0 to n in the definition of B above. To tie these various interpretations of parameter together, <em>v=u (n-k+2)=j+w-1</em>. <em>j</em> ranges from 1 to <em>n-k+2</em>. <strong>Note</strong> that <em>j</em> is one-based, NOT zero-based (hence the -1 offset when mapped from the 0 to n-k+2 range). This is because at the end of the curve, j=n-k+2 and w=1 &#8212; effectively, <em>w</em> is adding one to the range of <em>j</em> (so we need a -1 correction to get the ends to line up right). At the beginning of the curve, w=0, so j must be 1 or we&#8217;d again go out of range. A more intuitive interpretation of this is that <em>j</em> is the count of intervals, so this is a pretty standard fencepost correction (<a class="ext-link" href="http://en.wikipedia.org/wiki/Off-by-one_error"><span class="icon">http://en.wikipedia.org/wiki/Off-by-one_error</span></a>). </dd>
</dl>
<p>In terms of these renamed variables, the uniform equation would be</p>
<p><img class="aligncenter size-full wp-image-97" title="B-spline uniform version with renamed variables" src="http://exerciseforthereader.wordpress.com/files/2009/11/b_uniform_k3_rename.png" alt="$$B_{uniform,k=3,j}(w)=\frac{1}{2}\,\left( -{p}_{j}\,\left( 2\,{w}^{2}-2\,w-1\right) +{p}_{j+1}\,{w}^{2}+{p}_{j-1}\,{\left( w-1\right) }^{2}\right)$$" width="531" height="28" /></p>
<p>So hurray, there was an easy and uniform equation after all; I could either pass in a different window of three control points for each segment, or I could pass in the segment number in addition to the segment-relative parameter (<em>w</em>) and look up the right control points.</p>
<p>The first problem I encountered was that the curve created this way doesn&#8217;t actually interpolate the end points. That is to say, when v=0 the curve isn&#8217;t at p<sub>0</sub>. Here&#8217;s where I really took a shortcut. Instead of backing off and trying to figure out what was going on, I noticed two things:</p>
<ul>
<li>The knot vector sort of looks like index indirection lookup table. I think this is an especially Computer Science-ish assumption &#8212; adding a layer of indirection is a pretty standard way to make non-uniform processes look uniform (see below for a more detailed discussion of what I mean by &#8220;uniform&#8221;), and a table of integers looks a lot like a list of indices. Particularly because the knot vector repeats its first and last values.</li>
<li>If you feed the B<sub>uniform</sub> function the points [p<sub>0</sub> , p<sub>0</sub> , p<sub>1</sub>] (pretending that the control point list had multiple copies of the end-points), and evaluate it at v=0, it does actually evaluate to p<sub>0</sub>.</li>
</ul>
<p>I was actually working with k=4 for these initial experiments; I only dropped back to k=3 in an attempt to simplify things to figure out what was going on. The effect I saw is magnified at higher values of k &#8212; in the cubic k=4 case, each B<sub>uniform</sub> is mixing together 4 control points instead of 3. To get it to interpolate the end-point required <em>two</em> additional segments to get from the last &#8220;normal&#8221; segment (on [ p<sub>0</sub> , p<sub>1</sub> , p<sub>2</sub> , p<sub>3</sub> ]) to actually end up at p<sub>0</sub>. The last normal segment, evaluated at u=0, gives us <em>1/6 (P<sub>2</sub>+4 P<sub>1</sub> + P<sub>0</sub>)</em>. When we evaluate on [ p<sub>0</sub> , p<sub>0</sub> , p<sub>1</sub> , p<sub>2</sub> ] as the first &#8220;weird&#8221; term, at u=0 we get <em>1/6 (P<sub>1</sub>+5 P<sub>0</sub>)</em>. It&#8217;s not until we&#8217;re looking at [ p<sub>0</sub> , p<sub>0</sub> , p<sub>0</sub> , p<sub>1</sub> ] that we actually get p<sub>0</sub> at u=0.</p>
<p>In short, I got a little seduced by algebraic numerology &#8212; of <em>course</em> if you have a function which mixes 4 points, and you replace enough of those four points with copies of the same point, you&#8217;ll end up with a function which returns that point no matter what you give it. (This is the final reductive case, where all four points are actually copies of p<sub>0</sub> .)</p>
<p>The actual problem here is that we&#8217;ve wandered pretty far from the original definition of a B-spline. In particular, we have too many curve segments &#8212; v is ranging from something like <em>-1</em> to <em>n-k</em> rather than <em>1</em> to <em>n-k+2</em>. (The key difference from the &#8220;real&#8221; B-spline is that the proper B-spline doesn&#8217;t actually have a &#8220;normal&#8221; segment on [ p<sub>0</sub> , p<sub>1</sub> , p<sub>2</sub> , p<sub>3</sub> ] &#8212; instead, it&#8217;s already started going into special cases.)</p>
<p>The practical upshot of this is that we&#8217;re spending far too much of the parameter space near the end-points of the curve, leaving only a small portion for the whole interior of the curve. This could be disastrous for rendering, where it&#8217;s very nice to sample at evenly-spaced intervals of <em>u</em> and assume that this will lead to generally evenly-spaced vertices in 3-space: with this scheme we&#8217;d end up with a great many sampling points at the beginning and end of the curve, and a paucity in the interior.</p>
<p>Even this difficulty could be overcome, by introducing yet another reparameterization to redistribute the incoming u values more evenly over the length of the curve. However, there was no getting around the problem that the actual 3-space shape of the curve was different than my reference implementation (a 3D modeling tool). I&#8217;m always willing to entertain the possibility that the reference is wrong and I&#8217;m right (perhaps too willing), but at least I needed to understand what was going on here.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[The B-spline Series: Motivation]]></title>
<link>http://exerciseforthereader.wordpress.com/2009/11/01/the-b-spline-series-motivation/</link>
<pubDate>Sun, 01 Nov 2009 20:51:11 +0000</pubDate>
<dc:creator>Seth Porter</dc:creator>
<guid>http://exerciseforthereader.wordpress.com/2009/11/01/the-b-spline-series-motivation/</guid>
<description><![CDATA[The B-Spline family of curves are a nice way to make smooth curves from a series of control points. ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>The B-Spline family of curves are a nice way to make smooth curves from a series of <em>control points</em>. The idea is that the control points give you &#8220;handles&#8221; to pull the curve around; it won&#8217;t actually pass through any of them (except for the first and last ones), but it will be attracted to them while retaining some nice smoothness properties.</p>
<p>That much I knew coming in. For various reasons, I wanted to write a program to evaluate B-splines, with a particular eye to rendering them in 3D. This seemed like it was going to be a very easy task; instead, I learned a lot along the way.</p>
<p><!--more--></p>
<h2 id="AMotivationforB-Splines">A Motivation for B-Splines</h2>
<p>Ignoring the math for a moment, let&#8217;s talk about the basic idea of B-splines. There are quite a few ways to fit a smooth (roughly meaning &#8220;at least twice differentiable, and with at least the first derivative being continuous across the function) curves to a set of control points. (And in fact there are a lot more if the curve doesn&#8217;t even have to pass through the control points!)</p>
<p>The simplest approach is to observe that you can always fit a quadratic (degree = 2) polynomial to any three points, or a cubic (degree = 3) to any four points, and so forth. I don&#8217;t think anyone uses this approach in serious modelling or drawing software, but it&#8217;s kind of the benchmark against which other approaches can be compared. One key benefit, which I&#8217;ll discuss below, is that this approach gives you a single function across the entire length of the curve, making them naturally uniform. There are a few problems, however:</p>
<ul>
<li>They get uglier as you have more and more control points, since the degree of the polynomial rises along with the control point count</li>
<li>More fatally, they wiggle. This is most easily seen in a picture:</li>
</ul>
<p>&#160;</p>
<div id="attachment_82" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-82" title="Polynomial Wiggle" src="http://exerciseforthereader.wordpress.com/files/2009/11/polynomial_wiggle.png" alt="pts : [[0, 0], [1, 3], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0]]; load(interpol); plot2d([[discrete,pts], lagrange(pts)], [x, 0, 6.1], [style, [points, 1], [lines]], [legend, false]);" width="450" height="196" /><p class="wp-caption-text">Polynomial interpolation demonstrating &#34;wiggle&#34;</p></div>Notice how the curve repeatedly dips below the <em>y=0</em> line, even though the control points are strictly non-negative. (It also overshoots at the top, going up into <em>y=4</em> territory before hitting the <em>(1, 2)</em> point on the <em>downstroke</em>.) These would be annoying enough, but the worst part is that it never becomes a straight line, even when fed 5 linear control points. This makes simple polynomial interpolation pretty much useless for industrial design: imagine if your mouse had ripples all through its surface, simply because of a stylishly sharp curve at the nose. Even worse, the direction of the wiggles can actually flip in response to relatively small changes in the control points!</p>
<p>&#160;</p>
<p>A much better family of functions (for geometric modeling purposes) are the Bézier curves. These very useful curves are used in many drawing programs. These curves don&#8217;t actually go through the control points, except for the first and last ones, but instead use the control points as &#8220;handles&#8221; (you can think of them as pulling the curve toward them with springs, rather than having the curve attached to them). Bézier curves exhibit the &#8220;convex hull property&#8221;, meaning (casually) that if you draw lines connecting the control points, the curve will be contained within those lines. In other words, they don&#8217;t have the overshoot problems of simple polynomial interpolation. The fact that they don&#8217;t go through the control points is disconcerting at first, but isn&#8217;t fundamentally a problem for many design and modeling tasks.</p>
<p>Here&#8217;s a Bézier curve through the same control points:</p>
<p>&#160;</p>
<p><div id="attachment_83" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-83" title="Bézier Curve Example" src="http://exerciseforthereader.wordpress.com/files/2009/11/bezier_curve.png" alt="Bezier(i, n, u) := binomial(n, i) * u^i * (1-u)^(n-i); BCurve(P, n, u) := sum(P[i+1]*Bezier(i, n, u), i, 0, n); plot2d([[discrete,pts], [parametric, BCurve(pts, 6, u)[1], BCurve(pts, 6, u)[2], [u, 0.001, 1], [nticks, 80]]], [x, 0, 6.1], [style, [points, 1], [lines]], [legend, false]);" width="450" height="223" /><p class="wp-caption-text">A Bézier curve through the same control points</p></div>Notice that this curve is much more restrained; it doesn&#8217;t come close to the (1, 3) control point, but it doesn&#8217;t overshoot or wiggle. This is a curve you could use to design a mouse. There is still one key problem, however: if you move one of the control points, the entire shape of the curve will be affected. To see why this is a problem, imagine that you&#8217;ve got the mouse almost perfect. The shape fits perfectly in your hand, is big enough to hold the electronics &#8212; everything&#8217;s done except that one VP decides that the stylish sharp curve at the end is perhaps a bit <em>too</em> sharp. You adjust the control points slightly and the VP is happy. But now, the entire rest of the shape has changed &#8212; maybe you don&#8217;t have enough clearance for the electronics, maybe the hand-rest isn&#8217;t quite as comfortable. Of course you can go and change those control points, too, but each time you touch something, everything changes. This is known in the trade as <em>global propagation of local changes</em>. As a result, Bézier curves are perhaps best suited for freehand work.</p>
<p>&#160;</p>
<p>By now you can probably guess what the nice properties of B-splines are. They act a lot like Bézier curves, having the convex hull property and interpolating only the first and last control points, with the key difference that a change to a control point will only change a limited portion of the curve. To accomplish this trick, B-splines are made up of a number of separate curve segments, rather than a single high-degree polynomial. These segments are cleverly constructed so that when they meet, both segments are curving the same way (their first derivatives are the same). In fact, B-splines have an extra parameter, <em>k</em>, which controls both the polynomial degree of these segments and how continuous they are when they meet (how many derivatives are equal at the intersection point). In common usage, k is 3 or 4, leading to either quadratic or cubic curve segments. (Lower values of k aren&#8217;t &#8220;curves&#8221; in the common sense; k=2 produces straight lines connecting the control points, and k=1 is the disjoint set of control points, not connected at all. Higher k values lead to a &#8220;stiffer&#8221; spline, as the requirement of equal second and third and fourth derivatives forces the curve closer and closer to a straight line.)</p>
<p>As an example, here&#8217;s a <em>k=3</em> B-spline (each segment is a quadratic curve) through the same control points as the curves above. As before, the control points are shown as blue circles. Additionally, the segments are each drawn in different colors, and the boundaries between segments are marked by red squares:</p>
<p>&#160;</p>
<p><div id="attachment_84" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-84" title="B-spline Example" src="http://exerciseforthereader.wordpress.com/files/2009/11/bspline_example.png" alt="pts2 : [[0, 0], [1, 3], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0]]; mySegments7 : makelist(at(basis_indep_spline3(P, seg, u), [P[0]=2*P[0]-P[1], P[7]=2*P[7]-P[6]]), seg, 1, 6); accumX : mySegments7; for idx : 0 step 1 thru 7 do accumX : subst(pts2[idx+1][1], P[idx], accumX); accumY : mySegments7; for idx : 0 step 1 thru 7 do accumY : subst(pts2[idx+1][2], P[idx], accumY); makePlotList(u0, u1) := makelist([parametric, accumX[i], accumY[i], [u, u0, u1]], i, 1, 6); plot2d(append([[discrete, pts2]], makePlotList(0, 1),   [[discrete, makelist([at(accumX[i], u=1), at(accumY[i], u=1)], i, 1, 6)]]),      [x, -1, 6.1], [y, -0.2, 3.2],     [style, [points, 1],      [lines], [lines], [lines], [lines], [lines], [lines],     [points, 1,2,6]],     [legend, false]);" width="450" height="232" /><p class="wp-caption-text">A k=3 B-spline curve through the same control points</p></div>To make things a little clearer (perhaps), here&#8217;s the same curve with each segment drawn from <em>u=-0.1</em> to <em>u=1.1</em>. This &#8220;overdraw&#8221; demonstrates how each segment really is a parabola, carefully chosen so that the slopes are momentarily equal at the point where the segments meet:</p>
<p>&#160;</p>
<p><div id="attachment_85" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-85" title="B-spline Example with Segment Overdraw" src="http://exerciseforthereader.wordpress.com/files/2009/11/bspline_overdraw_example.png" alt="B-spline Example with Segment Overdraw" width="450" height="260" /><p class="wp-caption-text">B-spline Curve with segments rendered from u=-0.1 to u=1.1</p></div>
<p>Notice that we have the nice non-wiggling behavior of the Bézier curve, combined with a much narrower range of influence for each control point. The control points only influence nearby segments, meaning that this curve &#8220;flattens out&#8221; much more quickly than the Bézier version.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Details, Details]]></title>
<link>http://imag3d.wordpress.com/2009/10/30/393/</link>
<pubDate>Fri, 30 Oct 2009 01:58:34 +0000</pubDate>
<dc:creator>imag3d</dc:creator>
<guid>http://imag3d.wordpress.com/2009/10/30/393/</guid>
<description><![CDATA[Details… Details they are what make a difference when your trying to illustrate something. The prope]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Details… Details they are what make a difference when your trying to illustrate something. The proper use of detail makes a image or illustration into something thats more than just a picture, it enables an image to tell a story. Example; The following image shows the Williamsburg courthouse 1776-1777 if you look in the foreground you will see a muddypath or road. Now the easy way would be to show just a simple dirt path in front of the Courthouse but the wouldn’t tell you very much. I went a step further an added more details. I added things like rocks, wagon wheel tracks and a glossy sheen to create the image of mud. These simple details tell the viewer that road in front of the courthouse seems to be heavily trafficked, used by wheeled carts or wagons and not just a pedestrian path it also implies it must have rained recently. The edge of the path is intermingled with grass which slightly implies to the time period of the scene; it is not a heavily traveled graveled road with a clearly define border put a muddy path that implies that this ‘road ‘ was some what new in its origin. <div id="attachment_394" class="wp-caption aligncenter" style="width: 469px"><img src="http://imag3d.wordpress.com/files/2009/10/courthousefinal2aredline.jpg" alt="courthousefinal2aredline" title="courthousefinal2aredline" width="459" height="345" class="size-full wp-image-394" /><p class="wp-caption-text">Details</p></div></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[High Quality Video At Affordable Prices]]></title>
<link>http://mantismediatv.wordpress.com/2009/10/21/high-quality-video-at-affordable-prices/</link>
<pubDate>Wed, 21 Oct 2009 00:26:15 +0000</pubDate>
<dc:creator>mantismediatv</dc:creator>
<guid>http://mantismediatv.wordpress.com/2009/10/21/high-quality-video-at-affordable-prices/</guid>
<description><![CDATA[With today&#8217;s economy being more uncertain than ever, companies have to make their decisions co]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>With today&#8217;s economy being more uncertain than ever, companies have to make their decisions count. You know that producing a high quality commercial, company overview, or web video can help give your brand the market momentum it needs.<br />
So then, what&#8217;s the next step? Most people ask what&#8217;s it going to cost. </p>
<p>Here at Mantis we ask, what rewards will your high quality video bring you? If the video is done right, you will gain exposure on TV, on the Web and anywhere else you can play it (company lobby, in-store displays, airport displays, trade shows, etc&#8230;). Once you have completed the video, it can run continuously on all of these mediums for a long time. That&#8217;s a lot of exposure with minimal effort and minimal risk.</p>
<p>How much effort and cost is there if you try to get that much exposure without a video? We are willing to estimate that it would be at least 10 times the cost and effort and you will never get the overall market reach that a video can provide. </p>
<p>With that being said, you don&#8217;t have to use your entire marketing budget to produce the video. With our virtual business model, we keep our overhead down without sacrificing quality. We offer experienced, high-end, high definition video services for very affordable prices. We are a one stop shop video production agency, so we can help with everything from creative strategy to on set shooting to editing and 3D graphic animation. </p>
<p>You would be amazed at how fast your brand can emerge into the mainstream with a high quality video incorporated with an intelligent marketing strategy. </p>
<p>We would love to answer any questions you have, so feel free to contact us anytime.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Chyron's Toronto Open House]]></title>
<link>http://chyronchat.com/2009/10/19/announcing-chyrons-toronto-open-house/</link>
<pubDate>Mon, 19 Oct 2009 14:53:18 +0000</pubDate>
<dc:creator>chyronchat</dc:creator>
<guid>http://chyronchat.com/2009/10/19/announcing-chyrons-toronto-open-house/</guid>
<description><![CDATA[On November 3rd and 4th, Chyron is pleased to announce that it will be hosting a two day Open House ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>On November 3rd and 4th, <a href="http://www.chyron.com">Chyron</a> is pleased to announce that it will be hosting a two day Open House at the InterContinental Toronto Centre.</p>
<p>Chyron is synonymous with creating the best graphics solutions for “LIVE” TV and is the choice of top broadcasters around the world. Come and experience how you can &#8216;create&#8217; graphics locally or on the web, &#8216;manage&#8217; all those assets and finally &#8216;broadcast&#8217; them to a variety of media outlets.</p>
<p>We will take you through each of the solutions Chyron has to offer and illustrate the complete workflow.</p>
<p><strong><em>The same presentations will occur in the morning and afternoon on each day.</em></strong></p>
<p><strong>9:00am or 1:00pm</strong><br />
<img src="http://www.chyron.com/email/2009/images/News.jpg" alt="News" /><br />
<strong>Chyron for News &#8211; the workflow from Creation to Playout.</strong></p>
<p>Explore streamlining News production. Chyron&#8217;s order management solution completes the missing link when graphics are not yet available. Comprehensive demonstrations will show you how creating, ordering, fulfilling and distributing graphics in a single location or across multiple locations simplifies your news day.</p>
<p><strong>10:30am or 2:30pm</strong><br />
<img src="http://www.chyron.com/email/2009/images/Basketball.jpg" alt="Sports" /><br />
<strong>Chyron for Sports &#8211; workflow from Creation to Playout. </strong></p>
<p>Experience why major broadcasters are choosing Chyron for televising the Olympics, Baseball, Football, Hockey, Basketball and Golf. Chyron provides the tools for quickly building and playing back compelling sports graphics.</p>
<p><strong>11:30am or 3:30pm</strong><br />
<img src="http://www.chyron.com/email/2009/images/Channelbox_thumb.jpg" alt="Channel Branding" /><br />
<strong>Chyron for Master Control. </strong></p>
<p>Find out why Channel Box is really “The Next Generation” of channel branding. Chyron’s Channel Box instantly maximizes all revenue opportunities by building a promo template once and using it multiple times LIVE. Channel Box from Chyron is all about providing the tools to do everything you need and more LIVE.</p>
<p>Together with Chyron’s Ontario Dealer, BSE, this is your opportunity to meet, network and discuss your broadcast workflows with the best in the business. Breakfast and lunch will be provided over the two days by BSE.</p>
<p>Chyron&#8217;s Toronto native, Greg Lennon, who provided all the in-house video graphics for the Leafs and the Raptors at the Air Canada Centre and for Blue Jays Baseball at SkyDome from 1990-2002, will be there to demonstrate all the latest tools for your News and Channel Branding needs.</p>
<p>Phil Carmichael, with his expertise in Sports including Olympics, will be showing what major Broadcasters are using for their high-end real-time 3D graphics for television Sports.</p>
<p>We want <strong>YOU</strong></em> to be a part of this presentation to see for yourself the true benefits of why Chyron is the leader in Creating, Managing and Broadcasting graphics for Television, Web, Phone and Print. So come join us to view the incredible looking graphics solutions from Chyron, the world leader of television graphics creation, management and playback.</p>
<p>To reserve your spot at the Open House, please RSVP to <a href="mailto:rdickerson@chyron.com">Randy Dickerson.</a>  We look forward to seeing you there!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Join Us For A Free Webcast - High-Volume, Low-Cost News - New Date and Time]]></title>
<link>http://chyronchat.com/2009/10/19/join-us-for-a-free-webcast-high-volume-low-cost-news/</link>
<pubDate>Mon, 19 Oct 2009 11:01:53 +0000</pubDate>
<dc:creator>chyronchat</dc:creator>
<guid>http://chyronchat.com/2009/10/19/join-us-for-a-free-webcast-high-volume-low-cost-news/</guid>
<description><![CDATA[]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p> <a href="http://www.broadcastingcable.com/highvolumenews"><img src="http://chyronchat.wordpress.com/files/2009/10/promo_ad-new-time.jpg?w=788" alt="A New Model for High-Volume, Low-Cost News" title="A New Model for High-Volume, Low-Cost News" width="515" height="685" class="aligncenter size-large wp-image-273" /></a></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[What Caught My Eye at IBC?]]></title>
<link>http://chyronchat.com/2009/09/22/what-caught-my-eye-at-ibc/</link>
<pubDate>Tue, 22 Sep 2009 15:13:02 +0000</pubDate>
<dc:creator>chyronchat</dc:creator>
<guid>http://chyronchat.com/2009/09/22/what-caught-my-eye-at-ibc/</guid>
<description><![CDATA[One of the hot topics at the moment is Stereoscopic 3D. At IBC this year, Chyron displayed some of t]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>One of the hot topics at the moment is Stereoscopic 3D.  At IBC this year, Chyron displayed some of the footage of the 3D graphics from the NBA&#8217;s All-Star Weekend which gained a lot of interest from attendees.  During the show Chyron was featured on IBC TV News in a segment called &#8220;What Caught My Eye?&#8221;  On the news, product manager Aldo Campisi spoke about the 3D graphics.  To view the news segment <a href="http://bit.ly/Bpzd8">click here</a>.</p>

</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[What is Android? ]]></title>
<link>http://blog.silex.co.in/2009/09/22/what-is-android/</link>
<pubDate>Tue, 22 Sep 2009 05:30:47 +0000</pubDate>
<dc:creator>panitha</dc:creator>
<guid>http://blog.silex.co.in/2009/09/22/what-is-android/</guid>
<description><![CDATA[Android is a software stack for mobile devices that includes an operating system, middleware and key]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img class="alignright size-medium wp-image-1246" title="android-logo" src="http://silextech.wordpress.com/files/2009/09/android-logo.png?w=300" alt="android-logo" width="180" height="180" /></p>
<p><strong>Android is a software stack for mobile devices</strong> that includes an operating system, middleware and key applications. The <a style="color:#006699;" href="http://code.google.com/android/download.html">Android SDK</a> provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.</p>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Features</h2>
<ul style="line-height:1.3em;border:0 initial initial;margin:0 0 .8em;padding:0 0 0 2em;">
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Application framework</strong> enabling reuse and replacement of components</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Dalvik virtual machine</strong> optimized for mobile devices</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Integrated browser</strong> based on the open source <a style="color:#006699;" href="http://webkit.org/">WebKit</a> engine</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Optimized graphics</strong> powered by a custom 2D graphics library; 3D graphics based on the OpenGL ES 1.0 specification (hardware acceleration optional)</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>SQLite</strong> for structured data storage</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Media support</strong> for common audio, video, and still image formats (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>GSM Telephony</strong> (hardware dependent)</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Bluetooth, EDGE, 3G, and WiFi</strong> (hardware dependent)</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Camera, GPS, compass, and accelerometer</strong> (hardware dependent)</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Rich development environment</strong> including a device emulator, tools for debugging, memory and performance profiling, and a plugin for the Eclipse IDE</li>
</ul>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Android Architecture</h2>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">The following diagram shows the major components of the Android operating system. Each section is described in more detail below.</p>
<p><img class="alignright size-medium wp-image-1247" title="android-system-architecture" src="http://silextech.wordpress.com/files/2009/09/android-system-architecture.jpg?w=300" alt="android-system-architecture" width="300" height="215" /></p>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Applications</h2>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Android will ship with a set of core applications including an email client, SMS program, calendar, maps, browser, contacts, and others. All applications are written using the Java programming language.</p>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Application Framework</h2>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Developers have full access to the same framework APIs used by the core applications. The application architecture is designed to simplify the reuse of components; any application can publish its capabilities and any other application may then make use of those capabilities (subject to security constraints enforced by the framework). This same mechanism allows components to be replaced by the user.</p>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Underlying all applications is a set of services and systems, including:</p>
<ul style="line-height:1.3em;border:0 initial initial;margin:0 0 .8em;padding:0 0 0 2em;">
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;">A rich and extensible set of <a style="color:#006699;" href="http://developer.android.com/guide/tutorials/views/index.html">Views</a> that can be used to build an application, including lists, grids, text boxes, buttons, and even an embeddable web browser</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><a style="color:#006699;" href="http://developer.android.com/guide/topics/providers/content-providers.html">Content Providers</a> that enable applications to access data from other applications (such as Contacts), or to share their own data</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;">A <a style="color:#006699;" href="http://developer.android.com/guide/topics/resources/resources-i18n.html">Resource Manager</a>, providing access to non-code resources such as localized strings, graphics, and layout files</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;">A <a style="color:#006699;" href="http://developer.android.com/reference/android/app/NotificationManager.html">Notification Manager</a> that enables all applications to display custom alerts in the status bar</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;">An <a style="color:#006699;" href="http://developer.android.com/reference/android/app/Activity.html">Activity Manager</a> that manages the lifecycle of applications and provides a common navigation backstack</li>
</ul>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">For more details and a walkthrough of an application, see the <a style="color:#006699;" href="http://developer.android.com/guide/tutorials/notepad/index.html">Notepad Tutorial</a>.</p>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Libraries</h2>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Android includes a set of C/C++ libraries used by various components of the Android system. These capabilities are exposed to developers through the Android application framework. Some of the core libraries are listed below:</p>
<ul style="line-height:1.3em;border:0 initial initial;margin:0 0 .8em;padding:0 0 0 2em;">
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>System C library</strong> &#8211; a BSD-derived implementation of the standard C system library (libc), tuned for embedded Linux-based devices</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Media Libraries</strong> &#8211; based on PacketVideo&#8217;s OpenCORE; the libraries support playback and recording of many popular audio and video formats, as well as static image files, including MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>Surface Manager</strong> &#8211; manages access to the display subsystem and seamlessly composites 2D and 3D graphic layers from multiple applications</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>LibWebCore</strong> &#8211; a modern web browser engine which powers both the Android browser and an embeddable web view</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>SGL</strong> &#8211; the underlying 2D graphics engine</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>3D libraries</strong> &#8211; an implementation based on OpenGL ES 1.0 APIs; the libraries use either hardware 3D acceleration (where available) or the included, highly optimized 3D software rasterizer</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>FreeType</strong> &#8211; bitmap and vector font rendering</li>
<li style="line-height:1.3em;border:0 initial initial;margin:0;padding:0 0 .5em;"><strong>SQLite</strong> &#8211; a powerful and lightweight relational database engine available to all applications</li>
</ul>
<p><a name="runtime"></a></p>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Android Runtime</h2>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Android includes a set of core libraries that provides most of the functionality available in the core libraries of the Java programming language.</p>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Every Android application runs in its own process, with its own instance of the Dalvik virtual machine. Dalvik has been written so that a device can run multiple VMs efficiently. The Dalvik VM executes files in the Dalvik Executable (.dex) format which is optimized for minimal memory footprint. The VM is register-based, and runs classes compiled by a Java language compiler that have been transformed into the .dex format by the included &#8220;dx&#8221; tool.</p>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">The Dalvik VM relies on the Linux kernel for underlying functionality such as threading and low-level memory management.</p>
<h2 style="font-size:1.45em;color:#111111;max-width:968px;border-color:#cccccc initial initial;border-style:solid initial initial;border-width:2px 0 0;margin:1.5em 0 1em;padding:.5em 0 0;">Linux Kernel</h2>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">Android relies on Linux version 2.6 for core system services such as security, memory management, process management, network stack, and driver model. The kernel also acts as an abstraction layer between the hardware and the rest of the software stack.</p>
<p style="line-height:1.3em;border:0 initial initial;margin:0 0 1em;padding:0;">
<p>Cheers&#8230;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ideal Platforms for 3D Rendering]]></title>
<link>http://rebusfarm.wordpress.com/2009/09/17/ideal-platforms-for-3d-rendering/</link>
<pubDate>Thu, 17 Sep 2009 09:06:30 +0000</pubDate>
<dc:creator>rebusfarm</dc:creator>
<guid>http://rebusfarm.wordpress.com/2009/09/17/ideal-platforms-for-3d-rendering/</guid>
<description><![CDATA[3D graphics has taken over our visual space and it is small wonder that there are so many 3D graphic]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>3D graphics has taken over our visual space and it is small wonder that there are so many 3D graphics creating studios out there that are vying<br />
for attention. From advertising companies to website owners, every one wants 3D graphics and interactive solutions to wow their clients and<br />
visitors.</p>
<p>This has created the great demand that enables so many studios to come up in so little time. But the catch in this business is the cost of equipment. Systems for 3D graphic creation are expensive and they require a high amount of initial investment. This includes buying the main computers on which the main creation process will take place. Then come the usual accessories for crating the drawings and the wireframes. There is also the cost of infrastructure and softwares that add to the total sum that needs to be spent.</p>
<p>Till this point, it is still possible for studios to get away with investing in basic equipment to keep it cost effective. However, when it comes to building a rendering system, costs start to skyrocket. As most professionals and even amateurs would immediately, rendering is a processor intensive process and it takes a lot of processing power to crunch the data in at least twice that of real time.</p>
<p>However, the reality is that you need to have a very high amount of processing power to achieve decent speeds and one single CPU is never enough for this purpose. So most professional create smaller clusters of CPUs. This is based on the same principle that multi-core chips are based on &#8211; many hands make light work. This called parallel processing and it is how all high-demand computational jobs are carried out.</p>
<p>But these CPU clusters cannot be just chips put together because such a system would need to be custom made and that is super computers are built. Instead, the clusters are actually interconnected machines that are full-fledged systems. They have the full chip, motherboard, RAM, storage and OS setup. Their combined processing power is called upon to make the rendering process faster. After all, no one really wants to wait for days to finish rendering a movie!</p>
<p>But creating such cluster is expensive. Each system needs to be a capable system to be able to contribute properly to the process. This where the costs   really start to escalate. Thankfully, solutions do exists and you do not have to physically go somewhere else either.</p>
<p>There are good <a href="http://www.rebusfarm.com">renderfarm</a> that operate through the Internet and offer you prices based on how much processing power you will need. The calculation is done on the basis of per Ghz of processing power required by each <a href="http://www.rebusfarm.de">renderfarm</a>. And you do not have to worry about the types of rendering they support because integration is provided for all major softwares and their rendering types. This includes Maxwell render, mental ray, v ray, final render, and vue, just to name a few. All major softwares like 3D Max, Maya, Blender, etc are fully supported.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Weekly Highlights, 19 to 25 October 09 : All About Design]]></title>
<link>http://nyplibrary.wordpress.com/2009/10/19/weekly-highlights-19-to-25-october-09-all-about-design/</link>
<pubDate>Mon, 19 Oct 2009 02:24:59 +0000</pubDate>
<dc:creator>nyplibrary</dc:creator>
<guid>http://nyplibrary.wordpress.com/2009/10/19/weekly-highlights-19-to-25-october-09-all-about-design/</guid>
<description><![CDATA[Do you want to learn more about hidden forms, how you can see and understand ordinary everyday thing]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><a href="http://nyplibrary.wordpress.com/files/2009/10/weekly_highlights_main_reference1.jpg"><img class="aligncenter size-full wp-image-1444" title="weekly_highlights_main_reference1" src="http://nyplibrary.wordpress.com/files/2009/10/weekly_highlights_main_reference1.jpg" alt="weekly_highlights_main_reference1" width="500" height="139" /></a><span style="font-size:x-small;font-family:Helv;">Do you want to learn more about hidden forms, how you can see and understand ordinary everyday things around you? Do you want to know more about the history of interior design? What about the 3D graphic space? If your answer is yes, come visit the Library and check read these titles in our Design Collection.</p>
<table border="0" width="450" bgcolor="#333333">
<tbody>
<tr>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=124979" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=159253533X/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=118954" target="_blank"> </a></td>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=126728" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=1845202171/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127941" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=082309796X/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=126423" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=1600611435/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
</tr>
<tr>
<td style="color:#ffffff;" valign="top">1000 bags, tags &#38; labels : distinctive design for every industry<br />
<span style="color:#ffff00;">NC1002 L3 E37</span></td>
<td style="color:#ffffff;" valign="top">American visual culture<br />
<span style="color:#ffff00;">NX503 R261</span></td>
<td style="color:#ffffff;" valign="top">Comic book design<br />
<span style="color:#ffff00;">NC1764 M654</span></td>
<td style="color:#ffffff;" valign="top">Creature features : draw amazing monsters &#38; aliens <span style="color:#ffff00;">NC1764.8 M65 M385</span></td>
</tr>
<tr>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127945" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=0262162555/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127940" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=0240811631/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=125580" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=0470390735/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127930" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=2940373922/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
</tr>
<tr>
<td style="color:#ffffff;" valign="top">Design meets disability<br />
<span style="color:#ffff00;">NK1110 P982</span></td>
<td style="color:#ffffff;" valign="top">Elemental magic : the art of special effects animation<br />
<span style="color:#ffff00;">NC1765 G475</span></td>
<td style="color:#ffffff;" valign="top">Figure drawing for dummies<br />
<span style="color:#ffff00;">NC765 O41</span></td>
<td style="color:#ffffff;" valign="top">The fundamentals of interior design<br />
<span style="color:#ffff00;">NK2110 D647</span></td>
</tr>
<tr>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127957" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=2940373175/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=126424" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=1600611826/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127962" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=3764389664/mc.gif&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=126734" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=1563674629/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
</tr>
<tr>
<td style="color:#ffffff;" valign="top">The fundamentals of product design<br />
<span style="color:#ffff00;">TS171 M877</span></td>
<td style="color:#ffffff;" valign="top">Goblinoids : how to draw and paint goblins, orcs and other dark creatures<br />
<span style="color:#ffff00;">NC825 F25 P985</span></td>
<td style="color:#ffffff;" valign="top">Hidden forms : seeing and understanding things<br />
<span style="color:#ffff00;">TS171.6 C642</span></td>
<td style="color:#ffffff;" valign="top">History of interior design<br />
<span style="color:#ffff00;">NK1710 I65</span></td>
</tr>
<tr>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127927" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=0811860752/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127960" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=3764388951/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127950" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=0714856665/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td valign="top"><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127958" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=2940373876/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
</tr>
<tr>
<td style="color:#ffffff;" valign="top">I miss my pencil : a design exploration<br />
<span style="color:#ffff00;">NK1510 B712</span></td>
<td style="color:#ffffff;" valign="top">Limited edition : prototypes, one-offs and design art furniture<br />
<span style="color:#ffff00;">NK2231 L911</span></td>
<td style="color:#ffffff;" valign="top">Mass production<br />
<span style="color:#ffff00;">TS171 M414</span></td>
<td style="color:#ffffff;" valign="top">Material thoughts<br />
<span style="color:#ffff00;">TS171.4 B815</span></td>
</tr>
<tr>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127931" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=3037680075/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=125935" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=3866540698/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=123873" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=376438848X/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127132" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=3764387718/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
</tr>
<tr>
<td style="color:#ffffff;" valign="top">Office architecture + design<br />
<span style="color:#ffff00;">NA6230 M551</span></td>
<td style="color:#ffffff;" valign="top">Patricia Urquiola<br />
<span style="color:#ffff00;">NK1452 Z9 P314</span></td>
<td style="color:#ffffff;" valign="top">Spatial design<br />
<span style="color:#ffff00;">NA2765 E96</span></td>
<td style="color:#ffffff;" valign="top">Three D : graphic spaces<br />
<span style="color:#ffff00;">NC998.4 T531</span></td>
</tr>
<tr>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=125876" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=9881807816/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=126420" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=0847832031/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127122" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=294037399X/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
<td><a href="http://libopac.nyp.edu.sg/cgi-bin/spydus.exe/ENQ/OPAC/BIBENQ?ENTRY_NAME=BRN&#38;ENTRY=127111" target="_blank"><img src="http://syndetics.com/index.aspx?ISBN=4894447592/lc.jpg&#38;client=civicatest&#38;upc=&#38;oclc=" border="0" alt="" width="105" height="120" /></a></td>
</tr>
<tr>
<td style="color:#ffffff;" valign="top">Thunderbolt illustration<br />
<span style="color:#ffff00;">NC1001 T535</span></td>
<td style="color:#ffffff;" valign="top">Tiny houses<br />
<span style="color:#ffff00;">NA7126 Z46</span></td>
<td style="color:#ffffff;" valign="top">Virtual typography<br />
<span style="color:#ffff00;">Z246 H654</span></td>
<td style="color:#ffffff;" valign="top">Works in progress : graphics for visual presentations<br />
<span style="color:#ffff00;">NC998.6 J3 A659</span></td>
</tr>
</tbody>
</table>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Introducing Stark's Twin Oaks Airpark]]></title>
<link>http://iblueyonder.wordpress.com/2009/10/11/introducing-starks-twin-oaks-airpark/</link>
<pubDate>Sun, 11 Oct 2009 18:04:51 +0000</pubDate>
<dc:creator>spotlope</dc:creator>
<guid>http://iblueyonder.wordpress.com/2009/10/11/introducing-starks-twin-oaks-airpark/</guid>
<description><![CDATA[This one has been a long time in the making, but the preview pics are finally available. My first pr]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>This one has been a long time in the making, but the preview pics are finally available. My first project for Orbx is nearing completion: <a href="http://www.fullterrain.com/product_us7S3.html" target="_blank">7S3: Stark&#8217;s Twin Oaks Airpark</a>. It&#8217;s designed to fit seamlessly into the upcoming FTX NA Blue Pacific Northwest scenery, but it&#8217;ll stand alone as well.</p>
<p style="text-align:center;"><a href="http://iblueyonder.wordpress.com/files/2009/10/twin-oaks-pano.jpg"><img class="aligncenter size-full wp-image-469" title="twin-oaks-pano" src="http://iblueyonder.wordpress.com/files/2009/10/twin-oaks-pano.jpg" alt="twin-oaks-pano" width="499" height="156" /></a></p>
<p>If ever there was a small airport that captured the spirit of GA flying in America, this is it. From the official blurb:</p>
<blockquote><p>Nestled in the rolling farmland of the fertile Willamette Valley near Portland, Oregon, Stark&#8217;s Twin Oaks Airpark is ideally located for sightseeing in the Pacific Northwest. The rural location makes for less traffic and a relaxed atmosphere, while providing an easy jumping-off point for flights to either the coast to the west, or the rugged peaks of the Cascade range to the east.</p>
<p>The scenery includes a large area of 30cm/pixel aerial photoreal terrain, featuring the various orchards, Alpaca ranches, and small farms in the area. One special point of interest is the massive Glacier rock quarry, located a few miles to the southeast of the field. It deftly shows the sim possibilities when high-resolution terrain mesh is matched with detailed and meticulously color-corrected aerial photography. The high-quality mesh also makes another appearance, in what is quite possibly a first for an FS airport: multiple elevations. Twin Oaks is carved from the side of a gentle slope, and as a result, the Starks&#8217; house, garage, and two of the hangars are on a hill overlooking the rest of the field. Lead developer Bill Womack has obsessively researched and photographed the airport over the last few years, with the enthusiastic support of owners Bob and Betty Stark. We&#8217;re proud to offer the definitive sim rendition of one of Oregon&#8217;s aviation jewels.</p></blockquote>
<p><a href="http://www.fullterrain.com/product_us7S3.html" target="_blank">Check out the preview pics here</a>. And while you&#8217;re at it, have a look at the other releases planned for both North America and Australia.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Chyron's Latest Demo Reel]]></title>
<link>http://chyronchat.com/2009/10/09/chyrons-latest-demo-reel/</link>
<pubDate>Fri, 09 Oct 2009 15:05:21 +0000</pubDate>
<dc:creator>chyronchat</dc:creator>
<guid>http://chyronchat.com/2009/10/09/chyrons-latest-demo-reel/</guid>
<description><![CDATA[For more Chyron videos, don&#8217;t forget to visit out YouTube channel.]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/DlmU1sws6x4&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;hd=0' /><param name='allowfullscreen' value='true' /><param name='wmode' value='transparent' /><embed src='http://www.youtube.com/v/DlmU1sws6x4&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;hd=0' type='application/x-shockwave-flash' allowfullscreen='true' width='425' height='350' wmode='transparent'></embed></object></span></p>
<p>For more Chyron videos, don&#8217;t forget to visit out <a href="bit.ly/nYhf8">YouTube channel</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[AFX and Graphix are the new like whaat? ish!]]></title>
<link>http://nevamwiti.com/2009/10/06/grfxvi/</link>
<pubDate>Tue, 06 Oct 2009 03:00:30 +0000</pubDate>
<dc:creator>Influence Media</dc:creator>
<guid>http://nevamwiti.com/2009/10/06/grfxvi/</guid>
<description><![CDATA[Great graphic treatment and AFX for NY Times ad. Brill! Like whaaat??]]></description>
<content:encoded><![CDATA[Great graphic treatment and AFX for NY Times ad. Brill! Like whaaat??]]></content:encoded>
</item>
<item>
<title><![CDATA[3D computer graphics]]></title>
<link>http://oxizen3danimation.wordpress.com/2009/10/04/3d-computer-graphics/</link>
<pubDate>Sun, 04 Oct 2009 19:23:32 +0000</pubDate>
<dc:creator>oxizen3danimation</dc:creator>
<guid>http://oxizen3danimation.wordpress.com/2009/10/04/3d-computer-graphics/</guid>
<description><![CDATA[This article is about process of creating 3D computer graphics. For information on the study of comp]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>This article is about process of creating 3D computer graphics. For information on the study of computer graphics, see Computer graphics.</p>
<p>3D computer graphics (in contrast to 2D computer graphics) are graphics that use a three-dimensional representation of geometric data (Cartesian) that is stored in the computer for the purposes of performing calculations and rendering 2D images. Such images may be for later display or for real-time viewing.</p>
<p>Despite these differences, 3D computer graphics rely on many of the same algorithms as 2D computer vector graphics in the wire-frame model and 2D computer raster graphics in the final rendered display. In computer graphics software, the distinction between 2D and 3D is occasionally blurred; 2D applications may use 3D techniques to achieve effects such as lighting, and primarily 3D may use 2D rendering techniques.</p>
<p>3D computer graphics are often referred to as 3D models. Apart from the rendered graphic, the model is contained within the graphical data file. However, there are differences. A 3D model is the mathematical representation of any three-dimensional object (either inanimate or living). A model is not technically a graphic until it is visually displayed. Due to 3D printing, 3D models are not confined to virtual space. A model can be displayed visually as a two-dimensional image through a process called 3D rendering, or used in non-graphical computer simulations and calculations.<br />
Contents</p>
<p style="padding-left:30px;"><span style="text-decoration:underline;"><strong>3D computer graphics </strong></span><br />
<span style="color:#ff0000;"> <span style="color:#0000ff;"><span style="text-decoration:underline;"> Basic</span></span></span><br />
3D modeling / 3D scanning<br />
3D rendering / 3D printing<br />
3D computer graphics software<br />
<span style="color:#0000ff;"> <span style="color:#0000ff;"><span style="text-decoration:underline;">Primary Uses</span></span></span><br />
3D models / Computer-aided design<br />
Graphic design / Video games<br />
Visual effects / Visualization<br />
Virtual engineering / Virtual reality<br />
<span style="color:#0000ff;"> <span style="text-decoration:underline;"> Related concepts</span></span><br />
CGI / Animation / 3D display<br />
Wireframe model / Texture mapping<br />
Computer animation / Motion capture<br />
Skeletal animation / Crowd simulation<br />
Global illumination / Volume rendering</p>
<h2 style="text-align:left;padding-left:30px;"><span style="text-decoration:underline;"><strong>Contents</strong></span></h2>
<p style="padding-left:30px;">* 1 History<br />
* 2 Overview<br />
o 2.1 Modeling<br />
o 2.2 Layout and animation<br />
o 2.3 Rendering<br />
* 3 Communities<br />
* 4 Distinction from photorealistic 2D graphics<br />
* 5 See also<br />
* 6 References<br />
* 7 External links</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
