Перемещение PerspectiveCamera с помощью сенсорной панели

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

touchpad.getKnobPercentX()
touchpad.getKnobPercentY()

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

private void setKnobAction() {
    if (pad.getKnobPercentY() > 0f) {
        camera.position.add(camera.direction.scl(1f));
        camera.update();
    }
    if (pad.getKnobPercentY() < 0f) {
        camera.position.sub(camera.direction.scl(1f));
        camera.update();
    }
    if (pad.getKnobPercentX() > 0f) {
        right = camera.direction.cpy().crs(Vector3.Y).nor();
        camera.position.add(right.scl(1));
        camera.update();
    }
    if (pad.getKnobPercentX() < 0f) {
        right = camera.direction.cpy().crs(Vector3.Y).nor();
        camera.position.sub(right.scl(1));
        camera.update();
    }
}

Этот метод вызывается в моем методе render(), поэтому он вызывается несколько раз. Кроме того, если ручкаPercent установлена ​​на 0, она начнет странно вращаться.


person user1678551    schedule 26.10.2014    source источник


Ответы (1)


В javadoc Vector3.scl(float scalar) говорится:

Масштабирует этот вектор с помощью скаляра

Это означает, что вы на самом деле масштабируете вектор camera.direction.
Учитывая, что вектор direction обычно представляет собой вектор Vector3 с длиной 1, задавая процент каждой оси, вы должны заметить проблему.
Масштабирование приводит к более быстрое движение в каждом кадре, уменьшение масштаба приводит к замедлению движения в каждом кадре.
Например: вы двигаетесь в направлении x, ваше camera.direction равно Vector3(1, 0, 0). Вы масштабируете его на 2.
Теперь это Vector3(2, 0, 0), и вы перемещаетесь на 2 единицы в этом кадре. Опять масштабируется и в следующем кадре это Vector3(4, 0, 0), в этом кадре вы перемещаетесь на 4 единицы. И так продолжается до бесконечности.
То же самое касается масштабирования ниже 1.

Еще хуже масштабирование с нулем, потому что оно устанавливает длину camera.direction равной нулю. Это означает, что у вас больше нет информации о направлении, которое вызывает странное вращение.

Итак, что вы должны сделать:
Сохраните еще один Vector3, скопируйте в него значения camera.direction (в начале каждого кадра), масштабируйте его на getKnobPercentY() (на самом деле вы должны масштабировать его на getKnobPercentY() * delta * speed) и добавьте это к позиции.
Затем снова сбросьте этот вектор (скопируйте в него значения camera.direction) и сделайте то же самое для значений x (теперь с crs(Vector3.Y)).

person Springrbua    schedule 27.10.2014
comment
Нужно ли мне по-прежнему использовать новый вектор, который я создаю, даже если он уже копирует вектор направления? - person user1678551; 28.10.2014
comment
я думаю, с копированием это должно работать, но cpy() создает новый Vector3, было бы лучше сохранить 1 Vector3 и изменить его значения. - person Springrbua; 28.10.2014
comment
Спасибо, я пытался понять это в течение нескольких недель. - person user1678551; 30.10.2014
comment
@ user1678551 Итак, вы решили свою проблему? Я рад, что смог помочь :) - person Springrbua; 30.10.2014