使用 glm 适当旋转 2D 矢量
Rotate 2D vector with glm proper
在我制作的游戏中,枪支有散布(浮动),我想给每颗子弹的角度一个范围为 [-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);
}
}
(在顶部我包括 vector
和 glm/gtx/rotate_vector.hpp
)
我不记得 GLM 是否使用弧度或度数来计算旋转,但 2 Radians
几乎是一个完整圆的三分之一,这意味着子弹的方向变化多达三分之二一整圈。您可能希望使用较小的数字进行测试,或者验证 GLM 是否确实使用度数来计算旋转。
编辑:在最新版本的 GLM 中,我查看了源代码。有一个已注释掉的 Rotate 版本,可以将度数显式转换为弧度,但可访问的源代码没有此类显式转换。所以我只能假设它期望弧度而不是度数作为旋转的输入。
在我制作的游戏中,枪支有散布(浮动),我想给每颗子弹的角度一个范围为 [-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);
}
}
(在顶部我包括 vector
和 glm/gtx/rotate_vector.hpp
)
我不记得 GLM 是否使用弧度或度数来计算旋转,但 2 Radians
几乎是一个完整圆的三分之一,这意味着子弹的方向变化多达三分之二一整圈。您可能希望使用较小的数字进行测试,或者验证 GLM 是否确实使用度数来计算旋转。
编辑:在最新版本的 GLM 中,我查看了源代码。有一个已注释掉的 Rotate 版本,可以将度数显式转换为弧度,但可访问的源代码没有此类显式转换。所以我只能假设它期望弧度而不是度数作为旋转的输入。