【问题标题】:Rotate 2D vector with glm proper使用 glm 正确旋转 2D 矢量
【发布时间】:2017-06-12 01:14:38
【问题描述】:

在我正在制作的游戏中,枪支有一个传播(浮动),我想给每个子弹的角度一个随机值,范围为 [-spread, spread]。为此,我认为我可以使用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);
    }   
}

(在顶部我包括了vectorglm/gtx/rotate_vector.hpp

【问题讨论】:

  • 来自glm.g-truc.net/0.9.5/updates.htmlFinally, here is a list of all the functions that could use degrees in GLM 0.9.5.4 that requires radians in GLM 0.9.6: rotate (matrices and quaternions), [etc.]
  • randRotate(randomEngine)) 部分返回一个度数,而 glm::rotate 需要一个弧度。这就是解决方案!谢谢! :)

标签: c++ vector rotation glm-math


【解决方案1】:

我不记得 GLM 是否使用弧度或度数来计算旋转,但 2 Radians 几乎是一个完整圆的三分之一,这意味着子弹的方向变化多达一个完整圆的三分之二。您可能希望使用较小的数字进行测试,或者验证 GLM 确实使用度数来计算旋转。

编辑:在最新版本的 GLM 中,我查看了源代码。 Rotate 有一个注释掉的版本,它显式地将度数转换为弧度,但可访问的源代码没有这种显式转换。所以我只能假设它期望弧度而不是度数作为旋转的输入。

【讨论】:

  • 我查了一下,GLM 确实使用度数来计算旋转
  • @Gykonik AFAIR, stackoverflow.com/questions/23945139/… - GLM 实际上可以同时使用两者。您是否手动检查了转换为角度转换为弧度的值?
  • 哦,你是对的。但它必须是学位,对吧?我怎样才能做到这一点?我读到,您可以使用glm::degrees() //from radians to degrees. 将弧度转换为度数。我应该在glm::rotate(direction, randRotate(randomEngine)) 行中将其传递到哪里?
  • @Gykonik 我刚刚添加了一个编辑。至于如何转换,可以手动(radians = degrees * PI / 180&degrees = radians / PI * 180),也可以使用GLM提供的内置函数。
  • 好的,我自己解决了。我不知道为什么,我也不知道,为什么以前没有人遇到过这个问题,但是 randRotate(XYZ) 返回度数并且 glm::rotate 需要弧度...所以我对其进行了转换,现在它可以正常工作了!谢谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
相关资源
最近更新 更多