在三个JS中设置平移自定义事件

时间:2019-05-06 07:03:55

标签: three.js

在这里,我正在尝试更新轨迹球球控件,在该控件中我想基于鼠标指针放大/缩小对象。我已禁用轨迹球上的所有控件,并为musewheel添加了自定义事件(基于鼠标指针放大/缩小)和旋转事件。如何在添加Pan事件和单击鼠标左右键时遇到一些问题。现在我想从左键添加PAN事件,并为右键单击旋转按钮  这是小提琴 https://jsfiddle.net/AjayVenkatesh/e5osm69a/2/

var scene, renderer, camera;
var cube;
var controls;
var containerWidth = window.innerWidth,
    containerHeight = window.innerHeight;
var isDragging = false;
var previousMousePosition = {
    x: 0,
    y: 0
};
var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };
this.noRotate = false;

init();

animate();

function init() {
    configureRenderer();
    scene = new THREE.Scene();
    configureCube();
    configureCamera();
    configureLight();
    configureControls();
}

function configureRenderer() {
    renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
    });
    renderer.setSize(innerWidth, innerHeight);
    document.body.appendChild(renderer.domElement);
    window.onresize = function () {
        renderer.setSize(window.innerWidth, window.innerHeight);
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        if (controls)
            controls.handleResize();
    }

    renderer.domElement.addEventListener("wheel", function (e) {
        const delta = event.deltaY;

        let y = 1 - 2 * event.clientY / window.innerHeight;
        let cursorpos = new THREE.Vector3(x, y, 1);

        cursorpos.unproject(camera);

        let dir = new THREE.Vector3().copy(cursorpos).sub(camera.position).normalize();
        let shift = new THREE.Vector3().copy(dir).multiplyScalar(delta * 0.1);

        camera.position.add(shift);
        controls.position0.add(shift);
        controls.target.add(shift);
    });

    renderer.domElement.addEventListener('mousedown', event => {
        isDragging = true;
    });

    renderer.domElement.addEventListener('mousemove', function (e) {
        // isDragging = true;
        //console.log(e);
        // rotateSpeed = 0.07;
        const that = this;
        var deltaMove = {
            x: e.offsetX - previousMousePosition.x,
            y: e.offsetY - previousMousePosition.y
        };

        if (isDragging) {
            var deltaRotationQuaternion = new THREE.Quaternion()
                .setFromEuler(new THREE.Euler(
                    toRadians(deltaMove.y * 1),
                    toRadians(deltaMove.x * 1),
                    0,
                    'XYZ'
                ));
            cube.quaternion.multiplyQuaternions(deltaRotationQuaternion, cube.quaternion);
        }
        previousMousePosition = {
            x: e.offsetX,
            y: e.offsetY
        };
    });

    function toRadians(angle) {
        rotateSpeed = 0.1;
        return angle * (Math.PI / 180) * rotateSpeed;
    }

    renderer.domElement.addEventListener('mouseup', event => {
        isDragging = false;
    });

    renderer.domElement.addEventListener('contextmenu', function (e) {
        console.log("right click triggered")
        e.preventDefault();
        var mouseChange = new THREE.Vector2(),
            objectUp = new THREE.Vector3(),
            pan = new THREE.Vector3();
        function panCamera() {
            mouseChange.copy(_panEnd).sub(_panStart);
            if (mouseChange.lengthSq()) {
                mouseChange.multiplyScalar(_eye.length() * _this.panSpeed);
                pan.copy(_eye).cross(_this.object.up).setLength(mouseChange.x);
                pan.add(objectUp.copy(_this.object.up).setLength(mouseChange.y));
                _this.object.position.add(pan);
                _this.target.add(pan);
                if (_this.staticMoving) {
                    _panStart.copy(_panEnd);
                } else {
                    _panStart.add(mouseChange.subVectors(_panEnd, _panStart).multiplyScalar(_this.dynamicDampingFactor));
                }
            }
        };
    });


    this.rotateCamera = (function () {

        var axis = new THREE.Vector3(),
            quaternion = new THREE.Quaternion(),
            eyeDirection = new THREE.Vector3(),
            objectUpDirection = new THREE.Vector3(),
            objectSidewaysDirection = new THREE.Vector3(),
            moveDirection = new THREE.Vector3(),
            angle;

        return function rotateCamera() {

            moveDirection.set(_moveCurr.x - _movePrev.x, _moveCurr.y - _movePrev.y, 0);
            angle = moveDirection.length();

            if (angle) {

                _eye.copy(_this.object.position).sub(_this.target);

                eyeDirection.copy(_eye).normalize();
                objectUpDirection.copy(_this.object.up).normalize();
                objectSidewaysDirection.crossVectors(objectUpDirection, eyeDirection).normalize();

                objectUpDirection.setLength(_moveCurr.y - _movePrev.y);
                objectSidewaysDirection.setLength(_moveCurr.x - _movePrev.x);

                moveDirection.copy(objectUpDirection.add(objectSidewaysDirection));

                axis.crossVectors(moveDirection, _eye).normalize();

                angle *= _this.rotateSpeed;
                quaternion.setFromAxisAngle(axis, angle);

                _eye.applyQuaternion(quaternion);
                _this.object.up.applyQuaternion(quaternion);

                _lastAxis.copy(axis);
                _lastAngle = angle;

            } else if (!_this.staticMoving && _lastAngle) {

                _lastAngle *= Math.sqrt(1.0 - _this.dynamicDampingFactor);
                _eye.copy(_this.object.position).sub(_this.target);
                quaternion.setFromAxisAngle(_lastAxis, _lastAngle);
                _eye.applyQuaternion(quaternion);
                _this.object.up.applyQuaternion(quaternion);

            }

            _movePrev.copy(_moveCurr);

        };

    }());

    this.update = function () {

        _eye.subVectors(_this.object.position, _this.target);

        if (!_this.noRotate) {

            _this.rotateCamera();

        }

        if (!_this.noZoom) {

            _this.zoomCamera();

        }

        if (!_this.noPan) {

            _this.panCamera();

        }

        _this.object.position.addVectors(_this.target, _eye);

        _this.checkDistances();

        _this.object.lookAt(_this.target);

        if (lastPosition.distanceToSquared(_this.object.position) > EPS) {

            _this.dispatchEvent(changeEvent);

            lastPosition.copy(_this.object.position);

        }

    };
}
function keydown(event) {

    if (_this.enabled === false) return;

    window.removeEventListener('keydown', keydown);

    _prevState = _state;

    if (_state !== STATE.NONE) {

        return;

    } else if (event.keyCode === _this.keys[STATE.ROTATE] && !_this.noRotate) {

        _state = STATE.ROTATE;

    } else if (event.keyCode === _this.keys[STATE.ZOOM] && !_this.noZoom) {

        _state = STATE.ZOOM;

    } else if (event.keyCode === _this.keys[STATE.PAN] && !_this.noPan) {

        _state = STATE.PAN;

    }

}

function keyup(event) {

    if (_this.enabled === false) return;

    _state = _prevState;

    window.addEventListener('keydown', keydown, false);

}

function mousedown(event) {

    if (_this.enabled === false) return;

    event.preventDefault();
    event.stopPropagation();

    if (_state === STATE.NONE) {

        _state = event.button;

    }

    if (_state === STATE.ROTATE && !_this.noRotate) {

        _moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));
        _movePrev.copy(_moveCurr);

    } else if (_state === STATE.ZOOM && !_this.noZoom) {

        _zoomStart.copy(getMouseOnScreen(event.pageX, event.pageY));
        _zoomEnd.copy(_zoomStart);

    } else if (_state === STATE.PAN && !_this.noPan) {

        _panStart.copy(getMouseOnScreen(event.pageX, event.pageY));
        _panEnd.copy(_panStart);

    }

    document.addEventListener('mousemove', mousemove, false);
    document.addEventListener('mouseup', mouseup, false);

    _this.dispatchEvent(startEvent);

}

function mousemove(event) {

    if (_this.enabled === false) return;

    event.preventDefault();
    event.stopPropagation();

    if (_state === STATE.ROTATE && !_this.noRotate) {

        _movePrev.copy(_moveCurr);
        _moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));

    } else if (_state === STATE.ZOOM && !_this.noZoom) {

        _zoomEnd.copy(getMouseOnScreen(event.pageX, event.pageY));

    } else if (_state === STATE.PAN && !_this.noPan) {

        _panEnd.copy(getMouseOnScreen(event.pageX, event.pageY));

    }

}

function mousemove(event) {
    if (_this.enabled === false) return;
    event.preventDefault();
    // event.stopPropagation();

    if (_state === STATE.ROTATE && !_this.noRotate) {

        _movePrev.copy(_moveCurr);
        _moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));

    } else if (_state === STATE.ZOOM && !_this.noZoom) {

        _zoomEnd.copy(getMouseOnScreen(event.pageX, event.pageY));

    } else if (_state === STATE.PAN && !_this.noPan) {

        _panEnd.copy(getMouseOnScreen(event.pageX, event.pageY));

    }

}

function configureCube() {
    var cubeGeometry = new THREE.BoxGeometry(20, 20, 20);
    var cubeMaterial = new THREE.MeshLambertMaterial({
        color: 0xff0000
    });
    cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    cube.position.set(50, 0, 0);
    scene.add(cube);
}

function configureCamera() {
    camera = new THREE.PerspectiveCamera(45, containerWidth / containerHeight, 1, 1000);
    camera.position.set(0, 160, 400);
    camera.lookAt(scene);
}

function configureLight() {
    pointLight = new THREE.PointLight(0xffffff, 1.0, 100000);
    pointLight.position.set(0, 300, 200);
    scene.add(pointLight);
}

function configureControls() {
    controls = new THREE.TrackballControls(camera, renderer.domElement);
    controls.enabled = false;
    controls.rotateSpeed = 0.0;
    // controls.rotateSpeed =  ;
    // controls.zoomSpeed =  1.2;
    // controls.panSpeed = 0.8;
    // controls.noZoom = false;
    // controls.noPan = false;
    // controls.staticMoving = true;
    // return controls;
}

function animate() {
    controls.update();
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}

0 个答案:

没有答案