diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx index d6732b3..d74c2da 100644 --- a/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx +++ b/app/src/modules/scene/controls/selectionControls/selection3D/moveControls3D.tsx @@ -116,10 +116,12 @@ function MoveControls3D({ if (pastedObjects.length > 0 || duplicatedObjects.length > 0 || rotatedObjects.length > 0) return; - if (keyCombination === "Ctrl" || keyCombination === "Ctrl+Shift" || keyCombination === "Shift") { - setKeyEvent(keyCombination); - } else { - setKeyEvent(""); + if (keyCombination !== keyEvent) { + if (keyCombination === "Ctrl" || keyCombination === "Ctrl+Shift" || keyCombination === "Shift") { + setKeyEvent(keyCombination); + } else { + setKeyEvent(""); + } } if (keyCombination === "G") { @@ -204,11 +206,18 @@ function MoveControls3D({ } if (dragOffset) { - const baseNewPosition = new THREE.Vector3().addVectors(intersectionPoint, dragOffset); + const rawBasePosition = new THREE.Vector3().addVectors(intersectionPoint, dragOffset); - let moveSpeed = keyEvent === "Shift" || "Ctrl+Shift" ? 0.25 : 1; + let moveSpeed = keyEvent.includes("Shift") ? 0.25 : 1; - if (keyEvent === "Ctrl") { + const initialBasePosition = initialPositions[movedObjects[0].uuid]; + const positionDifference = new THREE.Vector3().subVectors(rawBasePosition, initialBasePosition); + + const adjustedDifference = positionDifference.multiplyScalar(moveSpeed); + + const baseNewPosition = new THREE.Vector3().addVectors(initialBasePosition, adjustedDifference); + + if (keyEvent.includes("Ctrl")) { baseNewPosition.x = snapControls(baseNewPosition.x, "Ctrl"); baseNewPosition.z = snapControls(baseNewPosition.z, "Ctrl"); }