<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4340703130925509479</id><updated>2012-01-28T09:04:30.021-05:00</updated><category term='nature_of_code'/><category term='daybright'/><category term='applications'/><category term='phys-comp'/><category term='python'/><category term='glsl'/><category term='shiver'/><category term='random'/><category term='maya'/><category term='comp-cameras'/><category term='icm'/><category term='pixel-by-pixel'/><category term='itp'/><title type='text'>Will at ITP</title><subtitle type='html'>Nearing singularity at the Interactive Telecommunications Department at New York University.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-2732185587533621100</id><published>2008-04-23T12:12:00.014-04:00</published><updated>2008-04-23T16:35:20.174-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glsl'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>GLSL Fruit Shaders</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/SA92NNFm_RI/AAAAAAAAAJ0/73sXjaRJBuo/s1600-h/fruit_shaders.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/SA92NNFm_RI/AAAAAAAAAJ0/73sXjaRJBuo/s400/fruit_shaders.jpg" alt="" id="BLOGGER_PHOTO_ID_5192498864605035794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1:  Screen captures of orange and apple shaders&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For an OpenGL project I am helping fellow NYU-ITP graduate student Matt Parker with; I developed two real-time shaders written in GLSL to be applied to poly-spheres representing two types of fruit: apples and oranges.  Due to the sheer number of spheres being displayed, the object on my end was to get a high-amount of surface detail using a limited amount of polygons.   To accomplish this, I used a combination of displacement and normal mapping calculation in the shader, meaning that all surface detail is accomplished through the GPU.&lt;br /&gt;&lt;br /&gt;I have already written about how displacement is done through shaders - the very same technique I used in the past was also used in this set of shaders:&lt;br /&gt;&lt;a href="http://will-at-itp.blogspot.com/2007/11/shiver-development-displacement.html"&gt;Geometry Displacement through GLSL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Color variance along the geometric surface in regard to light has changed apart from my past shader work, where I have written in ambient and specular calculations through accessing the light (&lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;) and given surface material (&lt;span style="font-weight: bold;"&gt;M&lt;/span&gt;), where:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Diffuse:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/SA9tENFm_OI/AAAAAAAAAJc/TDdewQMuBZM/s1600-h/eqdifflight.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/SA9tENFm_OI/AAAAAAAAAJc/TDdewQMuBZM/s400/eqdifflight.gif" alt="" id="BLOGGER_PHOTO_ID_5192488814381563106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Ambient:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/SA9tjtFm_PI/AAAAAAAAAJk/vNKJjpyLi0g/s1600-h/ambient.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/SA9tjtFm_PI/AAAAAAAAAJk/vNKJjpyLi0g/s400/ambient.gif" alt="" id="BLOGGER_PHOTO_ID_5192489355547442418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Specular&lt;/span&gt; (where &lt;span style="font-weight: bold;"&gt;H&lt;/span&gt; is the given half-vector):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/SA9untFm_QI/AAAAAAAAAJs/ZxopXKKf0EY/s1600-h/eqblinnphong.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/SA9untFm_QI/AAAAAAAAAJs/ZxopXKKf0EY/s400/eqblinnphong.gif" alt="" id="BLOGGER_PHOTO_ID_5192490523778546946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To simulate the surface shape variance needed to pull off the appearance of an orange, a popular technique called "bump-mapping" was used.   Bump-mapping is generally accomplished by having a normal-map which is sampled as XYZ vectors which are supplemented across the geo-normal matrix that the shader is applied to.   The Lambert term for the normal is calcuated, which is simply the dot product of the normal and the light direction. If the lambert term is above 0.0, calcuate specular and add to the final color for the fragment.  Here is some sample code to illustrate:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;vec3 N = texture2D(normalMap, gl_TexCoord[0].st).rgb *&lt;br /&gt;               2.0 - 1.0;&lt;br /&gt;float lambert_term = max(dot(N,L),0.0);&lt;br /&gt;&lt;br /&gt;if (lambert_term &gt; 0.0)    {&lt;br /&gt;// Compute specular&lt;br /&gt;vec3 E = normalize(eyeVec);&lt;br /&gt;vec3 R = reflect(-L, N);&lt;br /&gt;float specular = pow(max(dot(R, E), 0.0),&lt;br /&gt;                     gl_FrontMaterial.shininess);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The finished shader encompasses texturing, displacement, and normal mapping, resulting in a nice aesthetic simulating a complex surface with light calculations matching the surface variance.   All of this occurring on a low-poly (16 x 16) quadric sphere object.  Rotation animation simulated in real-time of the orange shader below:&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-c54aabc92b8fe5fb" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v10.nonxt2.googlevideo.com/videoplayback?id%3Dc54aabc92b8fe5fb%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D270DA2EC9B3CB2FDB22159DBE48E2DE32B594179.3346B39DAE3C36F632BBA58A783F1318A7E0B13%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dc54aabc92b8fe5fb%26offsetms%3D5000%26itag%3Dw160%26sigh%3DG_vl4AAoBStYXR4BNTMsl_sfdGA&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v10.nonxt2.googlevideo.com/videoplayback?id%3Dc54aabc92b8fe5fb%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D270DA2EC9B3CB2FDB22159DBE48E2DE32B594179.3346B39DAE3C36F632BBA58A783F1318A7E0B13%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dc54aabc92b8fe5fb%26offsetms%3D5000%26itag%3Dw160%26sigh%3DG_vl4AAoBStYXR4BNTMsl_sfdGA&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Orange shader rotation animation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sources for general information/reference and equation images:&lt;br /&gt;&lt;a href="http://www.ozone3d.net/"&gt;ozone3D.net&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lighthouse3d.com/"&gt;Lighthouse3D.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://opengl.org/"&gt;OpenGL.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-2732185587533621100?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=c54aabc92b8fe5fb&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/2732185587533621100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=2732185587533621100' title='56 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2732185587533621100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2732185587533621100'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/04/glsl-fruit-shaders.html' title='GLSL Fruit Shaders'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/SA92NNFm_RI/AAAAAAAAAJ0/73sXjaRJBuo/s72-c/fruit_shaders.jpg' height='72' width='72'/><thr:total>56</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-3316403302597733115</id><published>2008-04-16T15:15:00.010-04:00</published><updated>2008-04-16T16:02:26.343-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maya'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Maya: Fluid Gradient Programming (Plug-In)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/SAZVIsh3yqI/AAAAAAAAAJM/reoYVoXTrHg/s1600-h/fire_image.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/SAZVIsh3yqI/AAAAAAAAAJM/reoYVoXTrHg/s400/fire_image.jpg" alt="" id="BLOGGER_PHOTO_ID_5189929228471618210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Still of fluid-based fire simulation, with colors generated through plug-in gradient mapping system&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am currently developing a plug-in for Maya, a popular 3D modeling/animation package.  The goal for the plug-in as a whole is to reinvent how fluid dynamic systems/effects are developed in Maya by constructing a node-based GUI which can be used within Maya, with each node encapsulating a current feature Maya fluids currently have - essentially adding on a layer of abstraction for the user to more easily generate simulations.  The plug-in also aims to extend the current feature set of fluids within Maya.&lt;br /&gt;&lt;br /&gt;I decided to start the development of the plug-in with a quick experiment, that being the integration of the generic gradient object class I developed earlier this semester with the Maya native gradient data driving color and incandescence.  The aim being that images could be sampled and have their most dominate colors applied to the color/incandescence of the fluid voxel-system within Maya - thus automating the construction of the color palette for a given effect.   The results and rendered video are posted below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/SAZQnch3yoI/AAAAAAAAAI8/avSwCoxL4Rk/s1600-h/grad_before.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/SAZQnch3yoI/AAAAAAAAAI8/avSwCoxL4Rk/s400/grad_before.jpg" alt="" id="BLOGGER_PHOTO_ID_5189924259194456706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Default Maya Fluid Effects values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/SAZQj8h3ynI/AAAAAAAAAI0/RhP-2OXKWmI/s1600-h/ft_menu.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/SAZQj8h3ynI/AAAAAAAAAI0/RhP-2OXKWmI/s400/ft_menu.jpg" alt="" id="BLOGGER_PHOTO_ID_5189924199064914546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.3: Early development of Maya plug-in as a drop-menu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/SAZQgsh3ymI/AAAAAAAAAIs/xhiI99njsgk/s1600-h/explosion.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/SAZQgsh3ymI/AAAAAAAAAIs/xhiI99njsgk/s400/explosion.jpg" alt="" id="BLOGGER_PHOTO_ID_5189924143230339682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.4:  Image chosen to have dominate colors sampled&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/SAZQqsh3ypI/AAAAAAAAAJE/ljqYDqVq5Kg/s1600-h/grad_after.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/SAZQqsh3ypI/AAAAAAAAAJE/ljqYDqVq5Kg/s400/grad_after.jpg" alt="" id="BLOGGER_PHOTO_ID_5189924315029031570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.5: Image sampled gradient constructed and mapped into Maya's attribute data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-bc96de6e36b2928" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v18.nonxt2.googlevideo.com/videoplayback?id%3D0bc96de6e36b2928%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D67428EE22930E4F0159E6BC14754532F12D71BC6.38D7219EEBA831219C3D3A51D6890D3E0559E729%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dbc96de6e36b2928%26offsetms%3D5000%26itag%3Dw160%26sigh%3DEpnbU_XmKvn0DmX1AUUpG3UoiR0&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v18.nonxt2.googlevideo.com/videoplayback?id%3D0bc96de6e36b2928%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D67428EE22930E4F0159E6BC14754532F12D71BC6.38D7219EEBA831219C3D3A51D6890D3E0559E729%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dbc96de6e36b2928%26offsetms%3D5000%26itag%3Dw160%26sigh%3DEpnbU_XmKvn0DmX1AUUpG3UoiR0&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.6: Fluid fire simulation animation, colors derived from gradient sampling without modification&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-3316403302597733115?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=bc96de6e36b2928&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/3316403302597733115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=3316403302597733115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/3316403302597733115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/3316403302597733115'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/04/maya-fluid-gradient-programming-plug-in.html' title='Maya: Fluid Gradient Programming (Plug-In)'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rTWCmr2q_kw/SAZVIsh3yqI/AAAAAAAAAJM/reoYVoXTrHg/s72-c/fire_image.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-1351739566690618618</id><published>2008-04-02T22:49:00.005-04:00</published><updated>2008-04-02T23:52:26.131-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Animation: Luma-Displacement / Glow (OpenGL / GLSL)</title><content type='html'>Sphere with an animated displacement GLSL shader that calculates a glow / bloom effect along defined distance from midpoint. &lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-e0d8ec0facf2cb3d" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v18.nonxt7.googlevideo.com/videoplayback?id%3De0d8ec0facf2cb3d%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D16DE677730EB5740D380DCF903E0F242887F7D52.520B6415B4CD2C1FF78321B53DE83F23E35CAC83%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3De0d8ec0facf2cb3d%26offsetms%3D5000%26itag%3Dw160%26sigh%3D5XBUCHiMZqFTYlpnqGJZd0fa1Kw&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v18.nonxt7.googlevideo.com/videoplayback?id%3De0d8ec0facf2cb3d%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D16DE677730EB5740D380DCF903E0F242887F7D52.520B6415B4CD2C1FF78321B53DE83F23E35CAC83%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3De0d8ec0facf2cb3d%26offsetms%3D5000%26itag%3Dw160%26sigh%3D5XBUCHiMZqFTYlpnqGJZd0fa1Kw&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-1351739566690618618?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=e0d8ec0facf2cb3d&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/1351739566690618618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=1351739566690618618' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1351739566690618618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1351739566690618618'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/04/animation-luma-displacement-opengl-glsl.html' title='Animation: Luma-Displacement / Glow (OpenGL / GLSL)'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-973769119723585476</id><published>2008-04-01T21:07:00.003-04:00</published><updated>2008-04-01T21:12:12.127-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Luma-Based Displacement</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R_LdAmjregI/AAAAAAAAAIk/Zsi99lcKqNo/s1600-h/Untitled-2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R_LdAmjregI/AAAAAAAAAIk/Zsi99lcKqNo/s400/Untitled-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5184449123476797954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1:  In-progress glacier shader with geometric displacement&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-973769119723585476?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/973769119723585476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=973769119723585476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/973769119723585476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/973769119723585476'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/04/luma-based-displacement.html' title='Luma-Based Displacement'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rTWCmr2q_kw/R_LdAmjregI/AAAAAAAAAIk/Zsi99lcKqNo/s72-c/Untitled-2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-8079367425431924536</id><published>2008-03-24T13:44:00.011-04:00</published><updated>2008-03-24T15:32:25.370-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Python vs. Java vs. Python/Weave</title><content type='html'>In case you haven't noticed, I am a rather big proponent of using Python whenever possible.  Between Python's flexibility and just the enjoyment I get out of writing in the language, I generally look to use Python before turning to a static language such as C/C++ or Java.  The times I have had to turn to a compiled language are usually linked to when I need computational speed.&lt;br /&gt;&lt;br /&gt;There are several ways to get Python moving faster - some a bit more ugly than others; code speedups with Python are usually about trading in readability for performance, but that doesn't mean it can't be straight-forward in implementation.  In the past, I have used the usual bag of Python tricks: list comprehensions, method/variable assignment outside loops, generators, and countless more pure-Python solutions.&lt;br /&gt;&lt;br /&gt;Recently, I stumbled upon Weave, a module existing inside the popular SciPy library which allows for C code to be mixed with Python code.  Using Weave allows for the coder to stay inside the bounds of Python, yet use to power of C to compute the heavier algorithms.  Not only does it provide a speed increase... it beats Java.  Consider this (nonsensical) algorithm comparison between pure Python, Java, and Weave + Python:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Python Example:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R-f6s2jrebI/AAAAAAAAAH8/qrD7rwWE-fo/s1600-h/python_code.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R-f6s2jrebI/AAAAAAAAAH8/qrD7rwWE-fo/s400/python_code.jpg" alt="" id="BLOGGER_PHOTO_ID_5181385544779397554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Time:&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;1.681&lt;/span&gt; &lt;span style="font-size:85%;"&gt;sec.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Java Example:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R-f83GjrefI/AAAAAAAAAIc/TKhmMlVsyjo/s1600-h/java_code.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R-f83GjrefI/AAAAAAAAAIc/TKhmMlVsyjo/s400/java_code.jpg" alt="" id="BLOGGER_PHOTO_ID_5181387919896312306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Time:&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;0.037&lt;/span&gt; &lt;span style="font-size:85%;"&gt;sec.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Python + Weave Example:&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R-f7gmjreeI/AAAAAAAAAIU/p7Sn1OcxL_U/s1600-h/weave_code.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R-f7gmjreeI/AAAAAAAAAIU/p7Sn1OcxL_U/s400/weave_code.jpg" alt="" id="BLOGGER_PHOTO_ID_5181386433837627874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Time:&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;0.017&lt;/span&gt; &lt;span style="font-size:85%;"&gt;sec.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Using identical algorithms in all three tests; using Weave with Python was nearly 100 times faster (98.9x) than using pure Python alone.  In comparison to Java, Weave + Python was a shade &lt;span style="font-weight: bold;"&gt;over 2 times faster (2.1x) than Java.&lt;/span&gt;  Although the Python/Weave code itself is bigger than the pure Python and Java examples - the speed it provides is absolutely phenomenal, without ever leaving your .py file. &lt;br /&gt;&lt;br /&gt;Hopefully, I'll be able to use the power of mixing C with Python for more elaborate purposes - but this test alone is enough to get me excited about future projects with Python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-8079367425431924536?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/8079367425431924536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=8079367425431924536' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8079367425431924536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8079367425431924536'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/03/python-vs-java-vs-pythonweave.html' title='Python vs. Java vs. Python/Weave'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/R-f6s2jrebI/AAAAAAAAAH8/qrD7rwWE-fo/s72-c/python_code.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-3852029557257664572</id><published>2008-03-12T13:09:00.014-04:00</published><updated>2008-03-12T14:00:20.937-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Gradient / Render Integration</title><content type='html'>I have now managed to get DayBRIGHT to render out a full animation using a gradient as the light source.  While the animation scene itself is rather basic, with three spheres inside a box, it demonstrates some of the primary goals of the project.&lt;br /&gt;&lt;br /&gt;Now that the gradient data structure integrates with the rendering process, it now becomes a matter of writing the translators for each type of media I'd like to use - as well as developing a more interesting scene to light.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-d031b8c110f45941" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v8.nonxt1.googlevideo.com/videoplayback?id%3Dd031b8c110f45941%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D30441A215166068A4FDBB5CEC68A248F62BBF9BF.1738ADA0FA87487460855F2ABF0C72B1F2E6555%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dd031b8c110f45941%26offsetms%3D5000%26itag%3Dw160%26sigh%3DhOm4fzz77FMpWLbU_jk1DIPs6WA&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v8.nonxt1.googlevideo.com/videoplayback?id%3Dd031b8c110f45941%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D30441A215166068A4FDBB5CEC68A248F62BBF9BF.1738ADA0FA87487460855F2ABF0C72B1F2E6555%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Dd031b8c110f45941%26offsetms%3D5000%26itag%3Dw160%26sigh%3DhOm4fzz77FMpWLbU_jk1DIPs6WA&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R9gRm1Uia0I/AAAAAAAAAHQ/ODDE8OLZ89g/s1600-h/gradient.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 50px;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R9gRm1Uia0I/AAAAAAAAAHQ/ODDE8OLZ89g/s400/gradient.jpg" alt="" id="BLOGGER_PHOTO_ID_5176907130508307266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1 + 1.2: Animation using displayed gradient as lighting source over time&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Indirect surface shader code:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R9gZKlUia5I/AAAAAAAAAH0/b4dljYB-5Sg/s1600-h/shader_code.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R9gZKlUia5I/AAAAAAAAAH0/b4dljYB-5Sg/s400/shader_code.jpg" alt="" id="BLOGGER_PHOTO_ID_5176915441270025106" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-3852029557257664572?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=d031b8c110f45941&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/3852029557257664572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=3852029557257664572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/3852029557257664572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/3852029557257664572'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/03/daybright-gradient-render-integration.html' title='DayBRIGHT: Gradient / Render Integration'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/R9gRm1Uia0I/AAAAAAAAAHQ/ODDE8OLZ89g/s72-c/gradient.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-5748028388349499941</id><published>2008-03-03T19:24:00.008-05:00</published><updated>2008-03-03T20:05:22.299-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Post-Processing</title><content type='html'>Changing gears a bit, I decided to begin writing in some post-image processing functionality to DayBRIGHT to handle the final image output.  The first post-process was writing a color noise filter that blended a 1:1 ratio of random colored pixels with each rendered image .  This is done to counter the fact that the illusion of computer graphics being reality is often blown due to a discrepancy in noise artifacts across the image, most commonly noticed when graphics are composited with film or video footage.  Even without footage, the human mind does not normally process perfectly smooth color and shape with reality.  Reality rarely has instances of complete visual fidelity, at least from an everyday human perspective.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R8yY0VtCc2I/AAAAAAAAAG4/jMiVg7R1IRk/s1600-h/color_noise_chart.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R8yY0VtCc2I/AAAAAAAAAG4/jMiVg7R1IRk/s400/color_noise_chart.jpg" alt="" id="BLOGGER_PHOTO_ID_5173678096888525666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Simple color noise composite process&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another post-process that is necessary was gamma correction.  The algorithm resulting from the equation is straight-forward, where a gamma corrected set of values from 0-255 is created, then each RGB value from the given image is changed to the gamma corrected equivalent.  Below is the simple math equation for gamma correction and corresponding algorithm in (non-optimized) Python code:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R8yavFtCc3I/AAAAAAAAAHA/T6veMiYWfps/s1600-h/gammaEquation.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R8yavFtCc3I/AAAAAAAAAHA/T6veMiYWfps/s400/gammaEquation.png" alt="" id="BLOGGER_PHOTO_ID_5173680205717468018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Gamma correction equation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R8yecVtCc4I/AAAAAAAAAHI/rBGaoIzD-H4/s1600-h/gamma_code.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R8yecVtCc4I/AAAAAAAAAHI/rBGaoIzD-H4/s400/gamma_code.jpg" alt="" id="BLOGGER_PHOTO_ID_5173684281641431938" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-5748028388349499941?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/5748028388349499941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=5748028388349499941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5748028388349499941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5748028388349499941'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/03/daybright-post-processing.html' title='DayBRIGHT: Post-Processing'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rTWCmr2q_kw/R8yY0VtCc2I/AAAAAAAAAG4/jMiVg7R1IRk/s72-c/color_noise_chart.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-1187136120056599385</id><published>2008-03-01T14:02:00.007-05:00</published><updated>2008-03-12T14:02:18.731-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Renderman Rendering</title><content type='html'>Below are some test renders coded through Renderman and woven into the DayBRIGHT graphics and data handling subsystems.  Using the classic Cornell box, I was able to successfully simulate global illumination in combination with image based lighting.  The photon calculation isn't as smooth (or as fast) as I'd like it to be - but optimization will be taken care of later once I can generate reliable image sequences.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R8moz2HNwOI/AAAAAAAAAGg/YVGbx0Z_76k/s1600-h/cornell_box01.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R8moz2HNwOI/AAAAAAAAAGg/YVGbx0Z_76k/s400/cornell_box01.jpg" alt="" id="BLOGGER_PHOTO_ID_5172851255664296162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Global illumination / color bleeding &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R8mo72HNwQI/AAAAAAAAAGw/HhuLSDSXye4/s1600-h/cornell_box01_03.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R8mo72HNwQI/AAAAAAAAAGw/HhuLSDSXye4/s400/cornell_box01_03.jpg" alt="" id="BLOGGER_PHOTO_ID_5172851393103249666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Image-based lighting with accurate shadows.  Shadows no longer gradient of grays, but rather mixed with color pertaining to casting objects.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R8mo3WHNwPI/AAAAAAAAAGo/q-ZXS-Wou4Q/s1600-h/cornell_box01_02.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R8mo3WHNwPI/AAAAAAAAAGo/q-ZXS-Wou4Q/s400/cornell_box01_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5172851315793838322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.3: Classic Cornell box setup with pronounced color bleed&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-1187136120056599385?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/1187136120056599385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=1187136120056599385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1187136120056599385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1187136120056599385'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/03/daybright-processing-is-cute-and-all.html' title='DayBRIGHT: Renderman Rendering'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/R8moz2HNwOI/AAAAAAAAAGg/YVGbx0Z_76k/s72-c/cornell_box01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-4752665340818542053</id><published>2008-02-26T16:43:00.007-05:00</published><updated>2008-03-12T14:01:09.417-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Image to Gradient Translation</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);"&gt;The first translator I decided to fully flesh out for DayBRIGHT is the static image translator. The underlying system I have developed only has one principle rule - anything can be translated and used, as long as that translation returns a gradient object.  So, how can a gradient be created from an image?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;I took the route of writing an algorithm which finds and stores the most dominate colors in an image - then using each sample as a control point within a varying length linearly-smoothed gradient, where the most dominate colors are in order from left to right.  Below are some examples of the results, where the top is the source that was sampled and gradient is the output visualized:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R8SJMK5826I/AAAAAAAAAGI/cjdP-ZVtHSk/s1600-h/sky_grad.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R8SJMK5826I/AAAAAAAAAGI/cjdP-ZVtHSk/s400/sky_grad.jpg" alt="" id="BLOGGER_PHOTO_ID_5171409114307025826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;Fig 1.1: Sky converted to a gradient based on dominate colors&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R8SJRq5827I/AAAAAAAAAGQ/u8l-HzRyliI/s1600-h/kandCompVI_grad.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R8SJRq5827I/AAAAAAAAAGQ/u8l-HzRyliI/s400/kandCompVI_grad.jpg" alt="" id="BLOGGER_PHOTO_ID_5171409208796306354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;Fig 1.2: &lt;span style="font-style: italic;"&gt;Composition VI&lt;/span&gt;, W. Kandinsky - image to gradient conversion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R8SJWK5828I/AAAAAAAAAGY/08YBYkyPy9g/s1600-h/kandCompVII_grad.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R8SJWK5828I/AAAAAAAAAGY/08YBYkyPy9g/s400/kandCompVII_grad.jpg" alt="" id="BLOGGER_PHOTO_ID_5171409286105717698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;Fig 1.3: &lt;span style="font-style: italic;"&gt;Composition VII&lt;/span&gt;, W. Kandinsky - image to gradient conversion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Now that a method existed to translate static images into gradients, it becomes a trivial task to write a translator for a video feed, as video can be easily treated as a series of images.  Simple alterations to a subsystem can allow for a calculated sample of each frame in a gradient.  So, if a video feed were parsed once every hour for twenty four hours, a gradient could be constructed of n-length, linearly being smoothed evenly across each respective control point based on n+1 distance.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-4752665340818542053?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/4752665340818542053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=4752665340818542053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/4752665340818542053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/4752665340818542053'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/daybright-image-to-gradient-translation_26.html' title='DayBRIGHT: Image to Gradient Translation'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_rTWCmr2q_kw/R8SJMK5826I/AAAAAAAAAGI/cjdP-ZVtHSk/s72-c/sky_grad.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-1990490572742536528</id><published>2008-02-19T21:07:00.003-05:00</published><updated>2008-02-19T21:46:31.765-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Generic Structures</title><content type='html'>The underlying system DayBRIGHT uses to translate various data structures has become less about constraining data to a set format, and more about developing a generic structure (a gradient) to fully represent the data in an elegant way.  I find this an interesting topic to explore because it has really opened a lot of doors as to how far I can take his project; in particular, in the sheer variance of data I can now use. &lt;br /&gt;&lt;br /&gt;RSS feeds, video streams, static images, audio tracks, physical sensor data - all of which can be harbored by a single generic data structure.  Each piece of data simply needs its own translator towards being converted to the structure; once that is done - there is no further special-casing needed.  &lt;br /&gt;&lt;br /&gt;My goal for this project is to have, by the end of semester, a demonstration of how the various types of data listed above can be used to achieve results for an identical operation.  In the case of DayBRIGHT, I will be using the gradient structures to light 3D geometry.  How this will be done merits its own detailed entry - which is forthcoming.&lt;br /&gt;&lt;br /&gt;I am really excited about this idea, it is a blend of engineering/mathematics and visual aesthetics that I have always been drawn to.  I am dedicating all of my classes to it in hope that my time commitment will really push this idea as far as it can go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-1990490572742536528?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/1990490572742536528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=1990490572742536528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1990490572742536528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1990490572742536528'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/daybright-generic-structures.html' title='DayBRIGHT: Generic Structures'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-2338357429464220801</id><published>2008-02-15T17:59:00.008-05:00</published><updated>2008-02-17T14:14:50.766-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Proposal + Test Video</title><content type='html'>The idea behind the DayBRIGHT project is to be able to visualize data through HDR light probes being influenced by various types of datasets.  Each dataset, be it an RSS weather forecast, webcam frame sequence, arbitrary color selection, or any other value - will be translated into a common format to be applied to a core HDR image.&lt;br /&gt;&lt;br /&gt;The DayBRIGHT project will be encapsulated within a core software application which will communicate with various data feeds.  As mentioned, each type of data will be converted to a common format: a color gradient.  A color gradient will allow for analysis of RGBA, as well as time by sampling across its length.  Depth can also be calculated by converting RGBA to luminance values.&lt;br /&gt;&lt;br /&gt;To render the results, the initial solution will be to use 3Delight, an implementation of the Renderman standard, first introduced by Pixar.  Using Renderman will allow for programming flexibility and high-quality renders at HD resolutions, if needed.  An example of the early results is shown below, where an orange -&gt; cyan color gradient has been applied:&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-f3d50c8a500ef19b" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v6.nonxt2.googlevideo.com/videoplayback?id%3Df3d50c8a500ef19b%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D5EEC879509A12B707AC77A5C7C5AE75BFCEEFBF.1BDE2DD1278F6A879263BCC23E2E3C39F58156F3%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Df3d50c8a500ef19b%26offsetms%3D5000%26itag%3Dw160%26sigh%3DYJR6xCbk4s-o4QzYKZjOwJJhN94&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v6.nonxt2.googlevideo.com/videoplayback?id%3Df3d50c8a500ef19b%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330084417%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D5EEC879509A12B707AC77A5C7C5AE75BFCEEFBF.1BDE2DD1278F6A879263BCC23E2E3C39F58156F3%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Df3d50c8a500ef19b%26offsetms%3D5000%26itag%3Dw160%26sigh%3DYJR6xCbk4s-o4QzYKZjOwJJhN94&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-2338357429464220801?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=f3d50c8a500ef19b&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/2338357429464220801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=2338357429464220801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2338357429464220801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2338357429464220801'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/daybright-proposal-test-video.html' title='DayBRIGHT: Proposal + Test Video'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-6871074904976146001</id><published>2008-02-13T21:45:00.004-05:00</published><updated>2008-02-13T22:09:37.630-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pixel-by-pixel'/><category scheme='http://www.blogger.com/atom/ns#' term='comp-cameras'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='daybright'/><title type='text'>DayBRIGHT: Gradient Sampling</title><content type='html'>One of the core concepts of the DayBRIGHT project that I am developing over this semester is to enable the ability to drive HDR lighting over time using a variety of methods - the first of which is using a simple color gradient.  &lt;br /&gt;&lt;br /&gt;For every frame to be rendered, a copy of the core HDR image is created, then a color overlay operation is applied to that copy - with the color applied being the current sample value of the gradient.  This relationship is graphically represented below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R7OrQa5821I/AAAAAAAAAFg/YWa0MKYyJDs/s1600-h/gradient_sampling.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R7OrQa5821I/AAAAAAAAAFg/YWa0MKYyJDs/s400/gradient_sampling.jpg" alt="" id="BLOGGER_PHOTO_ID_5166661496112733010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Graphical example of gradient sampling applied to image&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-6871074904976146001?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/6871074904976146001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=6871074904976146001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6871074904976146001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6871074904976146001'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/daybright-gradient-sampling.html' title='DayBRIGHT: Gradient Sampling'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_rTWCmr2q_kw/R7OrQa5821I/AAAAAAAAAFg/YWa0MKYyJDs/s72-c/gradient_sampling.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-6351149965253244503</id><published>2008-02-10T22:04:00.000-05:00</published><updated>2008-02-10T22:28:36.461-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Mind.Scribble.Form</title><content type='html'>My mind blurred, sketched, articulated, and scribbled on paper - most of which makes little to no sense to me currently.  I normally never write things down to remember for the future - I generally only do so to calculate or brainstorm on the spot.  Apparently, in parallel with my messy drawings, I also take photos without much care either.  I think I'll write that off as part of my "creative process" and hope that you believe me (which you shouldn't).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R6-_Sa582xI/AAAAAAAAAFA/gRgsliPMll8/s1600-h/scribbles_02.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R6-_Sa582xI/AAAAAAAAAFA/gRgsliPMll8/s400/scribbles_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5165557620798184210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R6-_Ma582wI/AAAAAAAAAE4/2jT3WeSqnRM/s1600-h/scribbles_01.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R6-_Ma582wI/AAAAAAAAAE4/2jT3WeSqnRM/s400/scribbles_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5165557517718969090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R6-_rq582yI/AAAAAAAAAFI/wuMuKchBhuo/s1600-h/scribble_04.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R6-_rq582yI/AAAAAAAAAFI/wuMuKchBhuo/s400/scribble_04.jpg" alt="" id="BLOGGER_PHOTO_ID_5165558054589881122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R6-_9a582zI/AAAAAAAAAFQ/Fgr-rKedIXI/s1600-h/scribble_05.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R6-_9a582zI/AAAAAAAAAFQ/Fgr-rKedIXI/s400/scribble_05.jpg" alt="" id="BLOGGER_PHOTO_ID_5165558359532559154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R6_AK65820I/AAAAAAAAAFY/3pZ7GU92RbU/s1600-h/scribble_06.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R6_AK65820I/AAAAAAAAAFY/3pZ7GU92RbU/s400/scribble_06.jpg" alt="" id="BLOGGER_PHOTO_ID_5165558591460793154" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-6351149965253244503?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/6351149965253244503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=6351149965253244503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6351149965253244503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6351149965253244503'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/mindscribbleform.html' title='Mind.Scribble.Form'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_rTWCmr2q_kw/R6-_Sa582xI/AAAAAAAAAFA/gRgsliPMll8/s72-c/scribbles_02.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-6914387140138885217</id><published>2008-02-06T13:47:00.000-05:00</published><updated>2008-02-06T14:05:08.938-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nature_of_code'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Blast Radius</title><content type='html'>Several layers of particles revolving around a central sphere - each layer being rotated based on assigned attraction forces.  Particles are symbolic of populous movement combined with the effect of unseen influence over collective entities - physically, socially, and otherwise.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R6oAOsnPgTI/AAAAAAAAAEo/PsQxreFqbtE/s1600-h/blastRadius_01.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R6oAOsnPgTI/AAAAAAAAAEo/PsQxreFqbtE/s400/blastRadius_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5163940175227617586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig. 1.1: Straight-on shot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R6oAUMnPgUI/AAAAAAAAAEw/cFxY6Tli5YY/s1600-h/blastRadius_02.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R6oAUMnPgUI/AAAAAAAAAEw/cFxY6Tli5YY/s400/blastRadius_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5163940269716898114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Corner angle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Source:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/noc/blast_radius/BlastRadiusMain.txt"&gt;BlastRadiusMain.java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/noc/blast_radius/GLSL.txt"&gt;GLSL.java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-6914387140138885217?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/6914387140138885217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=6914387140138885217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6914387140138885217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6914387140138885217'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/blast-radius.html' title='Blast Radius'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rTWCmr2q_kw/R6oAOsnPgTI/AAAAAAAAAEo/PsQxreFqbtE/s72-c/blastRadius_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-695340762936891044</id><published>2008-02-01T22:29:00.000-05:00</published><updated>2008-02-01T23:51:18.540-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pixel-by-pixel'/><category scheme='http://www.blogger.com/atom/ns#' term='comp-cameras'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Interactive and Time-Based HDR</title><content type='html'>I have been thinking a lot about pixels lately - most likely due to having a class with the given root word in it... twice.   So, we have all of this information nicely packed within a frame - now what to do with it?&lt;br /&gt;&lt;br /&gt;What I find interesting is how an image can be mined for data that is unseen upon first glance - and one of my favorite ideas in regard to this way of thinking is the creation and use of HDR images.  High-Dynamic Range images are useful for an assortment of reasons - in the field of computer graphics, they are many times used as a light source.   &lt;a href="http://www.debevec.org/"&gt;Paul Debevec&lt;/a&gt; is known as one of the groundbreaking researchers on the topic - and what initially began as technique for expensive high-end rendering has now been implemented in real-time in the past couple of years.  Check out his site to see some of the amazing things HDR images can be used for.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.debevec.org/Probes/rnl_probe.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://www.debevec.org/Probes/rnl_probe.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Example of a light-probe HDR image&lt;br /&gt;Credit: &lt;a href="http://www.debevec.org"&gt;http://www.debevec.org&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, what else can been done with HDR - and how can it be used to create something interesting?   For me, I want to explore moving away from leaving HDR lighting as a static image - and instead have it evolve over time while lighting a static scene.  A few ideas are: time-lapse HDR lighting, real-time interaction with the HDR image itself, tying HDR colorization with weather forecasting, integration with existing data sets, and so forth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-695340762936891044?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/695340762936891044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=695340762936891044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/695340762936891044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/695340762936891044'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/02/interactive-and-time-based-hdr.html' title='Interactive and Time-Based HDR'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-1005837809726213997</id><published>2008-01-17T17:23:00.000-05:00</published><updated>2008-01-17T22:17:51.205-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Programming, Ubiquity, Devices, and You</title><content type='html'>After telling fellow students at ITP about the classes I decided to sign up for the coming Spring semester, I have often been asked the following two questions:&lt;br /&gt;&lt;br /&gt;1. "Why are you taking programming centric classes if that is already one of your strengths?"&lt;br /&gt;&lt;br /&gt;2. "Why aren't you taking any physical computer related classes?"&lt;br /&gt;&lt;br /&gt;The answer to the first one is rather concise; I feel that staying constantly involved in software and mathematics allows me to build myself as a better overall problem-solver on both an analytical and creative basis.  Writing code to solve a problem is concurrently a step-by-step breakdown of the problem itself; patterns emerge and reveal themselves, woven with systems of varying elegance and complexity.  Understanding concepts which reveal such harmony will endure far past simply designing the next iPhone - leading me to the answer to the second question:&lt;br /&gt;&lt;br /&gt;My position on physical computing at it pertains to projects at ITP (and in general) is that the development of devices which we physically interact with is inevitably obsolete.  This is the century of biology - and consequently, biological micro-interfacing will be the future of device technology.  Increased ubiquity leading to result/reward has nearly always been the trend in tool advancements - computing is to exist behind a curtain whenever possible.  While it is certainly a valid venture to develop large-scale projects involving common electronics and so forth - I personally have little interest in pursuing similar implementation methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-1005837809726213997?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/1005837809726213997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=1005837809726213997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1005837809726213997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1005837809726213997'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2008/01/programming-ubiquity-devices-and-you.html' title='Programming, Ubiquity, Devices, and You'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-8907452404314463459</id><published>2007-12-10T22:12:00.000-05:00</published><updated>2007-12-14T22:03:12.177-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Software for Physical Display Project</title><content type='html'>Group: William McDonald, Sunghun Kim, Matt Parker&lt;br /&gt;&lt;br /&gt;Further documentation:&lt;br /&gt;&lt;a href="http://sunghunpcom.blogspot.com/"&gt;Sunghun with videos / images&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.google.com/TeamPresent?docid=dg5wb76z_79z9h4mngw"&gt;Matt on construction / mechanics&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For our group project, we wanted to develop a physical system to represent graphical depth data.  We decided to use a collection of sine and noise waves to start off with - as using depth data really only makes (practical) sense with a 3D grid.&lt;br /&gt;&lt;br /&gt;Using Processing, a straight-forward GUI was created featuring four buttons, with a graphical representation of the waves being dynamically created to the right of the buttons.  The fourth button allows the user to paint his/her own wave (or any shape, for that matter) and the software will generate a visualization and physical output for the image painted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R14Eqw5J-FI/AAAAAAAAADo/OqqH_ouXGNg/s1600-h/depth_before.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R14Eqw5J-FI/AAAAAAAAADo/OqqH_ouXGNg/s400/depth_before.jpg" alt="" id="BLOGGER_PHOTO_ID_5142552957229332562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1:  Drawing canvas allows user to draw images to physically visualize&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R14E_w5J-GI/AAAAAAAAADw/Xj3pfmcE7ZA/s1600-h/depth_result.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R14E_w5J-GI/AAAAAAAAADw/Xj3pfmcE7ZA/s400/depth_result.jpg" alt="" id="BLOGGER_PHOTO_ID_5142553318006585442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig. 1.2:  Visualization of user input wave drawing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To sample each wave - an algorithm was written which samples across the width of a given image proportional to the resolution of the physical system - in our case, 20 samples.  At each sample - the program checks to see how far down (Y) the image it takes in pixels before a color other than white is found.  Upon finding a color, the value of that sample is received by the simple equation of :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sample_value = y_coord / (image_height / max_value)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R14FHQ5J-HI/AAAAAAAAAD4/W_dwTbEao-s/s1600-h/wave_sampling.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R14FHQ5J-HI/AAAAAAAAAD4/W_dwTbEao-s/s400/wave_sampling.jpg" alt="" id="BLOGGER_PHOTO_ID_5142553446855604338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.3: Graphical representation of sampling method on wave images&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In regard to feeding this data into the servo motor array - we decided to use four arduino microprocessors connected via USB to the computer running the software application; with each arduino effectively controlling five servos:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R14cMw5J-II/AAAAAAAAAEA/lo5_4RR96VQ/s1600-h/servo_setup.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R14cMw5J-II/AAAAAAAAAEA/lo5_4RR96VQ/s400/servo_setup.jpg" alt="" id="BLOGGER_PHOTO_ID_5142578830112323714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.4:  Computer / Arduino / Servo array configuration&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-8907452404314463459?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/8907452404314463459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=8907452404314463459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8907452404314463459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8907452404314463459'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/12/software-for-physical-computing-final.html' title='Software for Physical Display Project'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_rTWCmr2q_kw/R14Eqw5J-FI/AAAAAAAAADo/OqqH_ouXGNg/s72-c/depth_before.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-2906432741142831217</id><published>2007-12-08T15:35:00.000-05:00</published><updated>2007-12-14T16:52:13.117-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='shiver'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Shiver - Final</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R13opQ5J-DI/AAAAAAAAADY/_blcwXkF1cY/s1600-h/shiver_splash.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R13opQ5J-DI/AAAAAAAAADY/_blcwXkF1cY/s400/shiver_splash.jpg" alt="" id="BLOGGER_PHOTO_ID_5142522145133951026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Splash screen for Shiver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last week of work on Shiver has primarily been a focus on adding features on the GUI side and tying up some loose ends.  The largest new feature is the ability to 'simulate' - which allows a user to simulate a full rotation (or however many wanted) of the globe, outputting the frames as an image sequence.  This process allows the user to see the rotation as a movie clip running at full speed.  The video in this blog entry is derived from that process.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R12bhQ5J-CI/AAAAAAAAADQ/PvSCYKRxVnw/s1600-h/simulate_menu.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R12bhQ5J-CI/AAAAAAAAADQ/PvSCYKRxVnw/s400/simulate_menu.jpg" alt="" id="BLOGGER_PHOTO_ID_5142437345299658786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Simulate options window&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Shiver is still very much a work in progress - however, I am pleased with the result of my work over the past 6-7 weeks, particularly with knowing that I was able to achieve high-quality imagery in real-time using Python and OpenGL together.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/icm/shiver/shiver_simulation.mov"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R13oxA5J-EI/AAAAAAAAADg/5rwKl0CevOQ/s400/video_still.jpg" alt="" id="BLOGGER_PHOTO_ID_5142522278277937218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/icm/shiver/shiver_simulation.mov"&gt;shiver_simulation.mov - 10.6mb&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Images from Shiver:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R17kFw5J-LI/AAAAAAAAAEY/VnVaejK_dOo/s1600-h/day_visualize.jpg"&gt;&lt;img style="cursor: pointer; width: 182px; height: 182px;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R17kFw5J-LI/AAAAAAAAAEY/VnVaejK_dOo/s200/day_visualize.jpg" alt="" id="BLOGGER_PHOTO_ID_5142798612178794674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R17kCg5J-KI/AAAAAAAAAEQ/MT3BWdSIzqc/s1600-h/cloud_cover.jpg"&gt;&lt;img style="cursor: pointer; width: 182px; height: 165px;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R17kCg5J-KI/AAAAAAAAAEQ/MT3BWdSIzqc/s200/cloud_cover.jpg" alt="" id="BLOGGER_PHOTO_ID_5142798556344219810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R17jkg5J-JI/AAAAAAAAAEI/_vLoZbPnFck/s1600-h/night_shot.jpg"&gt;&lt;img style="cursor: pointer; width: 182px; height: 167px;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R17jkg5J-JI/AAAAAAAAAEI/_vLoZbPnFck/s200/night_shot.jpg" alt="" id="BLOGGER_PHOTO_ID_5142798040948144274" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-2906432741142831217?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/2906432741142831217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=2906432741142831217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2906432741142831217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2906432741142831217'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/12/shiver-final.html' title='Shiver - Final'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rTWCmr2q_kw/R13opQ5J-DI/AAAAAAAAADY/_blcwXkF1cY/s72-c/shiver_splash.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-5960543696695896347</id><published>2007-12-04T21:19:00.000-05:00</published><updated>2007-12-04T21:51:55.030-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='shiver'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Shiver Development: Event Density + Time Charting</title><content type='html'>For the past few days, I decided to develop a type of visualization which attempts to better communicate the areas that have a high density of earthquakes over time.  I decided to do this by having the program create a texture on the fly which is fed into the primary globe fragment shader, where areas of high seismic event activity would get higher amounts of red.  Since the texture being created is simply a collection red blobs on a black background, it is simple process to add the red areas on top of the globe through the shader.  Additionally, the seismic events themselves are visualized through simple lines aligned to the normals of the sphere - with the length of the line determined by its Richter scale value.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R1YMng5J98I/AAAAAAAAACg/X9kiMhMKFcs/s1600-h/earth_visualize1.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R1YMng5J98I/AAAAAAAAACg/X9kiMhMKFcs/s400/earth_visualize1.jpg" alt="" id="BLOGGER_PHOTO_ID_5140309897674094530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Globe with event density visualization&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After wrapping up event density mapping, I wanted to start trying to visualize events as they occurred over time.  The visualization itself doesn't communicate time as much as it displays the erratic nature of seismic activity happening around the world over an extended period (currently, over seven days).   To create lines that seemingly wrap themselves around the curvature of the globe - I decided to write a small bezier curve generator which had end points at the 3D coordinates of selected events.  The distance of those events is calculated using the Euclidean distance formula of:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R1YQFg5J-AI/AAAAAAAAADA/X6Q7p_3VlQc/s1600-h/eulician_distance.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R1YQFg5J-AI/AAAAAAAAADA/X6Q7p_3VlQc/s200/eulician_distance.jpg" alt="" id="BLOGGER_PHOTO_ID_5140313711605053442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Where the distance value is used to apply weight (w) to midpoints in rational bezier curves, such that:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R1YQlw5J-BI/AAAAAAAAADI/_n2XHkyJ5ow/s1600-h/0d8fa1beb8c7c4e30be9fd199e993ffc.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R1YQlw5J-BI/AAAAAAAAADI/_n2XHkyJ5ow/s200/0d8fa1beb8c7c4e30be9fd199e993ffc.png" alt="" id="BLOGGER_PHOTO_ID_5140314265655834642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R1YNNQ5J99I/AAAAAAAAACo/IWU8_WQaw9M/s1600-h/earth_visualize2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R1YNNQ5J99I/AAAAAAAAACo/IWU8_WQaw9M/s400/earth_visualize2.jpg" alt="" id="BLOGGER_PHOTO_ID_5140310546214156242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Bezier curves mapped across globe based on time of occurrence&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-5960543696695896347?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/5960543696695896347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=5960543696695896347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5960543696695896347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5960543696695896347'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/12/shiver-development-event-density-time.html' title='Shiver Development: Event Density + Time Charting'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/R1YMng5J98I/AAAAAAAAACg/X9kiMhMKFcs/s72-c/earth_visualize1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-6799886423992477221</id><published>2007-11-28T01:22:00.000-05:00</published><updated>2007-11-28T01:52:06.839-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='shiver'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Shiver Development: Displacement</title><content type='html'>As I continue to polish the overall look of the globe - I decided to explore how to display the topology of the earth, which will become more important upon the incorporation of zooming in and out.  Another plus for having a working shader pipeline is the ability to write vertex shaders in a way which changes the geometry of the given shader is attached to - better known as displacement.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/R00KAwzpyjI/AAAAAAAAACQ/mUbVpCxU7wU/s1600-h/topology.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/R00KAwzpyjI/AAAAAAAAACQ/mUbVpCxU7wU/s400/topology.jpg" alt="" id="BLOGGER_PHOTO_ID_5137773758117431858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.1: Altitude map provided by the NASA Blue Marble project&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; Having an altitude map which precisely matches the texture maps I am already using is quite convenient - so there was no need to alter the image or the coordinate mappings in the my shaders.  The concept of displacing geometry per vertex is a rather simple one:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R00M2QzpykI/AAAAAAAAACY/2Ay3TeS2W0E/s1600-h/displacement_formula.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R00M2QzpykI/AAAAAAAAACY/2Ay3TeS2W0E/s400/displacement_formula.jpg" alt="" id="BLOGGER_PHOTO_ID_5137776876263688770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.2: Formula for displacement per vertex, where:&lt;br /&gt;&lt;br /&gt;P0 = original vertex position&lt;br /&gt;p1 = new vertex position&lt;br /&gt;N  = vertex normal position&lt;br /&gt;df = normalized displacement factor&lt;br /&gt;uf = user-defined scaling value&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R00J7AzpyiI/AAAAAAAAACI/M8JX4IuW6nU/s1600-h/displ_01.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R00J7AzpyiI/AAAAAAAAACI/M8JX4IuW6nU/s400/displ_01.jpg" alt="" id="BLOGGER_PHOTO_ID_5137773659333184034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.3:  Diagram of per vertex displacement (Image credit: &lt;a href="http://ozone3d.net/"&gt;oZone3d.net&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/R00J2AzpyhI/AAAAAAAAACA/6hLXpx_2kXY/s1600-h/displacement_example.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/R00J2AzpyhI/AAAAAAAAACA/6hLXpx_2kXY/s400/displacement_example.jpg" alt="" id="BLOGGER_PHOTO_ID_5137773573433838098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Fig 1.4: No displacement / displacement comparison in Shiver (wireframe)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;My next goal for Shiver is to implement a sunlight calculation system which will auto-generate a texture map accurately representing where how the sun is lighting the earth based on the time of day.  Additionally, I plan on (finally) starting the preliminary visualization of the actual seismic events being geomapped.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-6799886423992477221?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/6799886423992477221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=6799886423992477221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6799886423992477221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6799886423992477221'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/11/shiver-development-displacement.html' title='Shiver Development: Displacement'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/R00KAwzpyjI/AAAAAAAAACQ/mUbVpCxU7wU/s72-c/topology.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-5415768850130674225</id><published>2007-11-23T17:04:00.000-05:00</published><updated>2007-11-23T17:49:43.498-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='applications'/><title type='text'>Woven</title><content type='html'>I developed a small piece of software for a group presentation I had in Applications class that has to do with visualizing collaboration among 1st year students at ITP.   Someone during the Q+A asked if the software was open-source and if so, where could the source be downloaded?  The answers were "yes" and "soon, on my blog".  Unfortunately, I don't really have the time as it stands to package the software up nicely for download - so I am just going to post the raw source code for now, with the hope that I can package it later on...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R0dXqwzpygI/AAAAAAAAAB4/DTjEwEcVTmA/s1600-h/woven_blogentry.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R0dXqwzpygI/AAAAAAAAAB4/DTjEwEcVTmA/s400/woven_blogentry.jpg" alt="" id="BLOGGER_PHOTO_ID_5136170292207012354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Source:&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/misc/Woven/ProcessingMain.java"&gt;ProcessingMain.java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/misc/Woven/StudentDataParser.java"&gt;StudentDataParser.java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/misc/Woven/Student.java"&gt;Student.java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/misc/Woven/Button.java"&gt;Button.java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/misc/Woven/student_data.txt"&gt;student_data.txt&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-5415768850130674225?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/5415768850130674225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=5415768850130674225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5415768850130674225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5415768850130674225'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/11/woven.html' title='Woven'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rTWCmr2q_kw/R0dXqwzpygI/AAAAAAAAAB4/DTjEwEcVTmA/s72-c/woven_blogentry.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-6413345308019830903</id><published>2007-11-23T11:22:00.000-05:00</published><updated>2007-12-14T16:53:56.087-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='shiver'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Shiver Development: Event Mapping</title><content type='html'>A couple of new updates; one being that I have a new fog shader working on the globe - which adds to the effect of the atmospheric layering.  The ability to program shaders and apply them to geometry is really what separates imagery that is noticeably fake and that which is nearing photorealistic.  Real-time photorealism is the next big step in computer graphics - although you could make a very valid claim that photorealism hasn't been reached in pre-rendered form either.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/R0cD3AzpycI/AAAAAAAAABY/bbAlvvX9JSE/s1600-h/shader_comparison.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/R0cD3AzpycI/AAAAAAAAABY/bbAlvvX9JSE/s400/shader_comparison.jpg" alt="" id="BLOGGER_PHOTO_ID_5136078143683676610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Fig 1.1: Comparison between shader enhanced and non-shaded geometry&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The next update in progress is actually a rather large one - that being that I can now plot events on the earth sphere, needing only an event's latitude and longitude values.  This was actually a larger challenge than originally anticipated, as I didn't take into consideration polar coordinates in regard to texture mapping in OpenGL as it relates to sphere mapping.  I also ran into an issue pushing and popping the transformation matrix - but that turned out to be an instance of not having certain draw events happening between the correct combination of push/pop commands.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/R0cH5wzpydI/AAAAAAAAABg/DWRre-QBRaU/s1600-h/event_plotter.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/R0cH5wzpydI/AAAAAAAAABg/DWRre-QBRaU/s320/event_plotter.jpg" alt="" id="BLOGGER_PHOTO_ID_5136082588974827986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Fig 1.2: Seismic events mapped on globe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-6413345308019830903?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/6413345308019830903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=6413345308019830903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6413345308019830903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6413345308019830903'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/11/shiver-development-event-mapping.html' title='Shiver Development: Event Mapping'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_rTWCmr2q_kw/R0cD3AzpycI/AAAAAAAAABY/bbAlvvX9JSE/s72-c/shader_comparison.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-8740453370907713652</id><published>2007-11-11T21:43:00.000-05:00</published><updated>2007-11-26T19:57:14.617-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='shiver'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>Shiver Development: Shaders in PyOpenGL</title><content type='html'>After a turbulent weekend trying to get shaders working with PyOpenGL - I finally got my first vertex and fragment files compiled and working inside Shiver.  Without any documentation to bail me out of my usual jams with new code - I hacked away through the weekend until I stumbled upon a way of changing C-type function arguments, then converted variables into C-compliant data to be fed into the altered function in question.  In English:  I needed to convert data so it could be read and processed correctly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/RzfFw6t_FLI/AAAAAAAAAA4/r5KLB6DLGpU/s1600-h/earth_with_atmos_shader.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/RzfFw6t_FLI/AAAAAAAAAA4/r5KLB6DLGpU/s400/earth_with_atmos_shader.jpg" alt="" id="BLOGGER_PHOTO_ID_5131787744598496434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;Fig 1.1: Globe with atmospheric shader applied&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So - in the lab I am often asked: "why are shaders important"?  Shaders can provide surface appearance variance in regard to color, opacity, reflection, refraction, etc... even physical alterations to the geometry itself.  In relation to what I am attempting to achieve - it is vital to be able to replicate light and physical phenomena that exists when viewing the earth from space.&lt;br /&gt;&lt;br /&gt;My first goal was to get a representation of the atmospheric layer that wraps around the earth - a thin haze of a light blue hue.  The trick is - the haze should not rotate along with the earth as the camera moves around the globe.  To achieve this; a shader was created that calculates how light is hitting the surface at each given frame - then simply finds where the light drop-off occurs on the surface (the edges) and colors those areas a varying hue of blue based on how much light exists on a given fragment of the geometry.  Since I applied the shader on a sphere and the lighting is both hitting the sphere straight on and is static in all attributes over time - we can assume perfect symmetry in the light distribution across the sphere at any given time, which allows for the Lambertian Reflection calulation of:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/RzfMxqt_FOI/AAAAAAAAABQ/rgAoAWRSzw8/s1600-h/eqdifflight.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/RzfMxqt_FOI/AAAAAAAAABQ/rgAoAWRSzw8/s320/eqdifflight.gif" alt="" id="BLOGGER_PHOTO_ID_5131795454064792802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Where:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I&lt;span style="font-size:78%;"&gt;0&lt;/span&gt;&lt;/span&gt; = reflected intensity&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;L&lt;span style="font-size:78%;"&gt;d&lt;/span&gt;&lt;/span&gt; = light diffuse color,&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;M&lt;span style="font-size:78%;"&gt;d&lt;/span&gt;&lt;/span&gt; =  material diffuse coefficient&lt;br /&gt;&lt;br /&gt;Once we have the reflected intensity of each fragment, simple logic can be installed within the shader that only allows for color to be applied a certain areas of intensity - and, since we are dealing with a sphere with light shooting right at it (symmetrical light reflection!) - it becomes simple to create a halo light effect.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/RzfKyqt_FNI/AAAAAAAAABI/GaTsc7Pbn00/s1600-h/atmos_upclose.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/RzfKyqt_FNI/AAAAAAAAABI/GaTsc7Pbn00/s400/atmos_upclose.jpg" alt="" id="BLOGGER_PHOTO_ID_5131793272221406418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;Fig 1.2: Closer look of the glow-like effect of the atmospheric shader&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The next steps with using shaders are to create a fog shader for the globe, as well as the potential for a very subtle bump-map, as well as other effects as time permits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-8740453370907713652?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/8740453370907713652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=8740453370907713652' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8740453370907713652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8740453370907713652'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/11/shiver-development-shaders-in-pyopengl.html' title='Shiver Development: Shaders in PyOpenGL'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rTWCmr2q_kw/RzfFw6t_FLI/AAAAAAAAAA4/r5KLB6DLGpU/s72-c/earth_with_atmos_shader.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-6894457033733602219</id><published>2007-10-31T17:16:00.000-04:00</published><updated>2007-11-26T19:57:52.103-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='shiver'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Shiver - Final Proposal</title><content type='html'>A few posts back - I wrote about developing a seismic data visualizer for my ICM final.  This is still the case - however, the details involving the execution of the project are now very different.  The most notable change involves adding several physical components to the project, meaning; this project will now be both my ICM and my Physical Computing project for this semester.  Excited?  Splendid - now on to the details...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Technical&lt;/span&gt;&lt;br /&gt;On the ICM front - I made a decision a week ago that I would in fact use Python as my primary programming language opposed to my original choice of Java.  Why?  Well, as I mentioned in the past - Python is slow in regard to intensive computation in comparison to compiled languages such as C/C++ or Java.  However, where Python shines is in its fast development time - and through its flexibility to glue together various components effectively.  Without a doubt, hitting the visual high-bar I am aiming for in regard to the graphics in this project will put an enormous strain on Python - however, much of that strain can ideally be handled through C code, if necessary.  I will be using an OpenGL binding called pyOpenGL - which is a mature library with strong documentation, so I should have information/learning support when I need it.  For the GUI components, I will be using the wxPython toolkit  - which allows for native OS widget use, so the program will automatically reflect the standard appearance of whatever OS the program is being run on.  Very slick.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rTWCmr2q_kw/RzE6bqPrx2I/AAAAAAAAAAo/iHMDAjTFCLc/s1600-h/shiver_dev01.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_rTWCmr2q_kw/RzE6bqPrx2I/AAAAAAAAAAo/iHMDAjTFCLc/s320/shiver_dev01.jpg" alt="" id="BLOGGER_PHOTO_ID_5129945697422657378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Fig 1.1: Shiver in early development, click to enlarge.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Representation&lt;/span&gt;&lt;br /&gt;As for how the data will be represented, it will be done so on a 3D globe - much like applications such as Google Earth and NASA's World Wide Wind.  When the applications gathers seismic data activity from the USGS - each event will be mapped to the globe according to its latitude and longitude values.  Based on an event's Richter Scale value - the event will be visualized along the nearest normal to in correlation to its lat/long. mapping.  Events can be selected through an easily organized directory structure tree, or on the globe itself.  When selected - various attributes are displayed, as well as a simulation option - which leads us to the physical computing side of the project...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Physical&lt;br /&gt;&lt;/span&gt;After sitting down with fellow ITP'er Sunghun Kim, we decided that we would like to team up and pursue a physical representation of seismic data that can be partnered with software I am developing for my ICM final.  This idea will involve creating a 2D representation of the seismic events - dictated by the Richter scale value of each event.  This will ideally result in a mesh being created by rods pushing and pulling at a rubber-like surface.   Each rod will be driven of an average value of pixel color values dependent on the ratio between the rod count and the image resolution.  Once a 2D simulation is established, it will ideally branch out to a 3D grid - but that is likely for another semester.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-6894457033733602219?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/6894457033733602219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=6894457033733602219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6894457033733602219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/6894457033733602219'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/10/shiver-final-proposal.html' title='Shiver - Final Proposal'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_rTWCmr2q_kw/RzE6bqPrx2I/AAAAAAAAAAo/iHMDAjTFCLc/s72-c/shiver_dev01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-5425267000162161318</id><published>2007-10-25T01:39:00.000-04:00</published><updated>2007-10-25T01:42:36.408-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Elevator Previsualizer</title><content type='html'>This is a midterm project I worked on with a talented group of people in Physical Computing.  Follow the link for more:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/phys_comp/itp_elevator/itp_elevator.html"&gt;Elevator Previsualizer Main Site&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-5425267000162161318?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/5425267000162161318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=5425267000162161318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5425267000162161318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/5425267000162161318'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/10/elevator-previsualizer.html' title='Elevator Previsualizer'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-1229658839639340463</id><published>2007-10-17T16:22:00.000-04:00</published><updated>2007-10-17T16:32:46.540-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Phys. Comp Midterm: Implementation / User Observations</title><content type='html'>For our midterm in Phys. Comp - my group decided to take on the task of breaking up the boredom which happens when waiting for an elevator.  Petra, Sunghun, and myself set up what we had completed for the project this far the first time -- with mixed results.  It is clear that we have a lot of implementation issues to resolve before getting the type of user interaction data we need for the later stages of polishing usability. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_rTWCmr2q_kw/RxZvia5dKmI/AAAAAAAAAAM/fVVgKfQmkTo/s1600-h/photo.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_rTWCmr2q_kw/RxZvia5dKmI/AAAAAAAAAAM/fVVgKfQmkTo/s320/photo.jpg" alt="" id="BLOGGER_PHOTO_ID_5122404263307061858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;&lt;span style="font-style: italic;"&gt;Fig 1.1: Will (me) interacting with camera.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Implementation Issues/Observations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1.    The projector, if angled from the ceiling, will display a distorted shape due to the light being shot at an angle.&lt;br /&gt;&lt;br /&gt;2.    The image being shot through the projector does not immediately fit in the space of the door.  The video can be clipped, but the light (although black) still shows up.&lt;br /&gt;&lt;br /&gt;3.    Even if the projector is raised up on the ceiling; the light from the projector will be blocked by people standing directly in front of the door.&lt;br /&gt;&lt;br /&gt;4.    There is no (reasonable) way of preventing significant light pollution at any given time because we are unable to strictly control the pubic environment, and we are bound by the collective lumen value the given projector can output.&lt;br /&gt;&lt;br /&gt;5.    We do not yet have a good solution for binding the light-blocking module to the projector – although this likely has a simple solution.&lt;br /&gt;&lt;br /&gt;6.    Due to the central and elevated nature of both the camera and the projector, light/motion recursion through the camera is very likely to occur unless steps are taken to filter an area – which has its consequences that will result in trade-offs likely too severe to compromise over.&lt;br /&gt;&lt;br /&gt;7.    The location of the crank has to be outside the field of the camera and projector.  It is possible to have the crank located right in the middle, within the camera range but not obstructing the projector light - but this will mean that the user of the crank will be the focus of the image, which may create static results.&lt;br /&gt;&lt;br /&gt;8.    Due to the environment we are contained in, the projector will have to be turned sideways to establish the amount of vertical space needed to cover the door.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;User Issues/Observations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1.    Users are drawn to the computer if it is out in the open.  They seem to glance at the projected image, then want to look “behind the curtain” at the computer screen.  The computer should be hidden from view.&lt;br /&gt;&lt;br /&gt;2.    Users seem to want to view the projected image by being in front of it, just as people watch television.&lt;br /&gt;&lt;br /&gt;3.    People stepping out of the elevator (or stepping in) do not particularly enjoy being blasted in the face by the projector light. (this issue has been solved, however).&lt;br /&gt;&lt;br /&gt;4.    The moment seems fleeting when people interact, people interact and a result is presented, then instantly replaced by a new result.  This does promote a sense of real-time, but doesn’t reward&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rTWCmr2q_kw/RxZvnq5dKnI/AAAAAAAAAAU/xYvuojrQWaA/s1600-h/photo2.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_rTWCmr2q_kw/RxZvnq5dKnI/AAAAAAAAAAU/xYvuojrQWaA/s320/photo2.jpg" alt="" id="BLOGGER_PHOTO_ID_5122404353501375090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic; font-family: arial;"&gt;Fig 1.2: Software cutting out background, leaving only the person displayed.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rTWCmr2q_kw/RxZvtK5dKoI/AAAAAAAAAAc/rJAeJdc3jis/s1600-h/photo3.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_rTWCmr2q_kw/RxZvtK5dKoI/AAAAAAAAAAc/rJAeJdc3jis/s320/photo3.jpg" alt="" id="BLOGGER_PHOTO_ID_5122404447990655618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;&lt;span style="font-style: italic;"&gt;Fig 1.3: Petra using a crank which drives the projected image up and down.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-1229658839639340463?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/1229658839639340463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=1229658839639340463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1229658839639340463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1229658839639340463'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/10/phys-comp-midterm-implementation-user.html' title='Phys. Comp Midterm: Implementation / User Observations'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_rTWCmr2q_kw/RxZvia5dKmI/AAAAAAAAAAM/fVVgKfQmkTo/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-1030995122386625377</id><published>2007-10-12T13:23:00.000-04:00</published><updated>2007-10-12T14:10:17.289-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>ICM Final Project Proposal: Global Data Visualizer</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Proposal:&lt;/span&gt;&lt;br /&gt;When developing software, I feel it is important to develop around a system that is flexible, yet powerful when focus is needed on a particular task.  Many times, a generic solution to a problem requiring precision results in software that has the ability to handle many tasks, yet does so in a mediocre way.  Software should be quiet in interface, elegant in result - and predictable in terms of being intuitive to use. &lt;br /&gt;&lt;br /&gt;My commentary on this aspect of software leads me to my proposal -- that being; I want to develop a system which can visualize various types of data as it pertains to our planet, and I'd like to do so in a way which promotes ease of use and flexibility in how it handles different data.   Ideally, the data will be presented in a way that will be understood, yet a good deal more 'artsy' than most data visualizers I have seen.  Whether 'artsy' means abstraction or simply a clean/slick way of visualizing the data I cannot really say, I very rarely ever know what I will create on the art-side until I am up to my neck in code architecture.  That isn't to say that the art is an after-thought, because the fact negating such an idea lies in much of my past code, where I practically destroy my nicely planned out system for the sake of making the output look 'cool'.  Of course, I'd prefer to maintain both... but the engineer inside me brings a knife to a gunfight if I have to choose only one due to time restraints.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Technical:&lt;/span&gt;&lt;br /&gt;Initially, my task will be to visualize seismic activity happening around the world.  This will ideally expand to harbor other data as time permits. I have actually already done this to an extent - but I'd like to have the events be projected on a 3D globe with correct coordinates an so forth.  I have made the decision that I will be using OpenGL through Java for this project.  I toyed with the idea of using C++ or Python in combination with OpenGL - but C++ coding is still a very slow process for me and Python simply isn't going to provide the optimal speed I need (which is too bad, coding in Python is really enjoyable).    I was planning on using JOGL - but the ever helpful &lt;a href="http://www.shiffman.net"&gt;Daniel Shiffman&lt;/a&gt; pointed me in the direction of LWJGL (Lightweight Java Game Library) which looks really promising, so I will be venturing in that direction. &lt;br /&gt;&lt;br /&gt;Here are a few links that are helping me think things through on this project:&lt;br /&gt;&lt;a href="http://lwjgl.org/"&gt;Lightweight Java Game Library&lt;/a&gt;&lt;br /&gt;&lt;a href="http://earthobservatory.nasa.gov/Newsroom/BlueMarble/"&gt;NASA Blue Marble&lt;/a&gt;&lt;br /&gt;&lt;a href="http://earthquake.usgs.gov/eqcenter/catalogs/"&gt;USGS.gov&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-1030995122386625377?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/1030995122386625377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=1030995122386625377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1030995122386625377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/1030995122386625377'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/10/icm-final-project-proposal-global-data.html' title='ICM Final Project Proposal: Global Data Visualizer'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-7410487680091274046</id><published>2007-10-09T21:44:00.000-04:00</published><updated>2007-10-09T22:48:18.796-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Elevator Project: Motion Tracking</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;For my group project in Physical Computing, we have decided to address the issue of people waiting outside of elevators and the boredom that inevitably occurs during the wait.  Petra, Sunghun, and myself all agreed that a good way to break the static nature of waiting is to allow people to interact with something that has immediate output in correlation with their movements.  This allows those waiting to interact quickly with limited effort, thus making the amount of time one actually has to wait for the elevator to arrive non-consequential, which matters a great deal since upon arrival, the elevator could be very close to arriving, or not at all.&lt;br /&gt;&lt;br /&gt;My part in the project has been developing the software - using Java/Processing for the graphics and motion tracking system, as well as C coding for the Arduino microprocessor we are using.   The motion tracking system does a combination of background subtraction and motion detection, which basically filters out all imagery which not both moving and not within a certain brightness range.  The pixels that meet these prerequisites have their coordinates tracked and drawn on using a combination of small rectangles of lines being drawn between each tracked pixel in sequential order, which results in an abstraction of imagery that is vastly different from real-life, yet familiar enough to be predictably interacted with, at least in the regard towards positioning oneself towards making an intended impact on a defined space.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/icm/assignment5/face.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/icm/assignment5/face.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Fig 1.1: Although heavily abstracted, a face emerges through motion.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/icm/assignment5/flood.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/icm/assignment5/flood.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Fig 1.2: Rapid motion completely destroys all recognizable form, as intended.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/icm/assignment5/hand.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/icm/assignment5/hand.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Fig 1.3: Slight motion will in turn bring about only slight abstraction, to&lt;br /&gt;the point of nearing a keyed cutout of the form.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Processing:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/icm/assignment5/ProcessingMain.txt"&gt;ProcessingMain&lt;br /&gt;&lt;/a&gt;&lt;a href="http://kpwproductions.com/research/icm/assignment5/MotionCapture.txt"&gt;MotionCapture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Arduino:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/icm/assignment5/cb_software.txt"&gt;cb_software&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-7410487680091274046?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/7410487680091274046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=7410487680091274046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/7410487680091274046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/7410487680091274046'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/10/elevator-project-motion-tracking.html' title='Elevator Project: Motion Tracking'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-4077864687399027491</id><published>2007-09-26T01:26:00.000-04:00</published><updated>2007-09-26T02:02:29.735-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Shiver - Early Development</title><content type='html'>I have decided to go ahead and start dedicating a good amount of time toward one of the two major projects I hope to accomplish this semester at ITP.  The project name is tentatively called "Shiver" and it involves parsing seismic event data and using that content as a way of provoking both visual and physical simulations.  Right now, I am concentrating on the visual side - as it is a nice starting place to begin prototyping the "how" as it relates to progress I will need to make later in development.   However, one of the major tasks I wanted to immediately address was the ability to interface hardware I create with the software I am programming.   I was able to get an analog signal to influence variables inside Processing using its serial library - with the pictures and code below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/week3/serial_test.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/week3/serial_test.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;Fig 1.1: Simple circuit hooked up to a Arduino and variable resister&lt;br /&gt;to test analog/serial communication.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/icm/assignment3/shiver_prototype_webimg.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/icm/assignment3/shiver_prototype_webimg.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;Fig 1.2: Still image of Shiver at current development point&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Link:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/icm/assignment3/shiver_proto.html"&gt;Main Demonstration Page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Processing - Source code:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/icm/assignment3/parse_blocks.txt"&gt;parse_blocks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/icm/assignment3/xml_parser.txt"&gt;xml_parser&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Arduino - Source code:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/phys_comp/week3/serial_communication.txt"&gt;serial_communication&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-4077864687399027491?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/4077864687399027491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=4077864687399027491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/4077864687399027491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/4077864687399027491'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/shiver-early-development.html' title='Shiver - Early Development'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-7107034523820161307</id><published>2007-09-22T01:04:00.000-04:00</published><updated>2007-09-22T02:07:49.709-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Motion Tracking Glove Prototype</title><content type='html'>In my first attempt in pairing concepts from my Physical Computing and Computational Media classes - I decided that I would like to try my hand (pun fully intended) at developing a type of glove-based motion tracking system.  Since I have a larger project in mind for Computational Media which involves tracking movement through a camera - this was a perfect opportunity to start roughing out a few of the pixel tracking / blob detection algorithms that would be easily reusable when I move on to developing the larger project.  So, after an afternoon of traversing through pixels, I had the color tracker working on high densities of near-pure red:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/motion_glove/tracked_pixels_web.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/motion_glove/tracked_pixels_web.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.1: Ellipse following over pixels being tracked&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, with the tracking algorithms working well enough to run some practical tests - it was then time to move into the physical computing side of my endeavor.  The wiring was a rather simple affair, as I really only intended to have two LEDs, one which was to be consistently on and the other to require a button press to light up.  After a successful test with my Arduino code - I cut up some cardboard and wrapped two pieces of equal length in eletrical tape, then sandwiched my board into an enclosure, as seen below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/motion_glove/encasing_web.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/motion_glove/encasing_web.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;Fig 1.2:  An ugly yet effective circuit board enclosure&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/motion_glove/wiring_web.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/motion_glove/wiring_web.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.3: The enclosure opened - revealing the breadboard and&lt;br /&gt;microprocessor.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I had bought some gloves from K-Mart that were of the variety where if you flip down a flap the gloves could become mittens.   The flap turned out the be the (near) perfect holder for my enclosure.  The fit isn't exact - but just fine for the prototypical nature of this project.  A few holes through fabric and some snaking of the wire through the palm and fingers of the glove and it was ready for action.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/motion_glove/glove_web.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/motion_glove/glove_web.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.4: Motion tracking glove - ready for your local fashion show.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/motion_glove/wearing_glove_web.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/motion_glove/wearing_glove_web.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.5:  Glove plugged into a USB port and working&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After putting on the glove and using it in combination with the Processing program I wrote, the test results indicate that better lit rooms gives the color tracking algorithms a bit too many high values than it can currently handle - which results in flickering of the tracking point.   However, in moderate to low lit rooms - the glove works rather well.   Below is the screen shot of the glove in action with the Processing program:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/motion_glove/in_action_web.jpg"&gt;&lt;img style="cursor: pointer; width: 466px; height: 154px;" src="http://kpwproductions.com/research/phys_comp/images/motion_glove/in_action_web.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.6: Motion/Color tracking algorithms paired with Processing graphics, pointer&lt;br /&gt;being directed by glove use.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Processing - Source code:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/phys_comp/motion_glove/motion_tracker.txt"&gt;motion_tracker&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/phys_comp/motion_glove/blinds.txt"&gt;blinds&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/phys_comp/motion_glove/gui_components.txt"&gt;gui_components&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Arduino - Source code:&lt;br /&gt;&lt;a href="http://kpwproductions.com/research/phys_comp/motion_glove/motion_glove.txt"&gt;motion_glove&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-7107034523820161307?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/7107034523820161307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=7107034523820161307' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/7107034523820161307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/7107034523820161307'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/motion-tracking-glove-prototype.html' title='Motion Tracking Glove Prototype'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-2952123043847366058</id><published>2007-09-22T00:17:00.000-04:00</published><updated>2007-09-22T01:03:51.503-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Physical Computer - Lab #2</title><content type='html'>&lt;span style="font-size:100%;"&gt;Moving forward in the adventures of the electrical nature - it was already time to dive into the programming side of physical computing.   Lab #2 consisted of wiring up a simple circuit with a switch and a couple of LEDs and being able to program a Arduino board to process simple logic through authored code.   After working through the previous lab - I found the circuit-boarding side of this lab to be far easier, even with the addition of the Arduino microprocessor, which as the time was completely foreign to me.   Below are a couple of pictures of the process, plus a link to the source code for my first Arduino program.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/week2/wiring1.jpg"&gt;&lt;img style="cursor: pointer; width: 270px; height: 397px;" src="http://kpwproductions.com/research/phys_comp/images/week2/wiring1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span style="font-family: arial;"&gt;Fig 1.1: First success using Arduino&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/week2/wiring2.jpg"&gt;&lt;img style="cursor: pointer; width: 270px; height: 360px;" src="http://kpwproductions.com/research/phys_comp/images/week2/wiring2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span style="font-family: arial;"&gt;Fig 1.2: Using a simple switch logic gate&lt;/span&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/week2/wiring3.jpg"&gt;&lt;img style="cursor: pointer; width: 270px; height: 358px;" src="http://kpwproductions.com/research/phys_comp/images/week2/wiring3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span style="font-family: arial;"&gt;Fig 1.3: Six LEDs blinking one after another&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;&lt;a href="http://kpwproductions.com/research/phys_comp/week2/six_led_lights.txt"&gt;Source Code: &lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;&lt;a href="http://kpwproductions.com/research/phys_comp/week2/six_led_lights.txt"&gt;six_led_lights&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: georgia;font-size:100%;" &gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; I have noticed that one of the (many) limitations of the programming language initially available to use with the Ardunio microprocessor is the inability to directly get the size of an array through a method or any sort of standalone function.  This becomes problematic when needing to accurately loop through an array of LED pins, or anything else stored in an array for that matter.  A way around this limitation without resorting to counting the elements manually and hard-coding that number to a variable is to instead use the following code, as additionally outlined in my source code.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: georgia;font-size:100%;" &gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;int led_pins[] = {3,4,5,6,7,8};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;int led_pin_count = sizeof(led_pins) / 2;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: georgia;font-size:100%;" &gt;&lt;br /&gt;The global function 'sizeof' returns a value which represents the number of bytes currently stored in a given variable.  Since we can assume that an integer is 2 bytes; dividing the value sizeof returns by 2 will result in the elemental size of our array. &lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;&lt;span style="font-family: arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-2952123043847366058?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/2952123043847366058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=2952123043847366058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2952123043847366058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2952123043847366058'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/physical-computer-lab-2.html' title='Physical Computer - Lab #2'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-8897685950865231872</id><published>2007-09-19T22:11:00.000-04:00</published><updated>2007-09-22T00:17:12.104-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Physical Interface: Cash Register</title><content type='html'>In all likelihood - I have walked more in these past couple of weeks than I had in any given week during my time as an undergrad.   I am fortunate enough to live within walking distance (roughly 1.8 miles) to the Interactive Telecommunications Department where I am undertaking my graduate research at NYU.  More often than not - I drop into a local deli on my way to ITP to grab a vitamin water or perhaps one of those energy bars of varying brand.  Upon selecting what is likely going to turn out to be lunch - I walk over to the cashier to pay my usual $4.00 in cash, a much more 'pleasant' affair now after being glared at several times for sticking out a credit card.  Besides the usual stiff attitude of the deli cashiers, I have always been taken by the speed of which the cashiers operate.   Usually, the cash register itself is of the older variety - a 'do it yourself' style machine where numbers of prices are punched in rather than scanned.  What is most interesting is that in my experience, the old-style cash registers are substantially faster and the users seem far less likely to have a "someone get the manager over here" type moment compared to a scan-based register with touch screens.  So, is this an instance of technology getting in the way rather than helping?  Here is my completely research-free and high-level look:&lt;br /&gt;&lt;br /&gt;First, there needs to be an acceptance to the fact that technology isn't always built for speed.  Be it for all the right or wrong reasons - technology many times can substitute what was traditionally a simple and fast process with more functionality; resulting in a steeper learning curve for the end-user(s).   I have chosen cash registers as an example for a user-interface to analyze because its advancement in features are an interesting mix of positives and negatives, as well as a device that has taken on a new relationship with its users.  The cash register has 'evolved' from a interface requiring one employee to use the device, to needing an employee &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; a customer to interact with, to most recently - only needing a customer to interact with, now coming full-circle.  I won't focus on the third advancement, but I want to write a quick comparison of the first two user-interfaces - the singular and dual user interface cash registers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kepos.co.uk/images/samsung/ER380LG.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://www.kepos.co.uk/images/samsung/ER380LG.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.1: Older model cash register: simple and fast&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;(Stoic NYC cashier attendant not pictured)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In my example of the dual-user register - I recently went to a Best Buy in lower Manhattan to buy a DVD (The Office: Season 3... a must have) and approached the cashier in front of a rather new looking cash register system, complete with a customer input pad and stylus pen for a signature.  In the end, this transaction took several times longer than an average transaction at the deli - with the very same amount of items using the exact same type of payment: a credit card (to the chagrin of the deli cashier).  Generally with technology, if a user is being asked to allocate more time, then the end result is expected to be enhanced to return.  My end result as a customer yielded no instant enhancements - I still received a receipt, my item, and a debit from my banking account in both transactions.   As a user-interface, the technologically enabled cash register at Best Buy required effort on my part by signing with the stylus (awkwardly, as always) and paying attention to which buttons to press to proceed.   The cashier seemingly did less work in relation to number of button-presses and analysis than that of the deli cashier - but the overall workload wasn't necessarily shortened, only abstracted across multiple users (such as myself) and varying interfaces.  Sure, there are a few hidden benefits of the high-end register such as receipt caching for faster returns and cash back options using a debit card - but what is the ratio between transactions and the collective number of returns and debit card cash back requested on a given day?   I'd say it is very likely a substantially lopsided ratio leaning toward the quantity of transactions - yet the technological advances cater to the lower frequency of occurrences in the case of the cash register.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.imagetechsys.com/it_images/ePad-small.gif"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://www.imagetechsys.com/it_images/ePad-small.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Fig 1.2: "Sign here and press button to continue, now &lt;br /&gt;press this combination of buttons to confirm...hey,&lt;br /&gt;pay attention or this transaction isn't happening."&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;My concluding thought is that you could make the case that technology advancement for the cash register earns its keep because it lessens the work load of the cashier - but then again, the cashier is getting paid to work less at the expense of my time, so as a customer I wouldn't exactly call that a positive step unless I was on the other side of the register.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-8897685950865231872?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/8897685950865231872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=8897685950865231872' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8897685950865231872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8897685950865231872'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/physical-interface-cash-register.html' title='Physical Interface: Cash Register'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-4350053615258340423</id><published>2007-09-17T23:19:00.001-04:00</published><updated>2007-09-17T23:37:23.111-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>ICM - Assignment 2: Mouse Tracker</title><content type='html'>This is just a quick demonstration of how shapes can change states based on mouse interaction - and continue animation after the interaction has taken place.   This example (which I cannot embed in this blog because of its large size) is just the simplistic animation mouse tracking part of a larger project I am undertaking which involves using a connected camera to track movements of a certain color, then using that concentration of color as a pointer.  More on this project later...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kpwproductions.com/research/icm/assignment2_movement/mouse_tracker.html"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://www.kpwproductions.com/research/icm/assignment2_movement/mouse_track_img.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kpwproductions.com/research/icm/assignment2_movement/mouse_tracker.html"&gt;Mouse Tracker using Processing / Java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-4350053615258340423?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/4350053615258340423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=4350053615258340423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/4350053615258340423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/4350053615258340423'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/icm-assignment-2-mouse-tracker_17.html' title='ICM - Assignment 2: Mouse Tracker'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-8889967603393718018</id><published>2007-09-11T22:41:00.000-04:00</published><updated>2007-09-11T23:59:20.235-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><category scheme='http://www.blogger.com/atom/ns#' term='phys-comp'/><title type='text'>Physical Computing - Lab #1</title><content type='html'>So, this is lab was my first venture into the depths of physical computing. I feel that overall, things went rather smoothly - escaping without any serious injuries or damage to private property.  For my efforts - I was able to make multiple LEDs of various colors light up, as well as garnering the ability to fade them in and out and using a switch to turn them on and off. Perhaps not too exciting to read about - but certainly exciting to accomplish on my end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/phys_comp_assign01_03.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 427px;" src="http://kpwproductions.com/research/phys_comp/images/phys_comp_assign01_03.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;My first circuit.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/phys_comp_assign01_02.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/phys_comp_assign01_02.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Switch Activated LED&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kpwproductions.com/research/phys_comp/images/phys_comp_assign01_01.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://kpwproductions.com/research/phys_comp/images/phys_comp_assign01_01.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Fading LED using a potentiometer.&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;This lab served as a great introduction to some of the really core basics/principles of electrical engineering.  I am looking forward to start programming microprocessors - especially when it comes pairing code logic with sensors.   More to come.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-8889967603393718018?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/8889967603393718018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=8889967603393718018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8889967603393718018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/8889967603393718018'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/physical-computing-lab-1.html' title='Physical Computing - Lab #1'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4340703130925509479.post-2465544090954201395</id><published>2007-09-07T14:36:00.001-04:00</published><updated>2007-09-07T15:32:04.345-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icm'/><category scheme='http://www.blogger.com/atom/ns#' term='itp'/><title type='text'>ICM - Assignment 1: Circle Creator</title><content type='html'>&lt;div id="content"&gt;I wrote up a little applet in Processing which simply creates circles of varying sizes at pseudo-random  coordinates within a bounding box. &lt;br /&gt;&lt;br /&gt;For this assignment, I wanted to use the time I had to write up a couple of class objects I knew that I could reuse later on in this class (and just in general) - in particular a general use button and a border frame.  Clicking the button signals a callback of sorts to the main circle drawing function - pretty straight forward, although not being able to pass a function as an argument to another function makes it less flexible currently than I'd like.&lt;br /&gt;&lt;div id="circle_creator_container"&gt;&lt;!--[if !IE]&gt; --&gt;&lt;br /&gt;&lt;object classid="java:circle_creator.class" type="application/x-java-applet" archive="http://kpwproductions.com/research/icm/assignment1_circle_creator/circle_creator.jar" standby="Loading Processing software..." height="300" width="300"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="archive" value="http://kpwproductions.com/research/icm/assignment1_circle_creator/circle_creator.jar"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="mayscript" value="true"&gt;&lt;br /&gt;&lt;param name="scriptable" value="true"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="image" value="http://kpwproductions.com/research/icm/assignment1_circle_creator/loading.gif"&gt;&lt;br /&gt;&lt;param name="boxmessage" value="Loading Processing software..."&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="boxbgcolor" value="#FFFFFF"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="test_string" value="outer"&gt;&lt;br /&gt;&lt;!--&lt;![endif]--&gt;&lt;br /&gt;&lt;br /&gt;&lt;object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="http://java.sun.com/update/1.4.2/jinstall-1_4_2_12-windows-i586.cab" standby="Loading Processing software..." height="300" width="300"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="code" value="circle_creator"&gt;&lt;br /&gt;&lt;param name="archive" value="http://kpwproductions.com/research/icm/assignment1_circle_creator/circle_creator.jar"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="mayscript" value="true"&gt;&lt;br /&gt;&lt;param name="scriptable" value="true"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="image" value="http://kpwproductions.com/research/icm/assignment1_circle_creator/loading.gif"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="boxmessage" value="Loading Processing software..."&gt;&lt;br /&gt;&lt;param name="boxbgcolor" value="#FFFFFF"&gt;&lt;br /&gt;&lt;br /&gt;&lt;param name="test_string" value="inner"&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;This browser does not have a Java Plug-in.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/products/plugin/downloads/index.html" title="Download Java Plug-in"&gt;&lt;br /&gt;Get the latest Java Plug-in here.&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/object&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;u&gt;&lt;strong&gt;Handle Events:&lt;/strong&gt;&lt;/u&gt;&lt;br /&gt;Mouse click (within viewport box): erase viewport&lt;br /&gt;Key 'r': Red scale&lt;br /&gt;Key 'g': Green scale&lt;br /&gt;Key 'b': Blue scale&lt;p&gt;   Source code: &lt;a href="http://kpwproductions.com/research/icm/assignment1_circle_creator/circle_creator.txt"&gt;circle_creator&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   Built with &lt;a href="http://processing.org/" title="Processing.org"&gt;Processing&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4340703130925509479-2465544090954201395?l=will-at-itp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://will-at-itp.blogspot.com/feeds/2465544090954201395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4340703130925509479&amp;postID=2465544090954201395' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2465544090954201395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4340703130925509479/posts/default/2465544090954201395'/><link rel='alternate' type='text/html' href='http://will-at-itp.blogspot.com/2007/09/testing.html' title='ICM - Assignment 1: Circle Creator'/><author><name>William McDonald</name><uri>http://www.blogger.com/profile/04361435242802606872</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_rTWCmr2q_kw/TS-LoAP0bAI/AAAAAAAAAP8/pOf4HmKSxgA/S220/2d60569.jpg'/></author><thr:total>2</thr:total></entry></feed>
