Author Archives: Ryan Lane

Blogging with Siri is easy

Siri makes it possible for me to blog now, simply by talking into my phone. It’s pretty revolutionary to think about how easy it is to speak into my phone and have the text be written on to the page. In fact to this very posts I have “written” using Siri on my phone I no longer need anything fancier than this.

So I believe this could very well be the future of writing. The end of the keyboard and mouse is near. Hopefully all of these services will work a lot better, like the Microsoft Kinect, and other integrated for services from Nuance or TellMe.

Universal VESA Mounting adapter

I really like my multitouch Dell SX2210T monitor . I have also used one by HP and 3M. The Dell was the best price point for my home use. One problem it has though is that it doesn’t work with a standard VESA mounting configuration; Dell does not offer any sort of adapter. So I did what any sensible person would do. I went ahead and designed my own. I’ve been looking for a good reason to use Ponoko , which is an amazing fabrication service, and this fit perfectly.

If you want you can purchase my VESA universal mounting adapter plate from Ponoko

IMG_3778

The above bolt pattern is something like 35mm from center to center of each one. Which is a bit smaller than the smallest 50mm VESA standard.

IMG_3851

I searched all around for a universal plate that would do the trick and I couldn’t fine a single option out there, that would do what I wanted. A few people online suggested drilling holes in a standard VESA plate, which is an okay option but that would leave me with something that was modified specifically for this monitor. I thought it might be better to have something that was slotted so that it could work with a larger range of setups.

BackPanel

Here is a photo of the plate mounted to the monitor and the VESA mounting plate mounted to my adapter.

The whole thing works great for me.

Gigaplane Explorer for the Boeing 737

Handsome group of people involved in this:

One of the most fun projects I’ve worked on in a while and you can see it here Boeing Next-Generation 737 airplane

programming and designing in the browser

I remember a talk we had back in the early nineties, while I was working at Spry / Internet in a Box, the idea had come up of creating an OS that was entirely based on a browser. At the time the browser was NCSA Mosaic for use and an early beta of Netscape Navigator for the competition.  So to say it was too early to talk about is a bit of an understatement. However, it really felt the next logical step. Creating applications and services that ran entirely in the browser would have been crazy hard then with the limitations of  HTML. We didn’t have JavaScript or CSS yet. Everything we built was done as server side code. CGI applications written in either C/C++ or Perl. My weapon of choice became Perl and SQL for all my programming needs. With everything happening on the server you were a little limited with what you could do. Oh and most users were using a 56k dial up modem to get online.

Fast forward to today and a web application developer has a huge and amazing toolbox at their disposal. Rails, ASP.NET, Python, PHP, Flash, Silverlight, JavaScript, HTML5, CSS, Web Services like JSON, and on and on. Thanks to all the hard word and loads of talented people the limits are no longer the technology or access speeds. The limits now are only our creativity. Now we have geolocation, video, animations, and sound.

The only limit that we’ve had up until recently was that if you wanted to create interactive content you needed a client application running on your local machine. To create Flash you needed to purchase, install and use the editing tools locally. Which brings me to the point of this post. I only recently found out about a new crop of web based IDEs (Integrated Development Environment). In no particular order.

Coderun

CodeRun Online IDE

You can create and edit .Net , Silverlight and many other types of projects. This is the best damn thing ever. I hope someone at Microsoft buys these guys.

Cloud 9

Cloude 9 IDE example

All your stand website editing power with Git and Mercurial integration. Paid accounts offer many must have features but the free version can get you up and running quickly.

Akshell

use this to create your web apps in JavaScript. Plain and simple just the way it should be.

jsFiddle

jsFiddle example

It’s not a full fledged IDE, but it is a great way to start learning, creating and sharing JavaScript snippets. Fantastic way to explore and experience in realtime how the code works.

Now for the design side of things

It’s not nearly as new but the design side has been very well covered too.

Photoshop.com

The current leader in desktop design has an excellent head start on the web with their Photoshop.com service

 

Aviary

Aviary is quickly becoming a designers hub online. What started as a Photoshop lite application for minor photo tweaks has quickly evolved in to one of the best collections of creative applications that run in the browser.


Picnik

My personal favorite web based photo editing tool. I became hooked on Picnik thanks to its early Flickr integration that made it so easy to jump right in and edit my photos already on Flickr.


Kinect SDK documentation in ePub

Programming Guide Kinect SDK ePub

Right now the documentations is only available in a lovely Word format. I wanted to read it on my iPad so I went ahead and converted the Kinect SDK in ePub format. Should work on a Nook too.

Go get the Kinect SDK. To be sure you’re getting the latest and greatest here’s the official Kinect SDK documentation.

MVVM – Model Notification with Events

I ran in to an issue using custom complex classes in my model, that wouldn’t notify the View Model that something had changed. I didn’t like the idea of building everything as a one to one relationship between my View, View Model and Model just to get the UI to stay current. I prefer instead to create a single item, that is a collection or unit of my complex class.

here’s an example of the simple item model and it’s more complex element.

Model for SimpleItem

public class SimpleItem
        {
            private static FancyItem _item = new FancyItem();
            public static FancyItem Item
            {
                get { return _item; }
                set { _item = value; }
            }
        }

Model for FancyItem

 

public class FancyItem
       {
           private int _index = 0;
           public int Index
           {
               get { return _index; }
               set { _index = value; }
           } 

           private string _name = string.Empty;
           public string Name
           {
               get { return _name; }
               set { _name = value; }
           } 

           private string _label = string.Empty;
           public string Label
           {
               get { return _label; }
               set { _label = value; }
           } 

           private DateTime _date = new DateTime();
           public DateTime Label
           {
               get { return _date; }
               set { _date = value; }
           }
       }

 

Then my ViewModel is something like this:

public FancyItem myFancyItem
        {
            set
            {
                if (SimpleItem.Item != value)
                {
                    SimpleItem.Item = value;
                    InvokePropertyChanged("MyFancyItem");
                }
            }
            get { return SimpleItem.Item; }
        }

Then if my binding is something like this:

<TextBox Text="{Binding myFancyItem.Name, Mode=TwoWay}">

My PropertyChanged will never get called since I’m targeting down to the Name item. If I had an element that was directly exposing the Name string in the ViewModel then everything would work just fine. However, then I would have to duplicate all those lines of code for each variable that I want to expose and modify.

This is where my ModelBase event notification comes in to play.

public class ModelBase
        {
            public void ModelPropertyChanged(string p, EventHandler ModelItemUpdated)
            {
                ModelItemUpdated(p, EventArgs.Empty);
            }
        }

The idea with the ModelBase event, is pretty much the same as the View Model PropertyChangedEventHandler. The only challenge I’ve run in to is having to remember to feed it all the way of the food chain.

So here’s how I use it all together:

First I add some events to the parts that can be changed.

public class FancyItem : ModelBase
        {
            public static event EventHandler FancyItemUpdated = delegate { };

            private int _index = 0;
            public int Index
            {
                get { return _index; }
                set
                {
                    _index = value;
                }
            } 

            private string _name = string.Empty;
            public string Name
            {
                get { return _name; }
                set
                {
                    _name = value;
                    ModelPropertyChanged("Name", FancyItemUpdated);
                }
            } 

            private string _label = string.Empty;
            public string Label
            {
                get { return _label; }
                set { _label = value; }
            } 

            private DateTime _date = new DateTime();
            public DateTime Date
            {
                get { return _date; }
                set
                {
                    _date = value;
                    ModelPropertyChanged("Date", FancyItemUpdated);
                }
            }
        }

Then I add a listener to my simple model that fires off it’s own update event when something changes in the fancy model event it’s subscribed to.

public class SimpleItem : ModelBase
        {
            public static event EventHandler SimpleItemUpdated = delegate { };

            public SimpleItem()
            {
                FancyItem.FancyItemUpdated +=new EventHandler(FancyItem_FancyItemUpdated);
            }

            void  FancyItem_FancyItemUpdated(object sender, EventArgs e)
            {
                 ModelPropertyChanged("updated", SimpleItemUpdated);
            }            

            private static FancyItem _item = new FancyItem();
            public static FancyItem Item
            {
                get { return _item; }
                set { _item = value; }
            }
        }

Then on the ViewModel, it subscribes to the SimpleItem model event and then notifies the PropertyChanged event.

public class SimpleViewModel : ViewModelBase
   {
       public static readonly AudioViewModel Instance = new AudioViewModel();
       public SimpleViewModel()
       {
           // to subscribe to the event in the model we need to call the contstructor
           SimpleItem mySimpleItem = new SimpleItem();
           SimpleItem.SimpleItemUpdated +=new EventHandler(SimpleItem_SimpleItemUpdated);
       }

       void  SimpleItem_SimpleItemUpdated(object sender, EventArgs e)
       {
            InvokePropertyChanged("MyFancyItem");
       }

       public FancyItem myFancyItem
       {
           set
           {
               if (SimpleItem.Item != value)
               {
                   SimpleItem.Item = value;
                   InvokePropertyChanged("MyFancyItem");
               }
           }
           get { return SimpleItem.Item; }
       }
   }

It’s all a little crazy I know, but the idea here helps to extract the ViewModel from the underlying model even a step further.  Then If I need to store and retrieve my model data from isolated storage or some other external location it’s just one item that I have to get and set from as apposed to each little part.

The best part is that my UI is always up to date.

Vision of the future of 3D printing

FULL PRINTED from nueve ojos on Vimeo.

Cortometraje de animación para la exposición “Laboratori de Fabricació” en el museo Disseny HUB Barcelona.

Junio 2010

Disseny Hub Barcelona
Duración: 4’
Formato: HD 720
Dirección: Carles Mora y Mariona Omedes
Postproducción: Carles Mora, Mariona Omedes, Karin du Croo, Jordi Ferrera y Josep Mª Balada
Música: Micka Luna

Kinect, Maxscript and C#


Kinect, Maxscript and C# – 04 from ruben henares on Vimeo.

I have improved the framerate quite a lot since last time. It is almost ready to be used for production. At the moment I am grabbing the positions of the joints, next step is to grab the rotations and apply the tracking data to a skinned character. Stay tuned!

Nicely done!

Kinect controlled drone at MIX11

Guide to Air Gesture

Since I can’t seem to find a generic term for the body tracking motions of the Kinect, I wanted to come up with my own set of basic gestures and their names. For now I’m calling these air gestures.  Others have offered the name motion sensing or even just computer vision. These are just some of my rough ideas.

Hand Gestures:

Hold

This is a simple gesture that involves holding one hand in a location for specific period of time. This could be used to select an item or change a mode of the UI.

Double Hold

With this gesture it’s pretty much the same as hold, except that it would involve two hands. This gesture is currently used in the calibration pose, but could also be used to enable a double click like selection or advanced interface mode switching.

Push

The push gesture is the closest one to a mouse click or touch available to a user.  The push gesture involves a user moving a hand forward rapidly.  The amount of distance the hand moves and over how much time could be set my the application.  Different amounts of pushes could result in different experience.  Let’s use Google maps as an example a slow forward push gesture could be handled a zoom out. While a slow pull back could be a zoom in.  Then a quick push could select an item in the UI.  Double push could back out.

Pull

The pull gesture is just like the push only in reverse. A quick retraction of the hand could be used for “back” behavior in an UI. The challenge with push and pull is that they could easily interfere with each other and there is also a high chance of false positives.  That being said with the proper tweaking of the gesture detection code I think this could be smoothed out.

Swipe (up, down, left, right)

The swipe gesture is the tracking of a hand movement quickly in one direction. Moving a hand up rapidly or down rapidly could be used to scroll a list of information on a screen up or down.  The left or right swipe could used to either rotate a 3D object or navigate through linear pages of information.  The up and down gestures could also be used to zoom in and out of an interface.

Raise Hand

The gesture is the motion take a hand that is down and raising it up. This gesture could be used as a quick acknowledgment of a message. If the UI required the user to agree to something or accept a prompt. The raised hand has a positive feel to it.  Raising a hand could also be used to detect multiple users. The raised hand could identify which person the application should be addressing. Raising a hand could also be used to pause an active application and bring up help information.

Squeeze and Release

Not like the way Darth Vader crushes his enemies throats at a distance gesture, but instead this is a two handed gesture. It’s performed by either bringing two hands together, the squeeze, or by pulling two hands apart, the release.  The squeeze and release is air gesture equivalent to the pinch to zoom behavior of a multi-touch screen. The issue with this two handed gesture is that in order to repeatedly go in one direction you need to go in the other direction. This gesture could be controlled by having the hands located above or below a half way point to best determine which to process. The other option, could be to define it based on the speed of the motion. The gesture is active only if the hands move a specific distance over a specific time frame.

Hover

Slightly different from the hold gesture, the hover gesture is generated whenever a hand over a UI element on the screen. For a quick action interface a series of objects could be placed around the sides of the screen. As soon as the users hand enters that element an action is fired off. This would be useful for games or any thing that required a very quick interaction model.

Wave

Moving a hand back and forth quickly has been used to give that hand focus. It could also be used to switch between modes of an application experience.  I think the wave is also an interesting gesture to be used as an undo. Wave could also be used as a way to end a session. For example begin a user session by raising your hand. Then proceed to interact with an application and then wave goodbye when done.

Draw Shapes

Circle: Moving a hand to draw a circle in a clockwise or counterclockwise motion could be used to rotate an item on the screen or speed up slow down and item.

Triangle: The points drawn with a slight pause at each point could be used with a video player to skip ahead or backwards depending on clockwise or counter clockwise 30 seconds.

Arc: a partial circle which is a natural shape for a moving hand to draw could also work as a navigation metaphor within an application.

Air Gesture Phrases (Combinations)

I’m not going to spend a lot of time on this one right now, but the next step is to take combinations of any of the gestures above to create a form similar to that of something like sign language. These gesture phrases could be strung together to accomplish complex user tasks.  Here’s an example: raise hand + hover over a word (selects text) + swipe left or right to select a larger range of text, then squeeze to copy. Move the hand over another portion of the text, hover until selected then release gesture to paste.

 

Next I’ll spend some time on whole body tracking.