#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
метод и применяет пройденное расстояние к результирующему вектору.