direct manipulation

I've created a small demo of direct multitouch object manipulation because I hadn't figured out hammer.js at first. Well, at least now I know how this is done. Correct implementations keep the object points you have "grabbed" always under your fingers. For example, when only one finger moves in circle around another, the object rotates around the "grabbed" point.

The trick is when your fingers move to the new coordinates you should calculate such a transformation for the object, that will move the "grabbed" points to these coordinates. You could try doing that with CSS transform operators translate, scale and rotate, but calculating these would be trickier. A more reliable approach is to use matrix, though you can't avoid calculations. To my surprise I couldn't find complete formulas online, so I had to recall linear algebra, matrix calculus and solving systems of linear equations. So when you have new coordinates S1 and S2, here is how you derive the matrix to move points I1 and I2 there:

var a = ((S1.x - S2.x) * (I1.x - I2.x) + (S1.y - S2.y) * (I1.y - I2.y)) / 
  (Math.pow(I1.y - I2.y, 2) + Math.pow(I1.x - I2.x, 2));
var c = ((S1.y - S2.y) - a * (I1.y - I2.y)) / (I1.x - I2.x);
var tx = S1.x - a * I1.x + c * I1.y;
var ty = S1.y - c * I1.x - a * I1.y;

return new Matrix([
    [a, -c, tx],
    [c,  a, ty],
    [0,  0,  1]
]);

The rest of it is simple: save the "grabbed" point on the first touch, when touches move calculate the new matrix and set it to object's style.

Артемий Трегубенко,
, ,

comments powered by Disqus