diff --git a/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart b/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart index eae5040c..ba36fe27 100644 --- a/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart +++ b/thermion_dart/lib/src/input/src/implementations/free_flight_camera_delegate.dart @@ -20,7 +20,7 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { static final Vector3 _right = Vector3(1, 0, 0); Vector2 _queuedRotationDelta = Vector2.zero(); - Vector2 _queuedPanDelta = Vector2.zero(); + Vector3 _queuedTranslateDelta = Vector3.zero(); double _queuedZoomDelta = 0.0; Vector3 _queuedMoveDelta = Vector3.zero(); @@ -49,14 +49,16 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { _queuedRotationDelta += Vector2(delta.x, delta.y); break; case InputAction.TRANSLATE: - _queuedPanDelta += Vector2(delta.x, delta.y); - _queuedZoomDelta += delta.z; + _queuedTranslateDelta += delta; break; case InputAction.PICK: _queuedZoomDelta += delta.z; break; case InputAction.NONE: break; + case InputAction.ZOOM: + _queuedZoomDelta += delta.z; + break; } } @@ -71,7 +73,7 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { _executing = true; if (_queuedRotationDelta.length2 == 0.0 && - _queuedPanDelta.length2 == 0.0 && + _queuedTranslateDelta.length2 == 0.0 && _queuedZoomDelta == 0.0 && _queuedMoveDelta.length2 == 0.0) { _executing = false; @@ -79,9 +81,9 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { } final activeCamera = await viewer.getActiveCamera(); - Matrix4 currentViewMatrix = await activeCamera.getViewMatrix(); + Matrix4 currentTransform = await viewer.getLocalTransform(await entity); - Vector3 currentPosition = currentTransform.getTranslation(); + Quaternion currentRotation = Quaternion.fromRotation(currentTransform.getRotation()); @@ -92,10 +94,8 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { // Apply rotation if (_queuedRotationDelta.length2 > 0.0) { - double deltaX = - _queuedRotationDelta.x * rotationSensitivity; - double deltaY = - _queuedRotationDelta.y * rotationSensitivity; + double deltaX = _queuedRotationDelta.x * rotationSensitivity; + double deltaY = _queuedRotationDelta.y * rotationSensitivity; Quaternion yawRotation = Quaternion.axisAngle(_up, -deltaX); Quaternion pitchRotation = Quaternion.axisAngle(_right, -deltaY); @@ -105,15 +105,13 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { } // Apply pan - if (_queuedPanDelta.length2 > 0.0) { - Vector3 right = _right.clone()..applyQuaternion(currentRotation); - Vector3 up = _up.clone()..applyQuaternion(currentRotation); + if (_queuedTranslateDelta.length2 > 0.0) { + double deltaX = _queuedTranslateDelta.x * panSensitivity; + double deltaY = _queuedTranslateDelta.y * panSensitivity; + double deltaZ = -_queuedTranslateDelta.z * panSensitivity; - double deltaX = _queuedPanDelta.x * panSensitivity; - double deltaY = _queuedPanDelta.y * panSensitivity; - - relativeTranslation += right * deltaX + up * deltaY; - _queuedPanDelta = Vector2.zero(); + relativeTranslation += _right * deltaX + _up * deltaY + _forward * deltaZ; + _queuedTranslateDelta = Vector3.zero(); } // Apply zoom @@ -129,9 +127,10 @@ class FreeFlightInputHandlerDelegate implements InputHandlerDelegate { Vector3 right = _right.clone()..applyQuaternion(currentRotation); Vector3 up = _up.clone()..applyQuaternion(currentRotation); - relativeTranslation += right * _queuedMoveDelta.x + - up * _queuedMoveDelta.y + - forward * _queuedMoveDelta.z; + relativeTranslation += (right * _queuedMoveDelta.x + + up * _queuedMoveDelta.y + + forward * _queuedMoveDelta.z) * + movementSensitivity; _queuedMoveDelta = Vector3.zero(); }