Поворот 2D-вектора с помощью glm

В игре, которую я делаю, у оружия есть разброс (плавающий), и я хочу присвоить каждому углу пули случайное значение из диапазона [-разброс, разброс]. Для этого я думал, что мог бы использовать glm::rotate, но проблема в том, что пули разлетаются почти во всех направлениях.

Код, который я использую:

void Gun::fire(const glm::vec2& direction, const glm::vec2& position, std::vector<Bullet>& bullets) {
    static std::mt19937 randomEngine(time(nullptr));
    // For offsetting the accuracy
    std::uniform_real_distribution<float> randRotate(-_spread, _spread);


    for (int i = 0; i < _bulletsPerShot; i++) {
        // Add a new bullet
        bullets.emplace_back(position, 
                             glm::rotate(direction, randRotate(randomEngine)),
                             _bulletDamage, 
                             _bulletSpeed);
    }   
}

(Вверху я включил vector и glm/gtx/rotate_vector.hpp)


person Gykonik    schedule 24.02.2016    source источник


Ответы (1)


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

РЕДАКТИРОВАТЬ: В самой последней версии GLM я просмотрел исходный код. Существует закомментированная версия Rotate, которая явно преобразует градусы в радианы, но в доступном исходном коде такого явного преобразования нет. Поэтому мне остается предположить, что он ожидает радианы, а не градусы, как ваши входные данные для вращения.

Исходный код GLM

person Xirema    schedule 24.02.2016
comment
Я посмотрел, GLM использует градусы для расчета поворота. - person Gykonik; 24.02.2016
comment
@Gykonik AFAIR, stackoverflow.com/questions/23945139/ - GLM фактически может использовать оба. Проверяли ли вы значение, преобразованное вручную в виде угла, преобразованного из градусов в радианы? - person ; 24.02.2016
comment
О, ты прав. Но это должны быть градусы, верно? Как я могу это сделать? Я читал, что вы можете использовать glm::degrees() //from radians to degrees. для преобразования радианов в градусы. Где я должен передать это в строке glm::rotate(direction, randRotate(randomEngine))? - person Gykonik; 24.02.2016
comment
@Gykonik Я только что добавил правку. Что касается преобразования, вы можете сделать это вручную (radians = degrees * PI / 180 и degrees = radians / PI * 180) или использовать встроенные функции, предоставляемые GLM. - person Xirema; 24.02.2016
comment
Хорошо, я решил это сам. Я не знаю, почему, и я также не знаю, почему ни у кого раньше не было этой проблемы, но randRotate(XYZ) возвращает градусы, а glm::rotate нужны радианы... Поэтому я преобразовал его, и теперь он работает правильно! Спасибо за помощь! :) - person Gykonik; 24.02.2016