Three.js Pointerlock управляет стрельбой вдоль оси Y

В настоящее время я занимаюсь разработкой FPS с three.js и pointerlockcontrols.

Используя приведенный ниже код, я могу снимать в любом горизонтальном направлении:

var direction = new THREE.Vector3( 0, 0, -1 );
var rotation = new THREE.Euler( 0, 0, 0, "XYZ" );
var cameraDirection = new THREE.Vector3(this.game.usermodel.root.children[0].position.x, this.game.usermodel.root.children[0].rotation._x, this.game.usermodel.root.children[0].position.z);
cameraDirection.copy( direction ).applyEuler( this.game.user.rotation );

var raycaster = new THREE.Raycaster(this.game.usermodel.root.children[0].position, cameraDirection); 

Но мой код не учитывает ось Y. Строка ниже содержит вращение основного тона:

this.game.usermodel.root.children[0].rotation._x

Как я могу применить это значение, чтобы я мог снимать также вдоль оси Y (вертикально в любом направлении)? В настоящее время пуля движется по прямой.

Заранее спасибо за вашу помощь.

2 ответа

Решение

Изучив это немного больше, я, наконец, сам нашел обходной путь. Возможно, это не идеальный способ сделать это, но это работает.

Теперь это работает так: я получаю базовое вращение сетки и применяю эйлер, затем добавляю вращение высоты тона. Таким образом я передаю горизонтальное и вертикальное вращение в Raycaster.

var direction = new THREE.Vector3( 0, 0, -1 );

direction.copy( direction ).applyEuler( this.game.user.rotation );
direction.y = this.game.usermodel.root.children[0].rotation._x;

var raycaster = new THREE.Raycaster(this.game.usermodel.root.children[0].position, direction);

Все еще могут прокомментировать это или придумать более элегантное решение.

Если вы используете PointerLockControls и вы хотите установить raycaster, вы можете использовать этот шаблон:

var direction = new THREE.Vector3();
var raycaster = new THREE.Raycaster(); // create once and reuse
...

controls.getDirection( direction );
raycater.set( controls.getObject().position, direction );

Не устанавливайте положение камеры или поворот непосредственно, если вы используете PointerLockControls,

three.js r.71

Другие вопросы по тегам