Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

zooming on cursor position on a THREE.js object

Currently I am working on a THREE.js project and I am facing problem while zooming the object.It is zooming based on the center position of render while using trackball controls but I want to zoom based on the cursor position.I have tried disabling the zooming under trackball controls using controls.noZoom=true and wrote a code under mousewheel.It is quite good as i expected but it is zooming in only not zooming out.

mousewheel = function (event) {
    event.preventDefault();
    event.stopPropagation();
            var factor = 15;
            var mX = (event.clientX / jQuery(container).width()) * 2 - 1;
            var mY = -(event.clientY / jQuery(container).height()) * 2 + 1;         
            var vector = new THREE.Vector3(mX, mY, 0.5);
            zoomstart = vector.unproject(camera);
            vector.sub(camera.position);
            camera.position.addVectors(camera.position, vector.setLength(factor));
            trackBallControls.target.addVectors(trackBallControls.target, vector.setLength(factor));
 };

Help me with this code to zoom based on mouse position.

like image 490
Aasha joney Avatar asked Sep 12 '25 04:09

Aasha joney


1 Answers

I came up with the solution and it works pretty cool

var camera = new THREE.PerspectiveCamera(45, container.offsetWidth / 
              container.offsetHeight, 1, 100000);
camera.position.set(0, 0, 40);

var trackBallControls= new THREE.TrackballControls(webGl.cameraP, container);
    trackBallControls.rotateSpeed = 2.0;
    trackBallControls.zoomSpeed = 3.0;
    trackBallControls.panSpeed = 2.0;
    trackBallControls.dynamicDampingFactor = 0.3;
    trackBallControls.minDistance = 300;
    trackBallControls.maxDistance = 4000;
    trackBallControls.noZoom = false;
    trackBallControls.noRotate = false;
    trackBallControls.noPan = false;
    trackBallControls.staticMoving = true;
    trackBallControls.enabled = true;

mousewheel = function (event) {
                var factor = 15;
                var mX = (event.clientX / jQuery(container).width()) * 2 - 1;
                var mY = -(event.clientY / jQuery(container).height()) * 2 + 1;
                var vector = new THREE.Vector3(mX, mY, 0.1);

                vector.unproject(camera);
                vector.sub(camera.position);
                if (event.deltaY < 0) {
                    camera.position.addVectors(camera.position, vector.setLength(factor));
                    trackBallControls.target.addVectors(trackBallControls.target, vector.setLength(factor));
                } else {
                    camera.position.subVectors(camera.position, vector.setLength(factor));
                    trackBallControls.target.subVectors(trackBallControls.target, vector.setLength(factor));
                }
    };
like image 199
Aasha joney Avatar answered Sep 13 '25 18:09

Aasha joney