onTriplePanMove method
void
onTriplePanMove(
- dynamic event
Implementation
void onTriplePanMove(event) {
if (enabled && enableZoom) {
// fov / 2
// |\
// | \
// | \
// x | \
// | \
// | \
// | _ _ _\
// y
//final center = event.center;
num clientX = 0;
num clientY = 0;
final nFingers = _touchCurrent.length;
for (int i = 0; i < nFingers; i++) {
clientX += _touchCurrent[i].clientX;
clientY += _touchCurrent[i].clientY;
}
setCenter(clientX / nFingers, clientY / nFingers);
const screenNotches = 8; //how many wheel notches corresponds to a full screen pan
_currentCursorPosition.setY(
getCursorNDC(_center.x, _center.y).y * 0.5);
final movement =
_currentCursorPosition.y - _startCursorPosition.y;
double size = 1;
if (movement < 0) {
size = 1 / (math.pow(scaleFactor, -movement * screenNotches));
}
else if (movement > 0) {
size = math.pow(scaleFactor, movement * screenNotches).toDouble();
}
_v3_1.setFromMatrixPosition(_cameraMatrixState);
final x = _v3_1.distanceTo(_gizmos.position);
double xNew = x /size; //distance between camera and gizmos if scale(size, scalepoint) would be performed
//check min and max distance
xNew = MathUtils.clamp(xNew, minDistance, maxDistance);
final y = x * math.tan(MathUtils.deg2rad * _fovState * 0.5);
//calculate fov
double newFov = MathUtils.rad2deg * (math.atan(y / xNew) * 2);
//check min and max fov
newFov = MathUtils.clamp(newFov, minFov, maxFov);
final newDistance = y / math.tan(MathUtils.deg2rad * (newFov / 2));
size = x / newDistance;
_v3_2.setFromMatrixPosition(_gizmoMatrixState);
setFov(newFov);
applyTransformMatrix(scale(size, _v3_2, false));
//adjusting distance
_offset
.setFrom(_gizmos.position)
.sub(camera.position)
.normalize()
.scale(newDistance / x);
_m4_1.makeTranslation(_offset.x, _offset.y, _offset.z);
dispatchEvent(_changeEvent);
}
}