【发布时间】:2015-07-24 22:28:18
【问题描述】:
我是 OOP 的完全初学者,我正在尝试找出在 SFML C++ 中为等质量圆的 2D 碰撞编写程序的最佳方法。我想在一个具有设定起始速度但随机起始位置和方向的框中生成两个或多个圆圈,然后让它们交互。由于我的物理学非常生疏,因此我对力学的伪代码有很多困难。我在wiki 上找到了这个二维弹性碰撞方程:
这是否意味着我应该将它用于每个球的 x 和 y 坐标?我正在考虑为球和速度做这样的事情:
std::vector<sf::CircleShape> balls;
std::vector<sf::Vector2f> Xvelocities; // (magnitudes, directions)
std::vector<sf::Vector2f> Yvelocities; // (magnitudes, directions)
我写了一个这样的碰撞函数:
bool Collision_Detection(sf::CircleShape &ball1, sf::CircleShape &ball2)
{
bool collision = false;
float distance = sqrt(pow(ball2.getPosition().x - ball1.getPosition().x, 2) +
pow(ball2.getPosition().y - ball1.getPosition().y, 2));
if (distance <= ball1.getRadius() + ball2.getRadius() + 4)
collision = true;
return collision;
检测有时会起作用,有时会卡住,我不确定这是逻辑问题还是性能不好,我需要先进行边界框碰撞。
我如何处理这件事有意义吗?有没有我忽略的东西或者人们通常编码的更标准的方式?
【问题讨论】:
-
互联网上到处都有关于如何实现球/圆碰撞的教程(因为它是最简单的实现)。旧的Pool Hall Lessons: Fast, Accurate Collision Detection Between Circles or Spheres 就是这样一个例子。
标签: c++11 2d collision-detection velocity sfml