tecznotes

Michal Migurski's notebook, listening post, and soapbox. Subscribe to this blog. Check out the rest of my site as well.

Sep 23, 2007 8:53pm

gefingerpoken

One of the core gestures in a multi-touch interface is the two-finger deforming drag, a descendent of the traditional mouse-driven drag and drop. The difference is that with two points of contact, interface elements such as windows can be moved, stretched, and turned. See what this would look like in a real interface five seconds into the big-ass table video. Implementing two-finger drag turns out to be less-than-obvious, but I've put together a short demo (see also a larger version with source code) that shows how to do it easily.

Drag the fingers and pretend they're your own:

(Please install the Flash Player plugin)

There are two main difficulties: figuring out how precisely the two contacts should act on an object, and then translating those into the appropriate placement, sizing, and rotation of the object. We start with two rules: the object can be moved and turned, but not skewed, squashed, or otherwise deformed, and the fingers should stay in contact with the same points on the object throughout their movement.

Both troubles can be solved with the use of affine transformation matrices, the closest thing computer science has to a true, working hammer. I've described before how to derive a complete transformation from just three example points, so we need to figure out where to place a third point to complement the two fingers above. If we assume that the line between the two fingers is the hypotenuse of a right equilateral triangle, the we can guarantee a stable position for the invisible third finger by working out the two legs of the complete triangle. See it in action above when you drag.

Since version 8 or so, Flash has exposed proper matrix transformations on all clips in addition to the usual x, y, rotation, and scale. Unfortunately, the documentation leaves something to be desired, but it's possible to make Flash's Matrix class behave like it's supposed to by juggling a few of the arguments. After deriving a complete transformation from the movement of the two-finger triangle, we can apply it to the UI object and get something that moves properly.

Look out for two important functions in the source code:

  1. deriveThirdPoint() builds the triangle and adds a third ghost finger to the two physical ones.
  2. deformBox() applies the three fingers to repeatedly transform the photograph so that the fingers appear to be dragging it around the screen.

Comments

Sorry, no new comments on old posts.

September 2016
Su M Tu W Th F Sa
    
 

Recent Entries

  1. openstreetmap: robots, crisis, and craft mappers
  2. quoted in the news
  3. dockering address data
  4. blog all dog-eared pages: the best and the brightest
  5. five-minute geocoder for openaddresses
  6. notes on debian packaging for ubuntu
  7. guyana trip report
  8. openaddresses population comparison
  9. blog all oft-played tracks VII
  10. week 1,984: back to the map
  11. bike eleven: trek roadie
  12. code like you don’t have the time
  13. projecting elevation data
  14. the bike rack burrito n’ beer box
  15. a historical map for moving bodies, moving culture
  16. the other openstreetmap churches post
  17. platforminess, smartness, and meaningfulness
  18. writing a new continuous integration service for openaddresses
  19. state of the map 2015
  20. bike ten: schwinn touring, v2

Archives