Watershed du jour – 3D coming of age

While software and hardware have made great strides, some things still remain in the realm of specialized software. One way to look at this is, what can you still not do on the web? I can think of a few things: 3D, sound synthesis, video editing. I have hopes for all of these, but 3D in particular looks to be on the edge of a real breakthrough, and not necessarily from where I expected it.

For years I have been tracking X3D, the XML-based 3D specification that is the successor to VRML. I’ve been watching and working with the open-source FreeWRL tool, and it has been making good progress. However, the Age of Plugins appears to be on the decline. If it isn’t built-in to the browser (or ubiquitous, like Flash, and I have doubts about the long-term viability of Flash), there is little chance of getting viewers to install a plugin for your media format. That’s why I’m excited to see that Firefox is experimenting with a 3D context for the <canvas/> element, which will base its API on OpenGL ES, and significantly will support import of Collada models (presumably Collada Digital Asset Exchange, or .dae files).

But Firefox alone does not make a viable ecosystem. The other things I have come across recently that have convinced me that Collada models are going to springboard 3D into the hands of ordinary users are that Spore patch 5 (available now for PC, coming soon for Mac) supports exporting creatures (with textures and ready for animation) in Collada format, so you can work with them in the 3D tool of your choice, and that the next major release of Mac OS X, Snow Leopard, will support Collada as a built-in file type (scroll down to “Digital Asset Exchange support”). Collada has kept pretty quiet, at least in my world, but the support for it is pretty widespread, including open-source tools such as Blender and OGRE, plus all the usual suspects such as Maya and 3dsMax. Sadly, my editor of choice, Cheetah3D does not yet support it, but I understand they’re working on it.

I, for one, welcome our new 3D asset exchange overlords. Along with improved user creation tools like Spore, SecondLife, and SketchUp, 3D is almost ready for prime time.

Great works of art in social media

image_28_cropped.jpg

At Northern Voice, Darren Barefoot is asking why there is so little profound art on the web, but I think there is so much profound art that I cannot keep up with it. Perhaps it is because we have different filters for what is profound, but here are some sites that I frequently find art that speaks to me.

Dresden Codec: Dungeons and Discourse
http://dresdencodak.com/cartoons/dc_031.htm
http://dresdencodak.com/cartoons/dc_059.html

Industrial Decay
http://industrialdecay.blogspot.com/

NASA Astronomy Picture of the Day
http://apod.nasa.gov/apod/astropix.html

Algorithmic Art
Nodebox: http://nodebox.net/code/index.php/Gallery
Structure Synth: http://flickr.com/groups/structuresynth/
Processing: http://processing.org/exhibition/index.html

GapMinder (profound statistics)
http://www.gapminder.org/

Afrigadget
http://www.afrigadget.com/

Film is not dead, it just smells funny
http://www.thiaps.com/

BLDBLOG
http://bldgblog.blogspot.com/

We Make Money Not Art
http://www.we-make-money-not-art.com/

While I cannot keep up with all the art that I come across, I can find a social connection between all of these. The best, most moving art doesn’t just inspire me to admire it or think about it, but to share it with my friends and to create art that I wouldn’t have created otherwise.

in earth dreams

This is a collaboration that Daniela and I did together. Her words and voice, my scripting and adding some titles. The words to the poem can be found on her site here (or actually, on any page of her site since it is currently in her sidebar). The animation itself was done in NodeBox (so this example is Mac-only, but it could probably be adapted easily to Processing.

from math import radians, sin, cos
from random import seed

POEM = '''
in earth dreams
her limbs 		are all sky
her body		inhabited
by wild birds		and busy
mammals
an endangered 		species
she lost		 her head
where reason 		gives
the impression 		everything is
clear
she motions 	to dance
a rhythm			spins
and turns		attracted
to light
if she had eyes 		I would see
the stars		she holds
dear
then 		there are 		all
the words		she escapes
slips past 		their curved
seashell ears	as they listen
to capture 		her
on the page		 my words
are already	changing her
while she weaves 	gossamer
and soft moss		to hang
in autumn 	woods
'''.split()

size(320,240)
speed(30)

class Vector(object):

    def __init__(self, idx):
        self._starting_angle = self.angle = radians(random(360))
        self.rate = random(0.5,2.5)
        self.distance = sin(radians(idx * 2) + 180) * 100
        self.x = 0
        self.y = 0

    def step(self):
       self.angle = self._starting_angle + FRAME * radians(self.rate)
       self.x = cos(self.angle) * self.distance
       self.y = sin(self.angle) * self.distance
       return self.rate, self.x, self.y

class Word(object):

    index = []

    def __init__(self, idx, word):
		self.red = random()
		self.green  = random(0.4, 0.75)
		self.blue = 0.4
		self.vector = Vector(idx)
		self.word = word
		self.size = 10 + 2 * len(word)
		self.duration = 3 * (len(word) + 2)
		Word.index += [idx] * self.duration

    def step(self, alpha=1.0):
		fill(self.red, self.green, self.blue, alpha)
		rate, x, y = self.vector.step()
		push()
		rotate(rate * FRAME)
		font('Georgia', self.size)
		text(self.word, x, y)
		pop()

def setup():
    global words
    seed(0)
    words = [Word(idx, word) for idx,word in enumerate(POEM)]

def draw():
    translate(WIDTH/2 -50,HEIGHT/2)
    background(1.0, 0.97, 0.86)
    # Add one word at a time, then show all words for 100 frames more
    if FRAME < len(Word.index):
        last = Word.index[FRAME]
        for word in words[:last]:
            word.step()
    # Now fade out and have blank screen for titles
    elif FRAME < len(Word.index) + 100:
        alpha = 1.0 - 0.01 * (FRAME - len(Word.index))
        for word in words:
            word.step(alpha)

I used iMovie '08 to mix the voice and animation and to add the titles. I wasn't very happy with the changes to iMovie, I found the earlier versions were much more flexible and easy to use. On the other hand, I tried Norrkross Movie, that I actually had to buy, and was unable to do it at all. Next time I will just add the titles in NodeBox and only use iMovie to add the soundtrack.

My Python script could probably be cleaned up too. This was what I had after many iterations and experiments to get the timing, color, and rotation where we were both happy with it.

This was my first time uploading to YouTube and the resulting movie is very jumpy, in the original movie I uploaded was not. If anyone has suggestions how to avoid that (whether pre-processing or a better movie hosting service), please let me know in the comments. Overall I was happy with how it turned out and I'm looking forward to our next collaboration.

Bar Camp: Aesthetic programming for kids of all ages




OK, Bar Camp was over a month ago and I'm finally getting around to posting my second set of slides. I've included notes right in the PDF this time, summarizing what I think I was talking about at the time.

Aesthetic Programming for kids of all ages (PDF)

The reason this took so long is that I wanted to illustrate the concepts I was exploring out loud by embedding a programming environment into this blog post. So, what you see above is a tiny turtle language for Javascript and some examples of how to use it. When you click the Run button, you should see the script run by having some drawing going on in the frame above it. I've used Google's excanvas, which hopefully will let it run in IE, but I haven't tested it much beyond Safari and have no idea if it will survive transliteration into Atom and beyond. Let me know if it doesn't work for you, or if you have ideas for how to improve it. I will be putting some more thought into these ideas soon.

BarCamp: Social Networking for Small Groups

OK, it’s been two weeks since I attended the local BarCamp and make two presentations, so it is way past time to blog it. This is my recollection and summary of the first one presentation.

First some context about where I was coming from with this.

I was recently “field-promoted” to manage my team at Kinzin. We’ve been going through a whole lot of changes all at once, and we’re coming up on a major new release that I’m pretty excited about. I’ve also been trying to think about what our key differentiator is, what sets us apart. I used this opportunity to start a discussion around some of the ideas I have been rolling around in my head about this.

My intent was to throw up a few slides to set some context and hopefully be provocative enough to stimulate a conversation. Both my talks were at the end of the day, so many people had left already, and the rest were tired. I outlined both presentations on the bus on the way to the BarCamp social the night before, and I’d put the slides together in a hurry during other people’s presentations (sorry!). So my goal here was just to get a good conversation going. I also brought a devil duck to pass around, so whoever had the duck had the floor.

Here are the slides:

Social Networking for Small Groups (PDF)

Commentary on the slides

After the preliminary slides telling who I am, I began by summarizing Clay Shirky’s thesis, A Group is its own Worst Enemy. I think this is key to how we are approaching social networking at Kinzin. It’s a good essay, and I think you all should read it. Go ahead, I’ll wait.

Then I briefly explained Dunbar’s Number, especially focussing on the idea that 150, which is usually thought of as the number of people you can interact with socially in a successful way (see the link for way better info, this is hard to summarize) is not a goal or an average, but a maximum, and that successful social groups tend to be composed of far fewer than 150 individuals. The actual numbers vary depending on the type of group and activity, but I lumped them all together as “around 30.”

Then I attempted to pull “Small is Beautiful” into it, because it’s a good book and a good phrase, but didn’t really get into Schumacher’s ideas or ideals. We all belong to many tribes is the idea that, while individual groups or “social networks” work best when they are small, we are all participating in many, many of these groups: Family (and subgroups of family), school, job, club, friends, sports team, etc.

“Some ideas” was where I hoped to provoke contradiction, or at least addition. The ideas I put out were: Casual collaboration (make it easy to start collaborations, including transient ones), privacy by default (we are growing used to putting all of our digital lives out in public, but there is still a place for privacy, and a great many people who are not comfortable living in public), lower the boundaries between the real and the virtual (make it easy to bring your stories, photos, etc. into the social network), and lower the boundaries between the virtual and the real (make it easy to turn your photos into prints, to send them to family by actual postal mail).

So we passed around the devil duck and I got a lot of good comments, which would be hopeless to summarize here, but I will try anyway. Since Daniela was there, she helped me to remember the discussion, but all errors are mine.

Several people spoke up with their stories of problems arising as groups got too big. One spoke of a site she and many others volunteered on, which the owner then shut them out of and treated these, his core supporters, as if they were any other users. I got two things from this: first, acknowledge your core users and treat them with respect, recognizing that they are special and worthy of special treatment, and second, if you are putting a lot of your time and effort into a site, and you feel some ownership of that site, either get that ownership explicitly in writing, or realize that the owner can change the site out from under you.

Censorship was discussed, both the need for it (your right to free speech means you can say whatever you want on your blog, but you don’t have the right to be offensive and hateful on my forum), and how to handle it without overly disgruntling the users of your site. One site had an interesting tactic, where they had a character on the site who enforced the rules, but any of the core users could “play” that character. Because there was no one person behind the facade, it was difficult for the users to place blame on any individual member, so the rules could get enforced, and any bad feelings over it were diffused. Getting users themselves to self-monitor was also brought up.

Thanks for the great discussion from everyone who attended.

One good question came up which I wish we’d gotten back to, and I will leave you with here. I suspect we could have spent the entire session (and more) discussing it, and I am sorry I left it hanging and got carried away with other points. Feel free to restart the discussion in the comments. The question, as well as I can remember, was “How can we positively scale down a large group?”

« Previous entries Next Page » Next Page »

google

google

asus