Stereoscopic 3D demo w/ tracking

I finished my first version of a stereoscopic 3D rendering technique that I can use for my interactive installations. My technique uses Kinect tracking to adjust the 3D image based on the real-world position of the viewing person. This allows for a richer interactive 3D experience.

You can view this specific demo video without any special red/blue glasses. You only need to:

  • View it fullscreen
  • View it in HD
  • Cross your eyes to view a merged image in the middle
  • Adjust your viewing distance somewhere between 0.75 – 1.5 meters. The optimal distance depends on the physical width of your monitor and the space between your eyes.

Codemotion Berlin 2013 Speaker

I have been selected as a speaker for this year’s Codemotion Berlin 2013. My talk is Interaction and OpenGL 3D graphics using Microsoft Kinect and Cycling ’74 Max. A 25% discount is available by buying your ticket with this link.

Codemotion Berlin 2013During this university style interactive session, you will learn easy methods for connecting to the Microsoft Kinect 3D depth sensor using patching tools like Cycling ’74 Max. After briefly learning the basics, you will see how two streams of data from the Kinect can be manipulated easily using Max and displayed in an interactive OpenGL 3D graphics environment.

You will leave the session with access to the slides and patches slides and code examples from which you can learn and reuse. Prior knowledge of the Kinect, Max, or OpenGL graphics is not required. Questions from you, the participants, are encouraged.

Slides and Patches

Kinect physics in Max with OpenGL graphicsThe slides and patches are available for download. The patches in this ZIP file require the dp.kinect external which provides the connection between Max and the Microsoft Kinect. For those on the Mac OS X platform, these patches also work by using the jit.openni external.

dp.kinect (Max external for Microsoft Kinect)

Dale Phurrough will soon release the dp.kinect external which can be used within the Cycling ’74 Max development environment. Watch for details.

  • It is based on the Microsoft Kinect SDK v1.5.
  • It supports multiple Kinects on the same PC.
  • It was developed and tested against Max 6.0.5. It is untested against earlier versions.
  • It is almost 100% backwards compatible with my OpenNI based external for the Kinect called jit.openni. Migrating to this object should be very easy.


dp.kinect is free for evaluation and non-commercial use. For all other uses, including commercial applications, you need to arrange for a license.

I do support creative endeavors and artists. I am an artist myself. As such, I believe that artists should be compensated for their work. No starving artists! When an artist builds on the work of another, I believe that one artist should recognize the other. That recognition can come in many forms (e.g. attribution, compensation, or a beer). The license is simply the means to formalize that recognition in a durable way.

Here are examples which will likely be granted a no or low-cost license::

  • Installation artist creating a work for a gallery installation
  • VJ performing in a local club

Here are examples which will require a paid license:

  • Bundled as part of a software solution sold to multiple customers
  • Used in the touring show of a performer, band, or DJ

Pull-ups, Stichsägen, and Mental Gymnastics

Going to the gym is not fun for me. Every push, pull, and rotate is drudgery. Thankfully, I tend to be on the lean side; fat isn’t a concern. I want to increase my muscle mass for playing games and for my long-term health. For me to do this, I am more successful when it happens as a by-product of daily activities or games. Ten years ago, I had a pull-up bar in the door frame of my office at Microsoft. Almost every time I passed through the door, I would do a pull up. People visiting me in my office, or passing by, would do the same. It worked and I got stronger until I moved offices. The new office building had lower and metal door frames; I couldn’t install the bar.

Segway to my new flat. It has a 140cm x 275cm opening between two rooms. This is perfect for a generous pull-up bar. I searched online for a pre-made pull-up bar after learning the word for it is Klimmzugstange.

  • “Klimm” is from “klimmen” which means to clamber or scramble on.
  • “Zug” is a train. Often the word shows up as part of other German words like “Aufzug” (elevator) and another form of it appears in “Flugzeug” (airplane). For me, the word “zug” tends to mean a thing that provides conveyance.
  • “Stange” is a rod, bar, or pole.
  • Therefore, a literal translation would be: a clamber-on conveyance rod. Awesome!
  • And a bonus: “geistige Klimmzüge” can be used to convey “mental gymnastics”; like saying, “My physics class is nothing but geistige Klimmzüge.”

I discovered that longest pre-made bars are 1m. No good and no problem. I have power tools…I can make one. I used 17mm plywood (Sperrholz), 1-1/4″ steel pipe (strangely the pipe standard is in inches in Deutschland), 8mm lag bolts, Dübels, and glue. Kleber is the word for glue and I remember it by…it clings (sounds like Kle-) things together. I also had to buy a new wood/electricity finder; mine died. Total cost is now over 100€, but I get to build and use power tools. Grunt…grunt.

I cut the plywood into four pieces and glued them together in pairs to make it 3.5cm thick. Used my jigsaw (Stichsäge) to cut out three curved slots for the pipe in the plywood; impact drill for the bolt holes in the plywood and placing the Dübels in the wall; hacksaw to cut the pipe; and a metal file to smooth the pipes edges.

  • Stich is German for “stitch”, it is missing only the t.
  • Säge is saw.
  • Which makes the perfect word “Stichsäge” for a jigsaw because the jigsaw’s blade goes quickly up and down just like the needle on a sewing machine making a stitch. More awesomeness! And sadness…I miss my Singer sewing machine; it was 120v.

Success? Yes. I have used my new Klimmzugstange many times today as I walk through the corridor. It can hold two people at the same time in width and weight. And, I can adjust the height of the bar to three locations; the highest allows me to hang without my toes touching the floor. No cheating!

Joined Berlin Bruisers – Germany’s first gay rugby club

Rugby. It seems that I have joined the Berlin Bruisers; Germany’s first gay rugby club. We had the club’s first meetup last night. Yes, we are creating the club from the start. Join us!

Being in a rugby club excites and surprises me both. I’m excited to play a challenging game with a bunch of soon to be friends. I’m surprised in myself to be taking up a new aggressively athletic sport at 42. But like my wise Aunt said, “Do it while you’re young. ‘Cuz when you old, you’re tired and hurt.” My friend Trinity (a natural athlete, coach of several sports, and DJ) told me I shall learn to love the burn. I’m going to remember that and repeat it over and over while having fun on the pitch.

You will see the Berlin Bruisers out-and-about Berlin soon. Really soon. Like CSD on 23 June soon. We’re marching in the parade…im Straßenumzug. I love that word…Straßenumzug. It crudely translates as “a move occurring on the street”. Not to be confused with Straßeumzug which might mean the street itself is packing and moving; as if the stones and pavement would change towns. But no…we will be marching im Straßenumzug. The “n” is very important.

Cheese and Suffixes

I’m looking at the sticker on a round of goat’s milk Camembert cheese. It has a diagram to show how the cheese ripens, how long it takes, and how it will taste. Its rather exact, down the the specific week. The expiration date on the cheese is 2 June 2012 which is 1.5 weeks in the future. According to the diagram, the cheese should be matured so that the core is small and it has an aromatic and creamy taste. And yes…the cheese is very close to exactly that.

As I continue to learn to read and speak Deutsch (German), I find some things grab my attention. I was sitting in a cafe yesterday with a friend and we joke and spoke about suffixes in Deutsch. I was talking about -keit (as in möglichkeit) and she about -mäßig. After reading a bit more and she sending me some other advice, I noticed on this cheese sticker the large use of suffixes and combo-suffixes: quarkig, cremig, Cremigkeit, haltbarkeit, and aromatisch. That last word is pronounced as if it ended with -ig (the -ig and -isch sound very similar in Berlin’s dialect).

Now reflecting back on the conversation between me and my friend, could I say “Rhabarberig” meaning the quality of Rhabarber (rhubarb)? Or “Rhabarberkeit” meaning the state of having/being Rhabarber?

“Just yesterday, I was filled with the spirit of Rhabarberkeit.”
“Yes, that salad was very rhabarberig.”

I have always had fun playing with English language; warping words and creating new ones to suit a particular situation or feeling. As I learn more Deutsch, I can see that I am starting to play with the words in a crude way. But, its this verboten? I might be tempted even more for the verboten…keit.

jit.openni (Max and Jitter for OpenNI access to your Kinect)

I have written a rich Max Jitter external called jit.openni which allows usage of sensors like the Microsoft Kinect and ASUS X-tion PRO in your patchers. It exposes almost all the functionality from sensors like the Kinect in an easy to use native Max Jitter external for Windows computers. It has support for:

  • Configuration of OpenNI by an OpenNI XML configuration file; see OpenNI documentation for format (an example is provided in the install)
  • ImageMap of RGB24 output in a 4-plane char jitter matrix
  • DepthMap output in a 1-plan long, float32, or float64 jitter matrix
  • IrMap output in a 1-plan long, float32, or float64 jitter matrix
  • UserPixelMap output in a 1-plan long, float32, or float64 jitter matrix
  • User events (e.g. user seen, user lost, etc.)
  • Center of mass for identified users
  • Floor identification
  • Skeleton joints with optional orientations
  • User events, center of mass, and skeleton joints in an native OSC format, max route friendly format, OSCeleton legacy format (as of 2011-07-25 OSCeleton codebase)
  • Attributes to filtering data based on position or orientation confidence, display or not the orientation data, and smooth skeleton data using OpenNI’s smoothing API
  • Camera field of view
The main page for jit.openni is here. Full wiki documentation and installation instructions are available on GitHub. Or jump straight to the downloads.