0

我对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 个文件)

4

0 回答 0