<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Max The Rocket</title>
	<atom:link href="http://www.maxtherocket.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.maxtherocket.com/blog</link>
	<description>The blog of Max Rusan</description>
	<lastBuildDate>Thu, 17 Nov 2011 14:47:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>OpenGL Research</title>
		<link>http://www.maxtherocket.com/blog/opengl-research/</link>
		<comments>http://www.maxtherocket.com/blog/opengl-research/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 13:12:33 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[School]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[WebGL]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=204</guid>
		<description><![CDATA[What is OpenGL OpenGL is a low-level, 3D graphics and modeling library that is highly portable and very fast. It is used for rendering real-time 3D and 2D graphics such as games, music visualizations, screen savers and data visualizations on many platforms and systems like Windows, MacOS, Linux as well as mobile devices and gaming [...]]]></description>
			<content:encoded><![CDATA[<p><strong>What is OpenGL</strong></p>
<p><img src="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/1560385158_835d035db8-e1321536435694.jpg" alt="" title="1560385158_835d035db8" width="500" height="230" class="alignnone size-full wp-image-297" /></p>
<p>OpenGL is a low-level, 3D graphics and modeling library that is highly portable and very fast. It is used for rendering real-time 3D and 2D graphics such as games, music visualizations, screen savers and data visualizations on many platforms and systems like Windows, MacOS, Linux as well as mobile devices and gaming consoles. Essentially, OpenGL is an API that allows software programs to send drawing functions directly to the GPU (Graphics Processing Unit), located on a computer&#8217;s graphic card. Since graphic cards are designed and optimized for handling graphics, all the drawing and 3D rendering calculations are processed much faster on the GPU than on the computer&#8217;s CPU. OpenGL is an open standard API, developed and maintained by non-for-profit Khronos Group, which means that any graphic card manufacturer, such as Nvidea and ATI, are able to implement OpenGL in their hardware without any charges or royalties.</p>
<div class="clear"></div>
<p><strong>What OpenGL is NOT</strong></p>
<ul>
<li>OpenGL is not a programming language</li>
<li>It is not a game engine</li>
<li>It is not a framework like Processing, OpenFrameworks (although these frameworks do use OpenGL)</li>
<li>It is not able to create operating system windows or user interface objects</li>
<li>It cannot read and write files</li>
</ul>
<p>Without a programming language, OpenGL is useless. OpenGL requires a programming language to give it a window (called a context) to draw in, to allow user interaction, to create animations and provide it with data like 3D objects, textures and colours.</p>
<p>Virtually any programming language can execute OpenGL functions (C++, Java, Python, C# just to name a few), and it doesn&#8217;t matter which language is used, OpenGL will render the graphics the same way.</p>
<p>OpenGL is a procedural graphics API as opposed to descriptive. Instead of describing the 3D scene and how it should appear, the program needs to call OpenGL functions in a specific sequence in order to achieve a certain effect. These functions are used to draw graphics primitives such as points, lines, and triangles in a three-dimensional space. OpenGL also supports texture mapping, blending, transparency, animation, and many other special effects and capabilities.</p>
<p><strong>My Research Approach</strong></p>
<p>With the help of various tutorials and books, a list of which I provided in the end of the article, I created a web application that showcases some capabilities of OpenGL. I utilized a new technology called WebGL, which allows to execute OpenGL calls using Javascript withing a web browser. Keep in mind that WebGL is currently only available on the latest version of <strong>Google Chrome</strong> and <strong>Firefox </strong>(Safari and Opera should support it as well, although I haven&#8217;t tested it). Since the entire application is written in Javascript, and some HTML, the source code is available for anyone to view.</p>
<p>You may view the full application here: <a href="http://maxtherocket.com/projects/experimental/webgl/" target="_blank">http://maxtherocket.com/projects/experimental/webgl/</a><br />
Click left and right arrows to move through different scenes.</p>
<p><strong>Process</strong></p>
<p>I will outline the process of creating my application, but I will not go into too much technical detail. The description will cover the steps I had to take in order to render various 2D and 3D graphics, using OpenGL function calls. I will also display parts of the code that I used, if you are interested, full source code is available if you view the source on the page of my application.</p>
<h3>Step 1 [Creating an OpenGL window]</h3>
<p>WebGL lets you create an OpenGL window, it is actually called a context, inside an HTML5 element called <strong>CANVAS</strong>. Here&#8217;s the Javascript code that creates an OpenGl context, it executes as soon as the page loads:</p>
<pre class="brush: jscript; title: ; notranslate">
canvas = document.getElementById(&quot;glcanvas&quot;);
initWebGL(canvas);      // Initialize the GL context
// Here's the initWebGL() function
function initWebGL() {
  gl = null;

  try {
    gl = canvas.getContext(&quot;experimental-webgl&quot;);
  }
  catch(e) {
  }

  // If we don't have a GL context, alert the user
  if (!gl) {
    alert(&quot;Unable to initialize WebGL. Your browser may not support it.&quot;);
  }
}
</pre>
<p>After the <strong>gl</strong> object has been initialized, it will contain all the OpenGL functions.</p>
<p>And HTML code for the <strong>canvas element</strong>, which sets up the dimensions of the OpenGL window:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;canvas id=&quot;glcanvas&quot; width=&quot;640&quot; height=&quot;480&quot;&gt;&lt;/canvas&gt;
</pre>
<p>In a language like C++ creating the window for OpenGL would be different since you would have to create an operating system window.</p>
<h3>Step 2 [Set a couple settings]</h3>
<p>We need to tell OpenGL how to render the geometry that we&#8217;ll be creating in the 3D scene.</p>
<pre class="brush: jscript; title: ; notranslate">
gl.enable(gl.DEPTH_TEST); // Enable depth testing, so 3D objects don't overlap each other
gl.depthFunc(gl.LEQUAL);  // Near things will obscure far things, this can be set the other way around, which would be weird
</pre>
<h3 style="color: #ff6600;">Step 3 [Setup Shaders] (This one is important!)</h3>
<p>Shaders in OpenGL play a very important role. Shader code tells the hardware, the GPU, how to render 3D shaped in perspective and how to colour them. Without shaders, OpenGL cannot render anything. Shaders are written in a language very similar to C, called GLSL (GL Shading Language). Shaders come in 2 parts, a <strong>vertex</strong> shader and a <strong>fragment</strong> shader.</p>
<ul>
<li>The <strong>vertex</strong> shader manipulates each 3D point that we load into the OpenGL scene</li>
<li>The <strong>fragment</strong> shader is responsible for colouring the objects and it manipulates each pixel of an object</li>
</ul>
<p>Here&#8217;s is the source code for the basic shaders that I used in my application:</p>
<p><strong>Vertex Shader</strong></p>
<pre class="brush: cpp; title: ; notranslate">
// This is the Vertex shader
// This little program loops through each 3D point (a vertex) that the OpenGL has in the scene
attribute vec3 aVertexPosition; // This variable contains a single 3D point, each point gets passed into this variable as the program loops through vertices

uniform mat4 uMVMatrix; // A translation matrix, used for moving/rotating shapes in 3D space
uniform mat4 uPMatrix; // Perspective matrix, creates the 3D look, pretty much a camera

void main(void) {
   gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); // This is where the point gets translated from 3D space to 2D space
   vColor = aVertexColor; // Here we're just passing the color of a vertex along to the fragment shader
	// there's no need to have this last line if we don't use the colours from vertices
}
</pre>
<p><strong>Fragment Shader (Pixel Shader)</strong></p>
<pre class="brush: cpp; title: ; notranslate">
// This is the fragment shader
  void main(void) {
   // gl_FragColor is an OpenGL variable, it will draw the color that we pass it
   // with the variable set to vec4(1.0, 1.0, 1.0, 1.0) OpenGL will color all objects plain white
   // vec4 is a data type, vec4 stands for: vector with 4 values
   // each of the values represent a color vec4(red, green, blue, opacity)
   // By setting all the values to 1, we get white
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
  }
</pre>
<p>Shaders are very powerful, since they loop through every 3D point and every pixel for each frame of rendering (and it&#8217;s all done really fast). The colour of each pixel can be changed based on its relation to other pixels, 3D points and lights in the scene. 3D points can be modified as well through a vertex shader as well.</p>
<p>This is how I initialized the shaders in WebGL:</p>
<pre class="brush: jscript; title: ; notranslate">
// Create a place for a shader in OpenGL memory
shader = gl.createShader(gl.FRAGMENT_SHADER);
// Load the shader source code
gl.shaderSource(shader, theSource);
// Compile the shader
gl.compileShader(shader);
</pre>
<h3>Step 4 [Adding Geometry]</h3>
<p>Since the code for geometry gets fairly lengthy, I will only explain here the steps required to create a square shape in OpenGL.</p>
<p>In OpenGL, all geometry is created with points. There is a way to tell OpenGL how to connect and fill the points that you create. OpenGL offers 10 different drawing modes, each will render the points differently. Here&#8217;s a good graphic that showcases all the modes:</p>
<p><a href="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/primitives_new-640x269.png" rel="shadowbox"><img class="aligncenter size-full wp-image-261" title="primitives_new-640x269" src="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/primitives_new-640x269.png" alt="Image by Robert Hodgin" width="640" height="269" /></a></p>
<p>I passed 4 points into OpenGL geometry buffer and then used a mode called TRIANGLE_STRIP to draw the square shape.</p>
<pre class="brush: jscript; title: ; notranslate">
  // this creates a place in GPU memory for our array of points
  squareVerticesBuffer = gl.createBuffer();
  // then we 'bind' the buffer, get the memory ready to receive the points
  gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
// Here's our list of 4 points
// each line represents a point in 3D space
// the order is x, y, z
// we leave the z as 0 since we are drawing a 2D shape
// The center of the square will be at coordinate 0,0,0
  var vertices = [
    1.0,  1.0,  0.0, // top right
    -1.0, 1.0,  0.0, // top left
    1.0,  -1.0, 0.0, // botom right
    -1.0, -1.0, 0.0 // bottom left
  ];
  // Now pass the list of vertices (points) into WebGL to store the shape
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
</pre>
<p><img src="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/axis-300x300.jpg" alt="Cartesian coordinate system" title="axis" width="300" height="300" class="alignleft size-medium wp-image-300" /></p>
<p>All objects created in OpenGL are automatically positioned at point 0x,0y,0z, and that point, in the cartesian coordinate system, is usually placed at the center point of the OpenGL window. When creating vertices for an object we have to keep in mind that all the points extend from the center of the object, so a vertex at position (1.0x ,1.0y, 0z) means that it&#8217;s positioned 1 unit of x and 1 unit of y away from the center of the screen.</p>
<div class="clear"></div>
<p>Now that we stored the points in OpenGL memory we have to pass the vertices to the vertex shader and tell OpenGL to draw this shape.</p>
<h3>Step 4 [Drawing]</h3>
<p>Before we draw anything to the screen we need to clear the canvas. If we are animating something, we&#8217;ll need to clear the canvas on each frame and then re-draw everything again. This might seem counter-intuitive but, at lower level, that is how real-time computer animations works. So each frame we have to keep track of the position and states of each object.</p>
<p>Here&#8217;s how to clear the screen:</p>
<pre class="brush: jscript; title: ; notranslate">
// Clear the canvas before we start drawing on it.
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
</pre>
<p>Then we need to create a perspective matrix, this matrix will tell the vertex shader how to render the 3D scene to a 2D image. This matrix acts as a camera that shows us the 3D scene.</p>
<p>I used special helper functions to create this camera matrix:</p>
<pre class="brush: jscript; title: ; notranslate">
 // Establish the perspective with which we want to view the
  // scene. Our field of view is 45 degrees, with a width/height
  // ratio of 640:480, and we only want to see objects between 0.1 units
  // and 100 units away from the camera.
  perspectiveMatrix = makePerspective(45, 640.0/480.0, 0.1, 100.0);
// THis matrix gets passed to the vertex shader later on
</pre>
<p>If you are interested, you can view the full function in the glUtils.js file, it contains various 3D matrix helper functions.</p>
<pre class="brush: jscript; title: ; notranslate">
// Get the points from memory
gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
// Pass the points array to the vertex shader (I initialized vertexPositionAttribute earlier in the program)
gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
// Tell OpenGL to draw
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
</pre>
<p>The <strong>drawArrays</strong> function simply tells OpenGL to execute the shaders, passing the number of points to take from the array and the mode to draw them with, which will then draw inside the window.</p>
<p>The steps I outlined above explain how to draw a simple 2D shape in OpenGL using Javascript. I also explained a fair bit about how OpenGL works. In my demo application, I have examples of animation, use of colour and texturing a 3D object. Below, I will briefly explain how these features we implemented.</p>
<h3>Using Colour</h3>
<p><img src="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/Screen-Shot-2011-11-16-at-10.09.00-PM-150x150.png" alt="" title="Screen Shot 2011-11-16 at 10.09.00 PM" width="150" height="150" class="alignleft size-thumbnail wp-image-269" /></p>
<p>Instead of colouring the entire shape with one colour, we can give each vertice it&#8217;s own colour. The cool thing about OpenGL is that the shaders will automatically fill the space between the vertices with a gradient, if the colours of each vertex is different. Just look at the image on the left. I gave each corner vertex a different colour and OpenGL figured out the rest. If I gave each vertex the same colour, the square would have been a solid colour.</p>
<div class="clear"></div>
<p>Here&#8217;s how I set the colours using Javascript:</p>
<pre class="brush: jscript; title: ; notranslate">
var colors = [
		    1.0,  1.0,  1.0,  1.0,    // white
		    1.0,  0.0,  0.0,  1.0,    // red
		    0.0,  1.0,  0.0,  1.0,    // green
		    0.0,  0.0,  1.0,  1.0     // blue
		  ];
		  squareVerticesColorBuffer = gl.createBuffer();
		  gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer);
		  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
</pre>
<p>As you can see, this is very similar to how I created the points for the square. The number of colours has to be the same as the number of points in an object.</p>
<h3>3D Objects</h3>
<p><img src="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/Screen-Shot-2011-11-16-at-10.29.29-PM-150x150.png" alt="" title="Screen Shot 2011-11-16 at 10.29.29 PM" width="150" height="150" class="alignright size-thumbnail wp-image-276" /></p>
<p>Theres are no 3D primitives in OpenGL, no cubes, no spheres, no cylinders, every 3D object has to be created by using vertices. So to create a 3D cube I had to create vertices for 6 different squares and place them accordingly within the 3D space. In OpenGL all 3D objects have to be constructed from 2D planes, which are placed together tightly, to make the objects look solid. There&#8217;s no magic for creating 3D objects, just lots of code.</p>
<div class="clear"></div>
<h3>Animation</h3>
<p>Im the demo application I am rotating a 3D cube. In order to rotate the object OpenGL I had to apply another matrix, on top of the perspective matrix, to the object&#8217;s vertices inside the vertex shader, this matrix is called a transformation matrix. The transformation matrix modifies the position, rotation and scale of the object&#8217;s coordinate system and, as a result, transforms the object.</p>
<p>This is the code I am using to set the rotation matrix of the cube:</p>
<pre class="brush: jscript; title: ; notranslate">
mvRotate(rotation, [1, 0, 1]);
function mvRotate(angle, v) {
  var inRadians = angle * Math.PI / 180.0;

  var m = Matrix.Rotation(inRadians, $V([v[0], v[1], v[2]])).ensure4x4();
  multMatrix(m);
}
</pre>
<p>The <strong>mvRotate</strong> function accepts an angle of rotation and a vector representing the axis of rotation. It then uses some helper math function from a math library called <a href="http://sylvester.jcoglan.com/" target="_blank">Sylvester</a> to generate that matrix. I increment the rotation variable on each frame so that the angle of rotation increases, causing the cube to spin. The translation matrix could affect many objects at once or just one object, depending on how many objects are rendered using the matrix.</p>
<p>This is the part of the shader code that applies the transformation matrix (it&#8217;s called uMVMatrix)</p>
<pre class="brush: cpp; title: ; notranslate">
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
</pre>
<h3>Image Texture</h3>
<p><img src="http://www.maxtherocket.com/blog/wp-content/uploads/2011/11/Screen-Shot-2011-11-16-at-11.45.16-PM-150x150.png" alt="" title="Screen Shot 2011-11-16 at 11.45.16 PM" width="150" height="150" class="alignleft size-thumbnail wp-image-282" /></p>
<p>Applying an image texture onto a 3D object requires a few extra steps. We need to first load the image into the OpenGL buffer and tell it how to treat it (wich scaling functions to use when scaling the image). Then we need to tell OpenGL how to place the image onto an object through an array of texture coordinates. We then need to use modify the shader to grab the colour for each pixel on the object from the image.</p>
<div class="clear"></div>
<p>This is the code for loading the image from a url to the OpenGL buffer:</p>
<pre class="brush: jscript; title: ; notranslate">
// This function loads the image from a url, when the image finishes loading an OpenGL texture gets created
function initTextures() {
  cubeTexture = gl.createTexture();
  cubeImage = new Image();
  cubeImage.onload = function() { handleTextureLoaded(cubeImage, cubeTexture); }
  cubeImage.src = &quot;images/fridge.jpg&quot;;
}

function handleTextureLoaded(image, texture) {
  gl.bindTexture(gl.TEXTURE_2D, texture); // Bind texture
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); // Create texture from image
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); // Scaling functions for enlarging
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); // Scaling functions for sizing down
  gl.generateMipmap(gl.TEXTURE_2D);
  gl.bindTexture(gl.TEXTURE_2D, null); // Complete
	resetBuffers();
}
</pre>
<p>This is the code for specifying texture co-ordinates. Pretty much we&#8217;re just telling OpenGL how to place the image on the object. These points mean that the corners of the image should be placed on the corners of the square. </p>
<pre class="brush: jscript; title: ; notranslate">
var textureCoordinates = [
// Front
0.0,  0.0, // Top left
1.0,  0.0, // Top right
1.0,  1.0, // Bottom right
0.0,  1.0, // Bottom left
// Back
0.0,  0.0,
1.0,  0.0,
....
</pre>
<p>This is a part of the new shader code that reads the colour of each pixel in the image and applies it onto the object:</p>
<pre class="brush: jscript; title: ; notranslate">
gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
</pre>
<h3>Conclusion</h3>
<p>WebGL provides a direct access to OpenGL, without much abstraction (I refer to abstraction as helper classes and functions that help create primitive 3D shapes, lights and provide ways to easily add colour and texture to objects). This low-level access to OpenGL functions, through WebGL, helped me to get a better understanding of how OpenGL works. </p>
<p>While OpenGL is very powerful, it also requires a lot of code, especially the process of creating objects and adding colours and textures to those objects. I think it is more productive if those tasks are done through abstracted classes and helper functions. Game engines and frameworks like Processing and OpenFrameworks already do these abstractions, and do them well. The main benefit of digging deeper into OpenGL comes from mastering the shading language. Since shaders offer a powerful, hardware optimized, way to manipulate how objects get drawn to the screen, learning the OpenGL shading language is a critical skill to have when working with real-time 3D graphics.</p>
<p>Unfortunately, during my research I barely had a chance to learn how to create custom shaders, since all my time went into learning how to create objects and setting up OpenGL for rendering. My next step is to get a better understanding of shaders and attempt to create my own. I will use a framework for dealing with object creation, such as OpenFrameworks, so that I can focus just on OpenGL shader development.</p>
<h4>References</h4>
<ul>
<li><a href="https://developer.mozilla.org/en/WebGL" target="_blank">WebGL Tutorial by Mozilla Developer Network</a></li>
<li><a href="http://learningwebgl.com/blog/?page_id=1217" target="_blank">WebGL Tutorial from learingwebgl.com</a></li>
<li><a href="https://www.khronos.org/registry/webgl/specs/1.0/" target="_blank">Official Web GL Specification</a></li>
<li><a href="http://www.amazon.com/OpenGL-SuperBible-Comprehensive-Tutorial-Reference/dp/0321712617/ref=sr_1_1?ie=UTF8&#038;qid=1321537582&#038;sr=8-1" target="_blank">OpenGL SuperBible: Comprehensive Tutorial and Reference (5th Edition)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/opengl-research/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Motorized &#8211; A short film</title>
		<link>http://www.maxtherocket.com/blog/motorized-a-one-minute-short/</link>
		<comments>http://www.maxtherocket.com/blog/motorized-a-one-minute-short/#comments</comments>
		<pubDate>Mon, 06 Dec 2010 00:54:41 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=191</guid>
		<description><![CDATA[Motorized from Max Rusan on Vimeo. Storyboards Motorized is a one-minute, video installation. The video demonstrates the role of digital displays within a typical urban city in North America. Motorized focuses on the fast-paced human traffic in the core of the city. The video shows the city’s dependence on electronic displays to keep the constant [...]]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://player.vimeo.com/video/17497281" width="400" height="300" frameborder="0"></iframe>
<p><a href="http://vimeo.com/17497281">Motorized</a> from <a href="http://vimeo.com/user5402319">Max Rusan</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><a href='http://www.maxtherocket.com/blog/wp-content/uploads/2010/12/motorized-storyboard-2page.pdf'>Storyboards</a></p>
<p><em>Motorized</em> is a one-minute, video installation. The video demonstrates the role of digital displays within a typical urban city in North America. <em>Motorized</em> focuses on the fast-paced human traffic in the core of the city. The video shows the city’s dependence on electronic displays to keep the constant flow of people under control. Through the juxtaposition of video clips showing both, human traffic and electronic displays used in downtown Toronto, as well as vehicle traffic, which is a more familiar system of flow control, the video demonstrated the relation of electronics and the control of human traffic.</p>
<p>The first part of the video, which is before 3 white arrows fill the screen, shows a car moving from a suburban area into an urban area of the city. This is done through the use of video clips that show a view from within a moving car. The side view from a window, which shows an area filled with a lot of trees and lake Ontario in the background, along with the view from the front window, which shows the car driving through the same area, clearly demonstrate that the car starts off driving in a suburban area. Consecutive clips, like the view of underneath the bridge and the view from the front window showing a saturation of buildings on both sides of the road indicate that the car is going into an urban area. The contrast between the suburban area and an urban area exaggerates the abundance of digital displays within the core of the city, since the occurrence of digital displays in a suburban area is minimal. The 3 digital arrows mark a transition from suburban area to a busy urban area. Right after the 3 white arrows fill the screen, an establishing shot of Yonge and Dundas square is shown and the viewer is places in the core of Toronto. To make the digital presence within the busy downtown core more obvious, the screen is filled with digital scrolling text. A flow of human traffic is shown after another digital display is shown, a digital clock. The flow of human traffic is sped up to focus the viewer’s attention on the actual flow, and not on individual people. This juxtaposition of human traffic and electronic displays show the role of electronics in controlling the flow of people within a busy city environment. The crosswalk countdown in the end of the video, further illustrates how people are controlled by digital displays just like the end of the video is controlled by the same countdown.</p>
<p>Through <em>Motorized</em> I want to remind the viewers of how important digital displays are in a busy city like Toronto. The displays control the flow of the city as well keep the people safe. Do demonstrate my concept I chose to use time-based media since it was the best media to show the flow of human and vehicle traffic and to convey the dazzle of digital displays. It is important to notice how these electronic devices became such a significant part of North American urban society.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/motorized-a-one-minute-short/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Podcast &#8211; Pamela vs. Courbet, L&#8217;Origin Du Monde</title>
		<link>http://www.maxtherocket.com/blog/podcast-pamela/</link>
		<comments>http://www.maxtherocket.com/blog/podcast-pamela/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 22:29:30 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=201</guid>
		<description><![CDATA[Pamela vs. Courbet, L&#8217;Origin Du Monde by maxtherocket A podcast review of a photo mosaic work by Alex Guofeng Cao entitled Pamela vs. Courbet, L&#8217;Origin Du Monde.]]></description>
			<content:encoded><![CDATA[<p><object height="81" width="100%"><param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F7852794&#038;secret_url=false"></param><param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F7852794&#038;secret_url=false" type="application/x-shockwave-flash" width="100%"></embed></object>  <span><a href="http://soundcloud.com/maxtherocket/pamela-vs-courbet-lorigin-du-monde">Pamela vs. Courbet, L&#8217;Origin Du Monde</a> by <a href="http://soundcloud.com/maxtherocket">maxtherocket</a></span></p>
<p>A podcast review of a photo mosaic work by Alex Guofeng Cao entitled Pamela vs. Courbet, L&#8217;Origin Du Monde.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/podcast-pamela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podcast &#8211; Kristan Horton&#8217;s Dr. Strangelove Dr. Strangelove</title>
		<link>http://www.maxtherocket.com/blog/podcast-kristan-hortons-dr-strangelove-dr-strangelove/</link>
		<comments>http://www.maxtherocket.com/blog/podcast-kristan-hortons-dr-strangelove-dr-strangelove/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 01:25:43 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=189</guid>
		<description><![CDATA[Dr. Strangelove Dr. Strangelove by maxtherocket A podcast reviewing a work by a Toronto artist Kristan Horton entitled Dr. Strangelove Dr. Strangelove]]></description>
			<content:encoded><![CDATA[<p><object height="81" width="100%"><param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F7706098&#038;secret_url=false"></param><param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F7706098&#038;secret_url=false" type="application/x-shockwave-flash" width="100%"></embed></object>  <span><a href="http://soundcloud.com/maxtherocket/dr-strangelove-dr-strangelove">Dr. Strangelove Dr. Strangelove</a> by <a href="http://soundcloud.com/maxtherocket">maxtherocket</a></span> </p>
<p>A podcast reviewing a work by a Toronto artist Kristan Horton entitled <em>Dr. Strangelove Dr. Strangelove</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/podcast-kristan-hortons-dr-strangelove-dr-strangelove/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podcast &#8211; Edward Keeble&#8217;s Pong Prom</title>
		<link>http://www.maxtherocket.com/blog/podcast-edward-keebles-pong-prom/</link>
		<comments>http://www.maxtherocket.com/blog/podcast-edward-keebles-pong-prom/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 03:38:03 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=185</guid>
		<description><![CDATA[Pong Prom by maxtherocket In this podcast I review an interactive performance called Pong Prom by a Toronto New Media artist, Edward Keeble. Check out Edward&#8217;s website: http://edwardkeeble.com/projects/pong-prom/]]></description>
			<content:encoded><![CDATA[<p><object height="81" width="100%"><param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F7705990&#038;secret_url=false"></param><param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F7705990&#038;secret_url=false" type="application/x-shockwave-flash" width="100%"></embed></object>  <span><a href="http://soundcloud.com/maxtherocket/pong-prom">Pong Prom</a> by <a href="http://soundcloud.com/maxtherocket">maxtherocket</a></span></p>
<p><span>In this podcast I review an interactive performance called Pong Prom by a Toronto New Media artist, Edward Keeble.</span></p>
<p><span>Check out Edward&#8217;s website: <a href="http://edwardkeeble.com/projects/pong-prom/" target="_self">http://edwardkeeble.com/projects/pong-prom/</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/podcast-edward-keebles-pong-prom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ghost Beat &#8211; Ghostbusters theme song using only recorded sounds</title>
		<link>http://www.maxtherocket.com/blog/ghostbusters-theme-song-using-recorded-sounds/</link>
		<comments>http://www.maxtherocket.com/blog/ghostbusters-theme-song-using-recorded-sounds/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 18:37:31 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=181</guid>
		<description><![CDATA[Ghostbusters by maxtherocket Ghost Beat re-creates the Ghostbusters theme song by Ray Parker Jr. using sounds of whistles, hums, knocks and kicks that I recorded myself. I used the actual notes of the song so the tempo and instrument notes match the original song, but the sound of the instruments sounds completely different. With so [...]]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="81" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowscriptaccess" value="always" /><param name="src" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F6886237&amp;secret_url=false" /><embed type="application/x-shockwave-flash" width="100%" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F6886237&amp;secret_url=false" allowscriptaccess="always"></embed></object> <span><a href="http://soundcloud.com/maxtherocket/ghostbusters">Ghostbusters</a> by <a href="http://soundcloud.com/maxtherocket">maxtherocket</a></span></p>
<p><em>Ghost Beat</em> re-creates the Ghostbusters theme song by Ray Parker Jr. using sounds of whistles, hums, knocks and kicks that I recorded myself. I used the actual notes of the song so the tempo and instrument notes match the original song, but the sound of the instruments sounds completely different. With so many choices of tools for creating music the only limitation is creativity of the creator. Through this work I am hoping to demonstrate that anything can be used as an instrument when creating music, all the sounds you need to create music can be found within your room or office and the ability to create sounds using you mouth should not be overlooked. By using a song that most people are familiar with and by avoiding the instruments used in the theme song — by avoiding instruments altogether — I am hoping to make it perceptible that it is possible to make music by using only recorded sounds.</p>
<p>It is difficult for the listener to recognize the Ghostbusters theme melody from the first 10 seconds the <em>Ghost Beat</em>. I did this on purpose so the listener is forced to concentrate on the actual sounds used, instead of the melody. The sounds used in the beginning of the song consist of hums and a recording of a homeless person shouting. I made the sound for the drum beat of the song by taping on my desk with my finger. For the melody of the song I used a recording of me whistling. The rest of the underlying sounds are a combination of hums and whistles.</p>
<p><em>Ghost Beat</em> uses midi data from the Ghostbusters theme song to trigger recorded sound samples to play, demonstrating, to the listener, the creative possibilities of using software to create music. After listening to <em>Ghost Beat </em>the listener should be encouraged to explore the idea of making music with sounds that are present in everyday life. It is important to point out to the public that making music is simple and there is no need for a musical instrument, <em>Ghost Beat</em> underlines that creating music is accessible to anyone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/ghostbusters-theme-song-using-recorded-sounds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UNITY 2008</title>
		<link>http://www.maxtherocket.com/blog/unity-2008/</link>
		<comments>http://www.maxtherocket.com/blog/unity-2008/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 04:23:10 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[4D]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[My Work]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=168</guid>
		<description><![CDATA[View the site This is the website for an annual 4D Events party at the Guvernment. This year I wanted to give the site a look and feel of love, happiness, and a little hippie. I used a lot of circular shapes, smooth curves and an explosion of vibrant colors. Doesn&#8217;t this website make you [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://maxtherocket.com/projects/4d/unity08/"><img class="alignnone size-full wp-image-167" title="unity08-01" src="http://www.maxtherocket.com/blog/wp-content/uploads/2009/11/unity08-01.jpg" alt="unity08-01" width="400" height="220" /></a></p>
<p><a href="http://maxtherocket.com/projects/4d/unity08/">View the site</a></p>
<p>This is the website for an annual <a href="http://4devents.ca">4D Events</a> party at the Guvernment. This year I wanted to give the site a look and feel of love, happiness, and a little hippie. I used a lot of circular shapes, smooth curves and an explosion of vibrant colors. Doesn&#8217;t this website make you happy when you look at it? Doesn&#8217;t it scream Unity? Well it should.</p>
<p>I used Papervision 3D for the Unity logo at the top, it moves with your mouse <img src='http://www.maxtherocket.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . I thought the video on the background is a good way to show what the party is all about, which worked out well. Since the site if full page flash it was a quite challenge to figure out how to move all the elements on stage when the window gets resized, not to mention resizing the video. But I love challenges.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/unity-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr Soundtrack featuring YouTube</title>
		<link>http://www.maxtherocket.com/blog/flickr-soundtrack-youtube/</link>
		<comments>http://www.maxtherocket.com/blog/flickr-soundtrack-youtube/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 03:56:48 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Experimental]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[My Work]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=162</guid>
		<description><![CDATA[View the Project This is application that displays random, most interesting photos from Flickr. For each photo the application searches for a YouTube video that matches the photo&#8217;s tags and plays the sound from the YouTube video. Basically the application created a soundtrack for a photo being viewed. I had to create a database of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.maxtherocket.com/ryerson-portfolio/artist-project/" target="_blank"><img src="http://www.maxtherocket.com/blog/wp-content/uploads/2009/09/Flickr-Soundtrack-screenshot-300x150.png" alt="Flickr-Soundtrack screenshot" title="Flickr-Soundtrack screenshot" width="300" height="150" class="alignnone size-medium wp-image-163" /></a></p>
<p><a href="http://www.maxtherocket.com/ryerson-portfolio/artist-project/" target="_blank">View the Project</a></p>
<p>This is application that displays random, most interesting photos from Flickr. For each photo the application searches for a YouTube video that matches the photo&#8217;s tags and plays the sound from the YouTube video. Basically the application created a soundtrack for a photo being viewed.</p>
<p>I had to create a database of suitable photo tags for searching videos on YouTube. Most tags in Flickr photos are specific to photographs only like color, camera models and photography techniques. I had to hand-pick the tags that would be appropriate for YouTube video tags.</p>
<p>I created this app as a project for my application to Ryerson University. The interface is kinda weak, I was tight on time when I made it. I am planning on creating a cooler interface for this. Maybe something with 3d, a sound spectrum and an option to view the actual video that the sound is taken from.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/flickr-soundtrack-youtube/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TSN Broadcast Museum</title>
		<link>http://www.maxtherocket.com/blog/tsn-broadcast-museum/</link>
		<comments>http://www.maxtherocket.com/blog/tsn-broadcast-museum/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 03:39:32 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[My Work]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[exhibit]]></category>
		<category><![CDATA[mywork]]></category>
		<category><![CDATA[papervision3d]]></category>
		<category><![CDATA[tsn]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=151</guid>
		<description><![CDATA[This is an interactive TSN Broadcast Museum exhibit for the Hockey Hall of Fame. The exhibit is on the history of TSN’s hockey broadcasting. The project combines video, audio and images in a 3D interface. I used Papervision3D for the 3D interface and coded everything in Actionscript 3. The exhibit is controller by gesture recondition. [...]]]></description>
			<content:encoded><![CDATA[<p>This is an interactive TSN Broadcast Museum exhibit for the Hockey Hall of Fame. The exhibit is on the history of TSN’s hockey broadcasting. The project combines video, audio and images in a 3D interface. I used Papervision3D for the 3D interface and coded everything in Actionscript 3. The exhibit is controller by gesture recondition. I didn&#8217;t have to implement the gesture recondition technology myself, it was already in place. i just had to work with basic mouse events. But the gesture recodnition system is just awesome.</p>
<p><a rel="shadowbox;height=520;width=640" href="http://maxtherocket.com/projects/tle/tsn/tsn-broadcast-museum-video.swf">View The Project</a></p>
<p><a rel="shadowbox;height=520;width=640" href="http://maxtherocket.com/projects/tle/tsn/tsn-broadcast-museum-video.swf"><img class="size-full wp-image-156 alignnone" title="TSN Broadcast Museum" src="http://www.maxtherocket.com/blog/wp-content/uploads/2009/09/tsn-broadcast-museum-01.jpg" alt="TSN Broadcast Museum" width="400" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/tsn-broadcast-museum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CASA Lib: A Great Open Source AS3/AS2 Library</title>
		<link>http://www.maxtherocket.com/blog/casa-libgreat-as3-library/</link>
		<comments>http://www.maxtherocket.com/blog/casa-libgreat-as3-library/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 03:37:27 +0000</pubDate>
		<dc:creator>Max The Rocket</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.maxtherocket.com/blog/?p=145</guid>
		<description><![CDATA[Here&#8217;s a pretty good description of CASA Lib from its website: CASA Lib is a flexible ActionScript library designed to streamline common chores and act as a solid, reliable foundation for your projects. It provides a core set of classes, interfaces, and utilities to get you coding faster and more reliably without getting in the [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a pretty good description of <a href="http://casalib.org" target="_blank">CASA Lib</a> from its website:</p>
<blockquote><p>CASA Lib is a flexible ActionScript library designed to streamline common chores and act as a solid, reliable foundation for your projects. It provides a core set of classes, interfaces, and utilities to get you coding faster and more reliably without getting in the way.</p></blockquote>
<p>If you work with actionscript YO MUST GET THIS LIBRARY! I ran into CASA Lib on he web a while ago and I can&#8217;t believe I used to work with actionscript without this library. CASA Lib has saved me a lot of time, it takes care of the code that you have to type over and over again like a zombie. Save yourself time and use <a href="http://casalib.org" target="_blank">CASA Lib</a>!</p>
<p>I&#8217;m sure there are other actionscript libraries out there, if you know of any good ones like CASA Lib post them in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maxtherocket.com/blog/casa-libgreat-as3-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

