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 5: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.

May 2013
Su M Tu W Th F Sa
   
 

Recent Entries

  1. week 1,851: week one
  2. tilestache 0.7% better
  3. south end of lake merritt construction
  4. network time machine backups
  5. week 1,846: ladders
  6. documentation for tiled vectors in mapnik
  7. the liberty of postgreslessness: tiled vectors in mapnik
  8. gl-solar, webGL rendering of OSM data
  9. webgl maps, stealth mountain edition
  10. one more (map of lake merritt)
  11. elephant-to-elephant: processing OSM data in hadoop
  12. beasts of the southern wild
  13. weeks 1,838/1,839: total protonic reversal
  14. week 1,837: typescripting
  15. week 1,836: back at shiny
  16. hands
  17. week 1,835: leaving stamen
  18. work in progress: green means go
  19. loading artifacts, google maps for iOS
  20. blog all oft-played tracks IV

Archives