我对boids 伪代码规则 2的实现正好产生了与所需行为相反的行为(boids 被推开,就好像它们每个都有一个力场一样):
它们将稍微远离彼此,并且在下一个时间步,如果它们仍然彼此靠近,它们将被推得更远。因此,所产生的排斥采取平滑加速的形式。保持确保平稳运动的原则是个好主意。如果两个 boid 非常接近,可能是因为它们飞得很快,考虑到它们之前的运动也受到这条规则的限制。突然把他们拉开,让他们各自的动作都颠倒过来,会显得很不自然,就像是从彼此的无形力场中反弹了一样。[规则 2 下的文字]
至于我不能告诉我的代码应该做与伪代码完全相同的事情
sf::Vector2f App::rule2(Boid* b)
{
sf::Vector2f c;
for(auto& boid : boidslist)
{
if(boid != b)
{
sf::Vector2f delta = boid->position - b->position;
if(std::sqrt(delta.x * delta.x + delta.y * delta.y) < 100)
{
c = c - (boid->position - b->position);
}
}
}
return c;
}
这是我的更新功能,以证明我在这里也做了正确的事情:
void App::update(float dt)
{
sf::Vector2f v1, v2, v3;
for(auto& boid : boidslist)
{
v1 = rule1(boid);
v2 = rule2(boid);
boid->velocity = boid->velocity + v1 + v2 + v3;
boid->position = boid->position + (boid->velocity * dt * 0.1f);
}
}
PS:如果您愿意,可以在此处检查整个代码(6 个文件)