模拟绕行物体时,速度无处不在

时间:2018-08-07 21:35:04

标签: c++ simulation game-engine physics gravity

我正在用c ++创建一个游戏引擎,其语法与Unity非常相似。 我创建了一个名为PointGravity的组件,该组件使用牛顿的万有引力定律将场景中的所有实体吸引到其中。

但是,当用物体绕轨道进行测试时,由于PointGravity也会将其拉到物体上,因此会产生摆动效果。但是它在一个方向上的摆动远大于在另一个方向上的摆动,导致其向一侧移动,如此处所示:Video

m_entity是点重力所在的实体 这是代码:

void PointGravity::Update()
{
    mass = m_entity->GetComponent<RigidBody>()->mass; //Gets the mass from the rigidbody on the same entity

    std::vector<Entity*> entities = EntityManager::GetInstance()->GetEntities(); //Retrieves a vector list of all entities in the scene
    for (int i = 0; i < entities.size(); i++)
    {
        if (entities[i] == m_entity)
            continue;
        if (!entities[i]->GetComponent<RigidBody>())
            continue;
        if (entities[i]->GetComponent<RigidBody>()->ignoreGravity)
            continue;

        //Gravity calculation
        Vector3 direction = m_entity->GetComponent<Transform>()->position - entities[i]->GetComponent<Transform>()->position;
        float distance = direction.Magnitude();
        if (distance < 0.1)
            continue;

        //float massProduct = m_entity->GetComponent<RigidBody>()->mass * entities[i]->GetComponent<RigidBody>()->mass;

        float forceMagnitude = (m_entity->GetComponent<RigidBody>()->mass * entities[i]->GetComponent<RigidBody>()->mass) / pow(distance, 2) * 0.01;
        Vector3 force = direction.Normalize()*forceMagnitude;
        m_entity->GetComponent<RigidBody>()->AddForce(force*-1);
        entities[i]->GetComponent<RigidBody>()->AddForce(force);
    }

}

黄色石头是上面带有PointGravity的石头,棕色石头的切向速度为10,在黄色石头上方的位置为10。我不知道是什么导致了这个问题。

0 个答案:

没有答案