Как сопоставить управляющий ключ с определенным углом или ориентацией?
На данный момент я в основном построил большую хеш-таблицу с различными углами и на какое направление они отображаются, если пользователь нажимает вправо, вверх, вниз, влево. Это необходимо, в моем случае, поскольку у меня есть набор геометрий, которые, когда пользователь нажимает вправо, все они идут вправо, а когда слева, они все идут налево...
Однако, когда сцена, содержащая их, поворачивается во что-либо, кроме ее исходного состояния, эти элементы управления должны быть обновлены / перевернуты / и т.д. То есть, если вы смотрите на сцену сзади, при нажатии влево все объекты движутся вправо и т. Д.
Я пытался выяснить, существует ли более простой способ применения матричных преобразований вместо жесткого кодирования большой хеш-таблицы, отображающей различные углы сцены на клавиши.
1 ответ
Вы можете использовать вектор смещения (из набора таких векторов, каждый для желаемого направления движения) и просто вращать его с помощью камеры или, если ваша камера неподвижна и сцена вращается, вращать смещения в направлении, противоположном направлению сцены вращение (т. е. если вы вращаете сцену по часовой стрелке вокруг оси x, поверните векторы смещения вокруг одной и той же оси против часовой стрелки на тот же угол). Чтобы выразиться более формально, вам нужно повернуть матрицу вращения яблока обратно по отношению к повороту сцены.
Старый ответ:
Если я правильно понял ваш вопрос, вам нужно каким-то образом просматривать сцену с разных сторон с помощью клавиатуры. Что ж, можно действительно по-настоящему придумать способы сделать это, но я думаю, что один из самых обычных способов сделать это - вращать сцену, пока нажата соответствующая клавиша. Например, когда нажата левая клавиша, в каждом кадре добавляйте (или вычитайте) постоянное значение (которое будет скоростью вращения) к (из) повороту сцены вокруг заданной оси:
var speed = 0; document.body.addEventListener('keydown', function (e) { switch (e.keyCode) { case 37: // left arrow speed = -0.1; break; case 39: // right arrow speed = 0.1; break; } }); document.body.addEventListener('keyup', function (e) { speed = 0; }); function update () { scene.rotateX(speed); renderer.render(scene, camera); requestAnimationFrame(update); }