Sunday, April 15, 2007

In creativity, I cannot stress enough the importance of research. This is not an idle bit of advice. In teaching or learning, there are many such rules and practices, which are taught and given without argument, expected to be accepted. As a student you may accept unquestioningly what you are taught, at least for the purposes of the course and the grade. Without the reasoning to back it up though, such lessons do not become knowledge, but instead become religion. Knowledge is something that you can demonstrate, and if prompted, give a convincing argument why such and such is so. Religion is merely a set of rules that you follow, without knowing why. They are in other words, a set of assumptions.

This is all very abstract without an example, so I will demonstrate now why research is important, and why a creative should not take it for granted.

Some time ago, I made a Totem painting. The basic idea I had was to paint on a 2' by 8' masonite board, a Totem Pole composed of a number of various mass cultural characters, such as the cat in the hat, kermit the frog, mickey mouse, etc. Collaged with this was images of various scenes I picked out of searching through various japanese websites and books; imagery from japanese culture; modern and traditional. While the painting was generally well recieved, it wasn't a *great* painting, and this was not due to the quality of paint I used (admittedly poor), or how much time I spent making crisp lines (not a lot).

The reason it wasn't a great painting is due to the rushed assumptions I made in the conceptual phase. The worst assumption, was the ethnocentric viewpoint that totem pole design is simple, and primative, and thus easy to imitate. The really stupid assumption that totem poles were merely stacks of heads, and yet another bad assumption that it's possible to encapsulate the subtleties of an entire culture by merely selecting a few images.

The truth is, totem pole design is as nuanced and delicate an art as font design, or classical architecture. There is a balance of line, volume, and flow which is not easily mastered. Additionally, totem poles are not merely heads- they are entire bodies, deformed yes, so that the head is the most prominant feature. But the body is still there nonetheless. There is cultural context in these deformations which again is not easily mastered. This sense of cultural context is also missing in my rushed and crass choice of japanese imagery. These assumptions, spelled out, seem obviously stupid. But these sorts of assumptions are not easy to notice, especially when you are rushed. They are not easily noticed because one does not typically think about what assumptions one holds, until they are prompted in such a critical way.

The most difficult thing about learning, is being flexible enough to recognize where you are making assumptions, and maintaining the will to discard these assumptions when it becomes necessary. This is something a teacher cannot do for you. This is why research is important: It shows you what reality IS, not what you expect it to be.

1. Why create a new programming language?I have an idea for a programming language. There are hundreds already though, why create a new one? I firmly believe that the bulk of programming languages are missing the point. They don't lack effort or thought, many are theoretically sound, many aren't. Some of my favorites are Lisp, Ruby and APL.

What's lacking in the world of programming languages though, is the perspective of a designer, because frankly, every programming language I see is ugly. Every programming language I have seen, to one extent or another flagrantly disregards the history and culture of punctuation and symbology. They abuse symbols, assigning them meaning they were never meant to have. These programming languages force their readers to cross their eyes, and ignore their years of cultural training to follow the specific and unique logic which applies only to the world of programming. The relatively high density of brackets, and nesting lead to a visual ambiguity which requires an expert, and a good code formatter to decipher. Code should not be code.

And why should code be beautiful, you may ask? The end users don't have to look at it, and the programmers should be clever enough to deal with any sort of cryptic obfuscation, and difficult to type out structure. They are professionals after all! Sure, but the key point is, they are also human. Difficult to read, and hard on the eyes code leads to more mistakes, more fatigue, and over all a more grueling experience. Your average person can usually look at a gramatically incorrect sentence, and immediately sense that something is wrong. Your average programmer doesn't necessarily have this ability with a line of code. Due to the haphazard and thoughtless design of programming languages, you still have to read through word for word, symbol for symbol to figure out why something doesn't work, why something is illogical.

I think there's a better way. I think there is room for a humanistic programming language. I think it's time for one too. There is currently no technical reason it is not possible. The *only* reason we still code using these brutal machine languages, is due to the short history of computers, and their original strict limitations. These limitations no longer exist, but the assumptions that we built from those limitations still do. Let's work to improve this.

2. Design goals

It's easy to lose sight of your goal, in the midst of the process of creation. See my earlier post about creative briefs. Ruby on Rails has a number of design principles. there's Don't Repeat Yourself, and the principle of least surprise, for a couple of examples. A humanistic programming language should have some basic guidelines to enforce a certain amount of self consistancy.

Here is the space where I will keep my working list of HPL ideals.

Respect the punctuation

Don't violate the history, culture and meaning of symbols. We are no longer limited to just what's at the top of the keyboard, above the numbers. Nowadays, we have the entire Unicode symbol library at our command. Let's find appropriate symbols, and use them for their appropriate meanings.

Whitespace is not irrelevant

Having a standard indentation style has proven invaluable to the open source projects that have enforced it. Having a common visual expectation for the code makes collaboration that much easier. Let's not rely on humans to enforce the visual style. We have computers for droning repetetive tasks like that.

Dielects over Bloat

In the real world, different professions each have their own specific languages. Think about the show ER, and the sheer amount of latin they use just to get around having to tediously describe in detail every little thing. Verbal shortcuts. The same should apply to programming. If I'm making a web application, don't make me tediously describe the process of retrieving information from a form, or persisting data in a database. We know in advance we need to do these similar tasks many times. Provide shortcuts for doing them.

Loops are a bad solution to an old problem

The typical tasks which need to be performed by loops is well understood by now. Some task needs to be performed on a list of things, a tree needs to be traversed to find a needle in a haystack, etc. Make syntax for the task, not the computer's method of performing it.

Syntax for the task, not the method

nuf said

Brackets are bad, nested brackets are worse

Brackets are actually visually useful, as long as the opening and closing bracket are on the same line, and there are no other brackets nesting in or around them. Once you break them out into multiple lines, nest them, and worst of all, have a line with nothing but a bracket, things start getting confusing and visually ugly. A closing bracket visually points to the left. If it's on its own, it is pointing at nothing. It is closing and resolving nothing. Combine it with nesting, and reading a page of code becomes a game of matching opening brackets to closing brackets. How can you debug your code, if you have no idea what is going on in it, and it is not visually obvious that you have made a typo? XML endevoured to solve the matching problem. How? More brackets! MANY MORE BRACKETS. Great. I think we can do better.

3. Parallelism

4. Relational integrity

5. MVC enforcement

6. Event Model

7. REST architecture provides a means for sharing work, without working to share.

Sunday, April 8, 2007

During the development of an idea, it's easy to lose sight of your original vision. You begin to see new things in your work, and it carries you in new directions. Often during this process you end up with something very different from that which you originally intended to create. During the process, you forget the problem that you set out to solve, and judge your work purely on its aesthetics, or the feeling of the moment.

The creative brief is the solution and recognition of this situation.

A creative brief is a written, detailed description of the design problem to be tackled. It is not simply a statement of the problem (a brochure needs to be created), but also gives you relevant facts about the client, their target market, the market goals they wish to achieve, their history as a company, the intended message which needs to be conveyed, and any other relevant information. A good creative breif gets beyond the simple question of "What do you want", and instead sets in a number of parameters which define a "space", what is often referred to as the "Problem Space". Within this defined space exists viable solutions, and beyond it lay non solutions. In theory. A really good design process will recognize when a creative breif is inadequate, and midway through redefine the problem, perhaps in different words, perhaps from a different perspective. For instance, a creative brief might stipulate that the client needs a business card for her florist business. A designer, after some meetings with the client, might redefine the problem as "The client wishes to attract more business from engaged couples, and stay within a budget of under $4000"

The key here, is the more detailed you get, the more you crystalize a vision of what the problem *really* is, the more productive the design process becomes.

Through each revision, and at the end of the process, ask yourself: "Does this *really* solve the problem?". be thoughtful and honest to yourself (or others) in giving the answer. If you answer no, ask yourself why, and you will understand what revisions need to be done. If you answer yes, be careful that you are not deceiving yourself. There is no such thing as a perfect solution- But within a problem space there are many possible solutions. Is this the best one?

This may seem stupidly obvious, but in this complex mesh of theories and processes that is the design process, it is easy to lose sight of what is obvious, and get lost in the details of implementation.

I had a conversation with my friend Dano, and I thought of a few more things about ideas.

'The progression of design history has not been a progression of new ideas, but the identification of new aspects of the same old problems."

It's not the ideas through history that have been important. That is just the part that people notice. They don't notice why they came up with the new idea. They don't think about the fact that it didn't come from nowhere.

I think to a large extent, as a designer I have been fixated on coming up with the next big thing, the new great idea. In doing that, I lose sight of the fact tat the people that came up with the last great idea didn't do it on purpose. They found a new aspect of an existing problem that nobody noticed before, or they did notice, but were too afraid to openly acknowledge that it exists.

Dano then tells me that he is the "Exact same way". He wants to come up with something great and new, and he psyches himself into getting nothing done, and making nothing but shit along with it. He wonders why he can't just do things without thinking "How can I be completely original", and suggests that this is perhaps too lofty a goal to set yourself to.

It's a bit like a chinese finger trap. There's an element of selfishness in wanting to grab some small bit of glory for yourself. But in order to get there you have to completely forget that you want that. You have to convince yourself that you don't, and you're just out to solve a problem. You also have to accept that there's a very good chance that it won't turn out great, and not let yourself be dissapointed when it doesn't. Just figure out what went right, what went wrong, and move on.

The great solutions come out of honesty; honesty to the problem, honesty to yourself, honesty about the solution. Don't let cultural biases, or your ego get in the way of perceiving something about the problem. Don't succumb to the forces that tell you to ignore it, the forces inside you that want to be seen as good, and smart, and talented, and better. Instead listen to the littler voice inside you that says the emporer has no clothes.

The important thing to remember about ideas, is that they are not important. This will probably violate a lot of people's feelings about ideas, but it's true. Ideas are cheap. It's the execution that matters. This is why I have no problem writing all my ideas out here. It doesn't serve me any function to jealously keep all my ideas secret, in fear that someone will steal them. I am not the scriptwriter that accuses the producer, who rejected my script, of stealing the very ideas within it. The value of ideas has become very distorted in modern western culture. This could go on to become a lengthy discussion about copyright law, but that is not why I am writing this post.

So, let's take it as a given that ideas are a dime a dozen. Suppose I fill this blog up with a dozen ideas a month. How do I determine which ideas are worth pursuing? Which ones should I invest real time in bringing to reality? I Think this is related to the question I asked in the first post. How do you define a person? Another (more sexist) form of the question is "What is the measure of a man". It's a question about measuring the potential of a person. It's a question about predicting what that person is likely to do in the future. Depending on how you look at it, it's also about how a person is percieved. It seems shallow, but social perception is important. So when you are judging a person, what factors go into your judgement? What do you look for to decide whether someone is a genius, or a peasant?

Perhaps it is what a person has done in the past. If it is, then really, you are judging a person based on what ideas they chose to act upon, out of the sea of ideas. So one must choose carefully, as the ideas one chooses, determines who they are, or at least how they will be judged.

Many people will chose ideas based on their marketability. Perhaps there's a certain cool factor. Perhaps they've fallen in love with a particular technology. (lots of people have fallen in love with AJAX, lately). Most people don't think about the criteria they use for choosing what to act on. They just do things because they feel good, or they do things because they think it is expected from them by other people. Some people just have a really nice hammer, and are out looking for things that look like nails. Others just want to be seen doing the same things as everyone else, and desperately want to be thought of as cool or normal.

As a Graphic Designer, I am trained to start with a problem. Once I've established the exact nature of the problem, I must think of as many possible solutions as possible. The flood of ideas. The more you can think of, the better. The idea that wins, is the one that solves the most aspects of the problem. The progression design history has not been a progression of new ideas, but the identification of new aspects of the same old problems. Modernist architecture fullfilled all the needs of a human being, through the triumph of science.

That is what the architects thought. They've thought of the optimal size of the kitchen, the living room, how many bathrooms there should be, where they should be located, how high the ceilings should be, what the best materials are, how to give just enough space to someone so they don't feel cramped, but not so much that high density living is not possible.

They forgot that humans don't like living in featureless boxes. So Postmodernism is about the discovery of the human aspects of problem solving. Unlike modernism, Post-Modernism doesn't strive for purity, or the triumph of man over nature. Post modernism accepts everyone and everything for exactly what it really is. Post modernism doesn't reject history, it doesnt' reject science, it doesnt' reject pointless decoration or starkness. Post modernism is the relentless search for new aspects to old problems, and it has erased the boundary lines for future eras of art, and replaced them with a smooth continuous forward march away from the myopia of modernism.

So how do I choose which ideas to pursue? I don't. The best thing to do is choose which problems to pursue, and investigate as many aspects of the problem as I can, in a thoughtful and methodical way. The ideas will sort themselves.

Saturday, April 7, 2007

What is a voxel? it's like a 3 dimensional pixel. It is short for "VOlume piXEL". It's a very simple concept which has been used in countless applications, from medical imagery to videogames. The basic idea is a 3D raster, each element of which stores attributes such as color, transparency, density, normal, and countless other possible things, or subsets of these. The classic Demoscene demo is the voxel landscape. (not true voxels, but possibly an impressive demo nonetheless).

I have been obsessed with voxels. Why? I think there is one application of voxels which has been underserved: 2D style games. Rapid development of Pixel art. Imagine the standard 16 bit games with multiplane parallax backgrounds. Now imagine them with many more contiguous planes, 3 dimensional objects in the background smoothly passing by in perfect perspective. Not flattened cardboard 2D paintings, but fully 3D props rendered with a 1voxel=1 pixel style engine. Most voxel rendering engines I see make the grim mistake of rendering a voxel with many pixels, creating an ugly pixelated look. Imagine 3D worlds with the tidy detail which is given to 2d pixel art. You can get a taste of it at the metroid cubed site here http://pages.infinit.net/voxel/home.htm

I get excited at the potential of this guy's work, but saddened to see it wasted in cheesy 8-bit style graphics, and reliving old games, and old gameplay models.

Like many, I have been dissappointed in the graphic quality of games since the playstation arrived. 3D graphics in videogames are consistantly ugly as sin. Their bicubic scaled textures filling the screen with vomited blurs of pixels.

I want a 1pixel=1voxel world. A 1pixel=1voxel oriented graphics editor. A 1pixel=1voxel oriented game engine which combines the flexibility of 3D with the exquisite detail and lush beauty of 2D pixel art graphics.

1. The Basics.Each voxel can store a color, and an opacity. Most of the time, opacity is a simple on/off switch. Either it exists or it doesn't. It can be full alpha, which significantly slows down the rendering of the voxels. The result is a smooth density cloud- this is what makes voxels useful for medical imaging. Newer game engines are using voxels for more realistic clouds and smoke effects.

2. Normals. what is a normal? In 3d graphics parlance, a normal is a point in 3D space which is the terminal of a line that is perpendicular to the angle of the surface at a specific point on a surface. In other words, the surface normal defines what direction a surface is facing. One can determine how well lit a surface is by measuring the angle between the light source, the surface, and the normal. This is a very simple cross product, then arc tangent operation.

With voxels, each voxel can have its own surface normal. Many voxel engines determine the surface normal automatically based on a voxel's neighbors. This produces a very legoish appearance to your voxel models. It is possible to smooth this out by taking into account more neighbors. I think a better idea, is to model first in a standard 3d modeller, then remember the normal of a surface when converting from the standard model to your voxels.

Thus, a voxel model can be more than just a flat colored grid of 3d pixels, but dynamic per voxel shading is possible, with very smooth appearance to the surface.

Some other very handy things can be done with normals though. You can find the contours of a voxel model, and use them to add cel shading style lines. Here's how it works: Simply give your voxel model a shell of invisible voxels, just a 1 voxel thick coating. Then, render the shell voxels if their normals are parallel or near parallel to the camera. This is a common technique in polygonal cel shading. This is an application of the same principal at a pixel level of precision. Essentially what this does is render a pixel next to any "surface" which is perpendicular to the camera. This will be the object's contours, what we normally perceive as its edges.

The beauty of this is that the exact shape of the shell can be tweaked and modified to exactly how you need it to look, at a pixel level. What's more, this can do more than just outlines. Pixels which only render when their normals are pointing a certain direction away or towards the camera, can be used for view specific pixel level tweaks. Is one view particularly awkward? just tweak it a bit. This is the same basic principle as hints in vector fonts.

3. Simulations.Since every atomic element of the object is defined as a point, this opens the door for a vast variety of particle simulations. Particles in simulations can be made to behave like liquid, smoke, jelly, springs, strings, cloths, solar systems, bouncyballs, pendulums, rag dolls, etc. Voxel positions can be attached to particles in a simulation, allowing characters and objects to realistically bounce, flow, explode, melt, stretch, fall down, trees grown, geological simulations producing realistic voxel landscapes. The possibilities are endless.

4. Sprites.Remember the opening title screen for Yoshi's Island? It's basically a 3d island composed of a number of 2D graphics attached at some point on their base to a 3d plane. The plane rotates around carrying the graphics with them, creating the impression of a 3d island while keeping the cartoony detailed appearance that only dot graphics can achieve. If I create my voxel paint program, I want this effect to be achievable as any other voxel effect, and combinable with any amount of voxel graphics. Just attach a 2d graphic to a voxel, and the 3d calculations take care of themselves.

5. Isometric.One comprimise that I don't think any pixel art purist will object to, is that I intend that my ideal voxel rendering engine not apply perspective to its voxels. the scaling of the voxel has the potential to destroy the 1pixel=1voxel idea. At the very least, a perspective engine should not scale a voxel any larger than a pixel.

6. Sub Surface ScatteringThis is a popular effect in computer graphics for simulating the appearance of skin. In order for it to be realistic though, an object needs to have an interior. For humans, the interior must be red and meaty. In a voxel object, the interior is already there.

How will I make this all work? what programming language shall I use? What sort of game will I make?I haven't decided yet. Maybe flash. Maybe java. Maybe SDL and C. Maybe all of the above? Perhaps anyone who happens to read this has an opinion? Who knows.

Okay so I have a blog now. perhaps unlike the thousands of other people who also have blogs, I don't expect anyone to read this. (But if you are reading this, I'm deeply sorry.) Why did I start this blog? Because I have too many ideas in my head to keep track of. I don't have enough time to implement all of them, but I also don't want my ideas to pass silently into oblivion either. I have tried windows notepad files. I've tried mac stickies. I've tried livejournaling. I've tried physical notebooks, and the running thread is that I have too many systems for recording ideas, and my head is busting at the seams.

Who am I? Who is anyone? How is a person defined? Is a person the sum of their experiences? Is a person the resume of things they have accomplished, the list of jobs they've held? Is a person a composite of the thoughts and opinions they hold? Is it the unique matrix which defines how a person responds to perceptual events, their personality? I am barely a person by any of these standards, but I exist anyway, so I may as well make the best of it, until I die or something kills me. I am just a person who has ideas.