boids pseudocode的规则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个文件)here