Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DragControls: Add rotate mode. #27689

Merged
merged 10 commits into from
Feb 9, 2024
Merged
7 changes: 6 additions & 1 deletion docs/examples/en/controls/DragControls.html
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,11 @@ <h3>[property:Boolean transformGroup]</h3>
If set to `true`, [name] does not transform individual objects but the entire group. Default is `false`.
</p>

<h3>[property:String mode]</h3>
<p>
The current transformation mode. Possible values are "translate", and "rotate". Default is `translate`.
</p>

<h2>Methods</h2>

<p>See the base [page:EventDispatcher] class for common methods.</p>
Expand Down Expand Up @@ -146,4 +151,4 @@ <h2>Source</h2>
[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/DragControls.js examples/jsm/controls/DragControls.js]
</p>
</body>
</html>
</html>
53 changes: 43 additions & 10 deletions examples/jsm/controls/DragControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,17 @@ const _raycaster = new Raycaster();

const _pointer = new Vector2();
const _offset = new Vector3();
const _diff = new Vector2();
const _start = new Vector2();
const _end = new Vector2();
const _intersection = new Vector3();
const _worldPosition = new Vector3();
const _inverseMatrix = new Matrix4();

const _up = new Vector3();
const _horizen = new Vector3();
const _lookAt = new Vector3();

class DragControls extends EventDispatcher {

constructor( _objects, _camera, _domElement ) {
Expand All @@ -28,6 +35,8 @@ class DragControls extends EventDispatcher {

const _intersections = [];

this.mode = "translate";

//

const scope = this;
Expand Down Expand Up @@ -75,17 +84,31 @@ class DragControls extends EventDispatcher {
if ( scope.enabled === false ) return;

updatePointer( event );

_end.copy(_pointer);
_diff.subVectors(_end, _start);
_start.copy(_end);

_raycaster.setFromCamera( _pointer, _camera );

if ( _selected ) {

if (scope.mode === "translate") {

if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {

_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );

}

} else if (scope.mode === "rotate") {

if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {

_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );

_diff.multiplyScalar(2); //Just a random scalling factor since it rotated too slow
lewibs marked this conversation as resolved.
Show resolved Hide resolved
_selected.rotateOnWorldAxis(_up, _diff.x);
_selected.rotateOnWorldAxis(_horizen.normalize(), -_diff.y);
}


scope.dispatchEvent( { type: 'drag', object: _selected } );

return;
Expand Down Expand Up @@ -161,9 +184,19 @@ class DragControls extends EventDispatcher {

if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {

_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
_offset.copy( _intersection ).sub( _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );

if (scope.mode === "translate") {

_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();
_offset.copy( _intersection ).sub( _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );

} else if (scope.mode === "rotate") {

_up.set(0,1,0).applyQuaternion(_camera.quaternion).normalize();
lewibs marked this conversation as resolved.
Show resolved Hide resolved
_horizen.set(1,0,0).applyQuaternion(_camera.quaternion).normalize();
lewibs marked this conversation as resolved.
Show resolved Hide resolved
_lookAt.set(0,0,-1).applyQuaternion(_camera.quaternion).normalize();
lewibs marked this conversation as resolved.
Show resolved Hide resolved

}

}

_domElement.style.cursor = 'move';
Expand Down Expand Up @@ -218,4 +251,4 @@ class DragControls extends EventDispatcher {

}

export { DragControls };
export { DragControls };
7 changes: 6 additions & 1 deletion examples/misc_controls_drag.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<div id="info">
<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - drag controls<br />
Use "Shift+Click" to add/remove objects to/from a group.<br />
Use "M" to toggle between rotate and translate modes.<br />
Grouped objects can be transformed as a union.
</div>

Expand Down Expand Up @@ -141,6 +142,10 @@
function onKeyDown( event ) {

enableSelection = ( event.keyCode === 16 ) ? true : false;

if (event.keyCode === 77) {
controls.mode = (controls.mode === "translate") ? "rotate" : "translate";
}

}

Expand Down Expand Up @@ -209,4 +214,4 @@
</script>

</body>
</html>
</html>