Как сопоставить управляющий ключ с определенным углом или ориентацией?

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

Однако, когда сцена, содержащая их, поворачивается во что-либо, кроме ее исходного состояния, эти элементы управления должны быть обновлены / перевернуты / и т.д. То есть, если вы смотрите на сцену сзади, при нажатии влево все объекты движутся вправо и т. Д.

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

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);
}
Другие вопросы по тегам