I played a bit with hammer.js to have a better touch control. I don't have time right now to implement it in the good way, but if you are motivated.
Here a piece of code, I hope it will help you. You should have your manipulator defined like this:
if (isMobile.any()) {
var computeTouches = function(ev) {
if (ev.originalEvent.changedTouches !== undefined)
return ev.originalEvent.changedTouches.length;
return 1; // mouse
};
var dragCB = function(ev) {
return "touches " + computeTouches(ev) + " distance " + ev.distance + " x " + ev.distanceX + " y " + ev.distanceY;
};
hammer.ondragstart = function(ev) {
if (computeTouches(ev) === 2) {
padMode = true;
}
if (padMode) {
manipulator.getPanInput().reset();
manipulator.getPanInput().set(ev.position.x*panFactorX, ev.position.y*panFactorY);
} else {
manipulator.getRotateInput().reset();
manipulator.getRotateInput().set(ev.position.x*rotateFactorX, ev.position.y*rotateFactorY);
}
};
hammer.ondrag = function(ev) {
if (padMode) {
manipulator.getPanInput().setTarget(ev.position.x*panFactorX, ev.position.y*panFactorY);
} else {
manipulator.getRotateInput().setTarget(ev.position.x*rotateFactorX, ev.position.y*rotateFactorY);
}
};
hammer.ondragend = function(ev) {
padMode = false;
};
var toucheScale = undefined;
hammer.ontransformstart = function(ev) {
toucheScale = ev.scale;
var scale = ev.scale;
manipulator.getZoomInput().reset();
manipulator.getZoomInput().set(ev.scale);
};
hammer.ontransformend = function(ev) {
};
hammer.ontransform = function(ev) {
var scale = (ev.scale - toucheScale)*zoomFactor;
toucheScale = ev.scale;
var target = manipulator.getZoomInput().getTarget()[0];
manipulator.getZoomInput().setTarget(target-scale);
};
}