Перемещение вверх и вниз с помощью элементов управления блокировкой указателя THREE.js

#javascript #three.js #3d #camera #trigonometry

#javascript #three.js #3D #камера #тригонометрия

Вопрос:

Мне нужно перемещаться вверх и вниз с помощью three.js pointerlockcontrols . Я ищу движение того же типа, что и three.js flycontrols , где величина, на которую вы перемещаетесь вверх и вниз, пропорциональна направлению, в котором вы смотрите (т. Е. если вы смотрите на северо-восток, вы перемещаетесь в направлениях Y и Z с одинаковой скоростью).

Я пытался:

     if(keys[38] || keys[87]){
        Controls.moveForward(playerSpeed);
        Camera.position.y  = Math.cos(Camera.rotation.y) * playerSpeed;
    }
  

Где keys — это просто объект всех ключей и независимо от того, находятся ли они вниз, однако это не дало соответствующего поведения, поскольку просмотр прямо вниз также сильно продвинул вас вперед.

Кто-нибудь когда-либо выполнял или знает, как это сделать?

Комментарии:

1. Поскольку вы пытаетесь скопировать поведение FlyControls , вы смотрели на исходный код, чтобы увидеть, как они это делают?

2. Я не просматривал исходный код (я сделаю это, как только закончу), но я видел, что в нескольких местах говорится что-то вроде controls.canLookUp = true или controls.canMoveUp = true для элементов управления fly, и это не сработало для PLC, я посмотрю на код курса сейчас, хотя

Ответ №1:

Вы можете изменить реализацию moveForward (расстояние) на это:

     moveForward(distance) {
        const camera = this.camera;

        _vector.copy(this.getDirection(_vector));

        camera.position.addScaledVector(_vector, distance);
    }
  

Оригинальная реализация использует векторы камеры в сторону и вверх для вычисления вектора, указывающего в прямом направлении -> это обеспечивает предполагаемое перемещение в плоскости xz.

Мое изменение просто использует уже существующий getDirection метод и применяет пройденное расстояние к результирующему вектору.