#Bullet physics bugged simulation

3 messages · Page 1 of 1 (latest)

floral ether
#

This code teleports the sphere (it is the same loadDefaultSimulation() function, just with classes instead of manually setuping every component):

void PhysicsWorld::loadDefaultSimulation()
{
    auto p1{ std::make_unique<PhysicsObject>(glm::vec3(0.0f, -1.0f, 0.0f), glm::quat(0.0f, 0.0f, 0.0f, 1.0f),
        CollisionShapeType::PLANE, glm::vec3(0.0f, 1.0f, 0.0f), 0.0f, 0.0f, 0.8f) };
    //p1.get()->setRestitution(0.8f);
    addObjectToWorld(std::move(p1));
    auto p2{ std::make_unique<PhysicsObject>(glm::vec3(0.0f, 50.0f, 0.0f), glm::quat(0.0f, 0.0f, 0.0f, 1.0f),
        CollisionShapeType::SPHERE, glm::vec3(0.0f, 0.0f, 0.0f), 0.2f, 1.5f, 0.8f) };
    addObjectToWorld(std::move(p2));
}
void PhysicsWorld::addObjectToWorld(std::unique_ptr<PhysicsObject> object)
{
    mPhysicsObjects.push_back(std::move(object));
    mDynamicsWorld->addRigidBody(mPhysicsObjects.back().get()->getRigidBody());
}
#

Source:

PhysicsObject::PhysicsObject(
    const glm::vec3& position,
    const glm::quat& rotation,
    CollisionShapeType collisionShapeType,
    const glm::vec3& planeNormal,
    float mass,
    float radius,
    float restitution)
    : mMass{ mass }, mRestitution{ restitution }, mPlaneNormal{ planeNormal }, mPosition{ position },
    mCollisionShape{ setCollisionShape(collisionShapeType) },
    mInertia{ calculateInertia() },
    mMotionState{
        std::make_unique<btDefaultMotionState>(btTransform(
        btQuaternion(rotation.x, rotation.y, rotation.z, rotation.w),
        btVector3(position.x, position.y, position.z)
    )) },
    mRigidBodyCI{ mMass, mMotionState.get(), mCollisionShape.get(), mInertia },
    mRigidBody{ std::make_unique<btRigidBody>(mRigidBodyCI) },
    mRadius { radius } 
{
}
std::unique_ptr<btCollisionShape> PhysicsObject::setCollisionShape(CollisionShapeType shapeType)
{
    switch (shapeType)
    {
    case CollisionShapeType::SPHERE:
        return std::make_unique<btSphereShape>(mRadius);
    case CollisionShapeType::PLANE:
        //std::cout << "PLANE NORMAL: " << mPlaneNormal.x << " " << mPlaneNormal.y << " " << mPlaneNormal.z << std::endl;
        return std::make_unique<btStaticPlaneShape>(btVector3(mPlaneNormal.x, mPlaneNormal.y, mPlaneNormal.z), -1.0f);
    default:
        return std::make_unique<btEmptyShape>();
    }
}
btVector3 PhysicsObject::calculateInertia()
{
    btVector3 inertia(0, 0, 0);
    if (mMass != 0.0f)
        mCollisionShape->calculateLocalInertia(mMass, inertia);
    return inertia;
}
#

This is PhysicsObject class