Обработка и OpenGL - Изменение положения камеры? - PullRequest
5 голосов
/ 21 ноября 2010

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

У меня есть некоторый код, где, если пользователь удерживает клавишу c и перетаскивает мышь, положение камеры изменяется. Дело в том, что я не уверен, как рассчитать движение камеры по движению мыши.

Это код камеры для положения по умолчанию: камера (ширина / 2.0, высота / 2.0, (высота / 2.0) / загар (PI * 60.0 / 360.0), ширина / 2.0, высота / 2.0, 0, 0, 1, 0);

Как изменить положение камеры относительно перетаскивания мышью? (Я пытался использовать mouseX и mouseY, чтобы сместить положение глаз камеры, но это не очень хорошо работает.)

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

Если у вас есть направление вектор, вы можете установить положение вашей камеры следующим образом (абстрактный код):

pos += speed * normalize( direction );

Это для продвижения вперед. Если вы хотите двигаться назад - просто умножьте нормализованный указатель направления на -1. Для стрельбы влево и вправо используйте что-то такое:

pos += speed * normalize( cross_product( direction, upvector ) ); // strafing right
pos += speed * normalize( cross_product( upvector, direction ) ); // strafing left

Вот некоторые заметки о векторных операциях (из одного из моих приложений «HelloWorld» =)):

  • normalize (vec); возвращает vec, длина которого равна 1; этот "режет" vec до необходимой длины
  • cross_product (vec_a, vec_b); возвращает vec_c, который направлен перпендикулярно vec_a и vec_b (подробнее см. в этой статье )

Моя версия cross_product () выглядит так:

Vector Vector::CrossProduct(const Vector &v)
{
    double k1 = (y * v.z) - (z * v.y);
    double k2 = (z * v.x) - (x * v.z);
    double k3 = (x * v.y) - (y * v.x);

    return Vector(NumBounds(k1), NumBounds(k2), NumBounds(k3)); 
    // NumBounds(v) returns 0 when v is less than 10 ^ -8
}

Надеюсь, это поможет =)

1 голос
/ 05 октября 2011

Я думаю, что гораздо проще всего было бы использовать библиотеку peasycam

http://mrfeinberg.com/peasycam/

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

...