Exemple #1
0
void ContactGenerator::sphere_halfspace(const CollisionShape &a, const RigidBody &rbA, const CollisionShape &b, const RigidBody &rbB, ContactManifold &contactManifold)
{
	// Make sure we have contacts left and Check if they're the right shapes.
	if ( a.getShapeType() != SHAPE_SPHERE || b.getShapeType() != SHAPE_HALFSPACE ) { return; }

	// then typecast their appropriate shapes
	const ShapeSphere& sphere = (const ShapeSphere&)a;
	const ShapeHalfspace& halfspace = (const ShapeHalfspace&)b;

	// Get the positions and halfspace normal
	Vec3 posSphere = a.getOffset().getPosition() + rbA.getTransform().getPosition();
	Vec3 posHalfspace = a.getOffset().getPosition() + rbB.getTransform().getPosition();;
	Vec3 normHalfspace = rbB.getTransform() * b.getOffset() * Vec3(0.f, 1.f, 0.f, 0.f);

	// Find the distance from the plane to the sphere
	Scalar distance = normHalfspace.dot(posSphere) - sphere.getRadius() - (posHalfspace).y;

	// Check collision
	if(distance < 0)
	{
		// Create contact data
		ContactPoint newContact;

		newContact.normal = normHalfspace;
		newContact.position = posSphere + -newContact.normal*(sphere.getRadius() - newContact.penetration/2);
		newContact.penetration = -distance;

		contactManifold.addContactPoint(newContact);
	}

	return;
}
// Integrate all of the rigid bodies in the scene
void Physics::integrateRigidBodies(real duration)
{
	// Integrate all of the particles
	for (unsigned int particleIndex = 0; particleIndex < particles.size(); particleIndex++)
	{
		particles[particleIndex]->integrate(duration);
	}

	// Integrate all of the cubes
	if (rectangleObjects.size() > 0)
	{
		// Integrate all of the rigid bodies and add them to the bounding sphere heirarchy
		for (unsigned int rigidBodyIndex = 0; rigidBodyIndex < rectangleObjects.size(); rigidBodyIndex++)
		{
			RigidBody *body = rectangleObjects[rigidBodyIndex]->body;
			body->integrate(duration);
		}
	}

	// Integrate all of the spheres
	if (sphereObjects.size() > 0)
	{
		for (unsigned int rigidBodyIndex = 0; rigidBodyIndex < sphereObjects.size(); rigidBodyIndex++)
		{
			sphereObjects[rigidBodyIndex]->body->integrate(duration);
		}
	}

	// Integrate all the cylinders
	for (unsigned int rigidBodyIndex = 0; rigidBodyIndex < capsuleObjects.size(); rigidBodyIndex++)
	{
		capsuleObjects[rigidBodyIndex]->body->integrate(duration);
	}
}
Exemple #3
0
/**
 * Copy constructor.
 * @return A deep copy of this object.
 */
Object* RigidBody::clone() {
	RigidBody* rb = new RigidBody(*this);
	//rb.setShape(new rb
	rb->body_ = NULL;
	rb->processBody_();
	return rb;
} 
Node* buildDrop()
{
  // A simple free falling mass.
  SharedPtr<Group> group = new Group("Group");

  MobileRootJoint* mobileRootJoint = new MobileRootJoint("Root Joint");
  mobileRootJoint->setInitialPosition(Vector3(0, 0, -10000));
  mobileRootJoint->setInitialAngularVelocity(Vector3(1, 1, 1));
  group->addChild(mobileRootJoint);

  RigidBody* rigidBody = new RigidBody("Rigid Body");
  rigidBody->addLink("externalInteractLink");
  group->addChild(rigidBody);

  Mass* mass = new Mass("Mass", 1, InertiaMatrix(1, 0, 0, 1, 0, 1));
  group->addChild(mass);

  ExternalInteract* externalInteract = new ExternalInteract("ExternalInteract");
  externalInteract->setPosition(mass->getPosition());
  externalInteract->setEnableAllOutputs(true);
  group->addChild(externalInteract);

  group->connect(mobileRootJoint->getPort("link"),
                 rigidBody->getPort("link0"));
  group->connect(rigidBody->getPort("link1"),
                 mass->getPort("link"));
  group->connect(rigidBody->getPort("externalInteractLink"),
                 externalInteract->getPort("link"));

  return group.release();
}
RigidBody* PhysicsManager::createRigidBody(Ogre::SceneNode* node, Ogre::Entity* ent, RigidBodyInfo* rbInfo) {
    RigidBody* rigBod = new RigidBody();
    rigBod->setConstructionInfo(rbInfo);
    rigBod->setNode(node);
    rigBod->setEntity(ent);
    return rigBod;
}
Exemple #6
0
void MyGame::Update(float elapsedTime)
{
    static float spawnTimer = 0;

    spawnTimer += elapsedTime;

    if(spawnTimer >= 0.15f)
    {
        Cube* c = new Cube(Vector3f(1.f, 1.f, 1.f));
        c->SetTexture(Texture::Get("!debug.png"));
        GetScene().GetRoot()->AddChild(c);
        RigidBody* rb = c->AddToPhysic(1, Vector3f(0, 25, 7.5));
        rb->ApplyForce(Vector3f(0, -10.f, 0));
        spawnTimer = 0;

        m_cubeCount++;
    }

    std::ostringstream fps;
    fps << "FPS: " << GetFps();
    m_txtFps->SetText(fps.str());

    std::ostringstream CubeCount;
    CubeCount << "Cube count: " << m_cubeCount;
    m_txtCubeCount->SetText(CubeCount.str());
}
void SceneReplication::CreateScene()
{
    scene_ = new Scene(context_);

    // Create scene content on the server only
    ResourceCache* cache = GetSubsystem<ResourceCache>();

    // Create octree and physics world with default settings. Create them as local so that they are not needlessly replicated
    // when a client connects
    scene_->CreateComponent<Octree>(LOCAL);
    scene_->CreateComponent<PhysicsWorld>(LOCAL);

    // All static scene content and the camera are also created as local, so that they are unaffected by scene replication and are
    // not removed from the client upon connection. Create a Zone component first for ambient lighting & fog control.
    Node* zoneNode = scene_->CreateChild("Zone", LOCAL);
    Zone* zone = zoneNode->CreateComponent<Zone>();
    zone->SetBoundingBox(BoundingBox(-1000.0f, 1000.0f));
    zone->SetAmbientColor(Color(0.1f, 0.1f, 0.1f));
    zone->SetFogStart(100.0f);
    zone->SetFogEnd(300.0f);

    // Create a directional light without shadows
    Node* lightNode = scene_->CreateChild("DirectionalLight", LOCAL);
    lightNode->SetDirection(Vector3(0.5f, -1.0f, 0.5f));
    Light* light = lightNode->CreateComponent<Light>();
    light->SetLightType(LIGHT_DIRECTIONAL);
    light->SetColor(Color(0.2f, 0.2f, 0.2f));
    light->SetSpecularIntensity(1.0f);

    // Create a "floor" consisting of several tiles. Make the tiles physical but leave small cracks between them
    for (int y = -20; y <= 20; ++y)
    {
        for (int x = -20; x <= 20; ++x)
        {
            Node* floorNode = scene_->CreateChild("FloorTile", LOCAL);
            floorNode->SetPosition(Vector3(x * 20.2f, -0.5f, y * 20.2f));
            floorNode->SetScale(Vector3(20.0f, 1.0f, 20.0f));
            StaticModel* floorObject = floorNode->CreateComponent<StaticModel>();
            floorObject->SetModel(cache->GetResource<Model>("Models/Box.mdl"));
            floorObject->SetMaterial(cache->GetResource<Material>("Materials/Stone.xml"));

            RigidBody* body = floorNode->CreateComponent<RigidBody>();
            body->SetFriction(1.0f);
            CollisionShape* shape = floorNode->CreateComponent<CollisionShape>();
            shape->SetBox(Vector3::ONE);
        }
    }

    // Create the camera. Limit far clip distance to match the fog
    // The camera needs to be created into a local node so that each client can retain its own camera, that is unaffected by
    // network messages. Furthermore, because the client removes all replicated scene nodes when connecting to a server scene,
    // the screen would become blank if the camera node was replicated (as only the locally created camera is assigned to a
    // viewport in SetupViewports() below)
    cameraNode_ = scene_->CreateChild("Camera", LOCAL);
    Camera* camera = cameraNode_->CreateComponent<Camera>();
    camera->SetFarClip(300.0f);

    // Set an initial position for the camera scene node above the plane
    cameraNode_->SetPosition(Vector3(0.0f, 5.0f, 0.0f));
}
RigidBody* RigidBody::clone() {
    RigidBody* obj = new RigidBody();
    obj->setPosition(this->position);
    for (std::vector<Object*>::iterator it = this->childs.begin(); it != this->childs.end(); ++it) {
        obj->addChild(*it);
    }
    this->bindVBO();

    obj->setRotation(this->rotation);
    obj->setVAO(this->vao);
    obj->setShader(this->shader);
    obj->setVertexCounter(this->vertexCounter);

    obj->setVertices(this->g_vp);
    obj->setVPVBO(this->vp_vbo);
    obj->setBoundingBox(this->vbo_vertices_bounding_box,
                        this->ibo_elements,
                        this->sizeBoundingBox,
                        this->centerBoundingBox,
                        this->minBoundingBox,
                        this->maxBoundingBox);

    return obj;

}
Exemple #9
0
void Grid::ResolveCollisions(Entity* ent)
{
	RigidBody* rigid = ent->GetComponent<RigidBody>();

	if (rigid)
	{
		rigid->ResolveCollisions();

		BoxCollider* box = ent->GetComponent<BoxCollider>();

		if (box)
		{
			Vector3& max = box->GetMaxCoord();
			Vector3& min = box->GetMinCoord();

			if (min.x < 0 || min.y < 0 || max.x > GridWidth || max.y > GridHeight)
				ent->OnCollisionEnter(Collision());
		}
	}

	for (auto &child : ent->GetChildren())
	{
		ResolveCollisions(child);
	}
}
void StateCharacterTurning::Update(float timeStep)
{
	StateCharacterGrounded::Update();
	
	RigidBody* body = pawn_->GetBody();
	AnimationController* animCtrl = static_cast<PawnAnimated*>(pawn_)->GetAnimationController();

	//apply a force to slow it down further, since we are changing direction
	body->ApplyImpulse(moveDir_ * pawn_->GetMoveForce() *0.25);//0.25 to dampen it

    //get the speed that we are travelling, that will determine when we turn around
    if(!flipped_)
    {
        //before we are flipped around, we drive the turning animation
        //float spd = pawn_->GetPlaneVelocity().Length();
        //float turnTime = Fit(spd,0.0f,speed_,1.0f,0.0f);
        
        animCtrl->PlayExclusive("Models/Man/MAN_TurnSkidGunning.ani", 0,false, 0.1f);
        //animCtrl->SetTime("Models/Man/MAN_TurnSkidGunning.ani",turnTime);

        if(animCtrl->IsAtEnd("Models/Man/MAN_TurnSkidGunning.ani"))
        {
            Turn();
            animCtrl->Play("Models/Man/MAN_TurnSkidGunningFlipped.ani", false, 0.0f);
            flipped_=true;
        }
    }
    else
    {
        animCtrl->Play("Models/Man/MAN_TurnSkidGunningFlipped.ani", false, 0.0f);
        //now that we are flipped we can set it to the next state too
        pawn_->SetState( new StateCharacterRunning(context_) );
    }
}
Exemple #11
0
bool RigidBody::CollidesWith(const RigidBody& other) const {
  bool ignored =
      this == &other || adjacentTo(other) ||
      (collision_filter_group_ & other.getCollisionFilterIgnores()).any() ||
      (other.getCollisionFilterGroup() & collision_filter_ignores_).any();
  return !ignored;
}
void Gravity::ForceUpdate(RigidBody & body, REAL dt)
{
	if (body.HasInfiniteMass())
		return;

	body.AddForce(gravity*body.GetMass());
}
Exemple #13
0
/**
 * Adds an Object to the area.
 * @param object The Object's pointer.
 * @see removeObject()
 */
void Area::addObject(Object* object) {
    //object->setArea(this);
    DEBUG_M("Entering function...");
    GameManager* gm = getGameManager();
    if(object->getGameManager() != gm) {
        DEBUG_A("Different GameMangers...");
        object->setGameManager(gm);
        if(gm) {
            DEBUG_A("Registering  object with gamemanager...");
            gm->registerObject(object);
        }
    }

    RigidBody* rb = dynamic_cast<RigidBody*>(object);
    if(rb) {
        rb->addBody(getPhysics());
    }

    Light* pl = dynamic_cast<Light*>(object);
    if(pl) {
        lights_.push_back(pl);
    }

    addChild(object);
}
Exemple #14
0
void ContactGenerator::box_halfspace(const CollisionShape &a, const RigidBody &rbA, const CollisionShape &b, const RigidBody &rbB, ContactManifold &contactManifold)
{
	// Make sure we have contacts left and Check if they're the right shapes.
	if (a.getShapeType() != SHAPE_BOX || b.getShapeType() != SHAPE_HALFSPACE ) { return; }

	// then typecast their appropriate shapes
	const ShapeBox& box = (const ShapeBox&)a;
	const ShapeHalfspace& halfspace = (const ShapeHalfspace&)b;

	const Vec3& boxHalfExtents = box.getHalfExtents();

	// generate a array of all of the box's vertices
	Vec3 boxVertex[8] = 
	{
		Vec3(-boxHalfExtents.x, -boxHalfExtents.y, -boxHalfExtents.z),
		Vec3(-boxHalfExtents.x, -boxHalfExtents.y, +boxHalfExtents.z),
		Vec3(-boxHalfExtents.x, +boxHalfExtents.y, -boxHalfExtents.z),
		Vec3(-boxHalfExtents.x, +boxHalfExtents.y, +boxHalfExtents.z),
		Vec3(+boxHalfExtents.x, -boxHalfExtents.y, -boxHalfExtents.z),
		Vec3(+boxHalfExtents.x, -boxHalfExtents.y, +boxHalfExtents.z),
		Vec3(+boxHalfExtents.x, +boxHalfExtents.y, -boxHalfExtents.z),
		Vec3(+boxHalfExtents.x, +boxHalfExtents.y, +boxHalfExtents.z),
	};

	const Transform& boxTransform = rbA.getTransform();

	// Apply collision object offset
	for (int i = 0; i < 8; i++)
	{
		boxVertex[i] = boxTransform * a.getOffset() * boxVertex[i];
	}

	// Calculate halfspace's position and normal
	Vec3 posHalfspace = b.getOffset().getPosition() + rbB.getPosition();
	Vec3 normHalfspace = rbB.getTransform() * b.getOffset() * Vec3(0.f, 1.f, 0.f, 0.f);

	// Check each vertice for intersection with the halfspace
	Scalar vertexDistance;

	unsigned int numContacts = 0;

	for (int i = 0; i < 8; i++)
	{
		vertexDistance = boxVertex[i].dot(normHalfspace) - posHalfspace.y;

		if(vertexDistance <= 0)
		{
			// Create contact data
			ContactPoint newContact;

			newContact.normal = normHalfspace;
			newContact.penetration = -vertexDistance;
			newContact.position = boxVertex[i] + newContact.normal*(newContact.penetration*0.5f);

			contactManifold.addContactPoint(newContact);
		}
	}

	return;
}
Exemple #15
0
void	WheelInfo::UpdateWheel(const RigidBody& chassis,RaycastInfo& raycastInfo)
{

	
	if (m_raycastInfo.m_isInContact)

	{
		SimdScalar	project= m_raycastInfo.m_contactNormalWS.dot( m_raycastInfo.m_wheelDirectionWS );
		SimdVector3	 chassis_velocity_at_contactPoint;
		SimdVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition();
		chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint( relpos );
		SimdScalar projVel = m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint );
		if ( project >= -0.1f)
		{
			m_suspensionRelativeVelocity = 0.0f;
			m_clippedInvContactDotSuspension = 1.0f / 0.1f;
		}
		else
		{
			SimdScalar inv = -1.f / project;
			m_suspensionRelativeVelocity = projVel * inv;
			m_clippedInvContactDotSuspension = inv;
		}
		
	}

	else	// Not in contact : position wheel in a nice (rest length) position
	{
		m_raycastInfo.m_suspensionLength = this->GetSuspensionRestLength();
		m_suspensionRelativeVelocity = 0.0f;
		m_raycastInfo.m_contactNormalWS = -m_raycastInfo.m_wheelDirectionWS;
		m_clippedInvContactDotSuspension = 1.0f;
	}
}
// -------------------------------------------------------------------------
RigidBody *OgreBulletListener::addSphere(const Ogre::String instanceName,
                                         const Ogre::Vector3 &pos, const Ogre::Quaternion &q, const Ogre::Real radius,
                                         const Ogre::Real bodyRestitution, const Ogre::Real bodyFriction, 
                                         const Ogre::Real bodyMass)
{
    Entity *entity = mSceneMgr->createEntity(
        instanceName + StringConverter::toString(mNumEntitiesInstanced),
        "ellipsoid.mesh");

    entity->setQueryFlags (GEOMETRY_QUERY_MASK);
#if (OGRE_VERSION < ((1 << 16) | (5 << 8) | 0)) // only applicable before shoggoth (1.5.0)
    entity->setNormaliseNormals(true);
#endif
	entity->setCastShadows(true);

    entity->setMaterialName("Bullet/box");

    SphereCollisionShape *sceneCubeShape = new SphereCollisionShape(radius);

    RigidBody *defaultBody = new RigidBody(
        "defaultSphereRigid" + StringConverter::toString(mNumEntitiesInstanced),
        mWorld);

    SceneNode *node = mSceneMgr->getRootSceneNode ()->createChildSceneNode ();
    node->attachObject (entity);

    defaultBody->setShape (node,  sceneCubeShape, bodyRestitution, bodyFriction, bodyMass, pos, q);

    mEntities.push_back(entity);
    mShapes.push_back(sceneCubeShape);
    mBodies.push_back(defaultBody);
    mNumEntitiesInstanced++;

    return defaultBody;
}
bool CaptureWorld::setObjectRigidBody(int oid, int rid, bool offset)
{
	ClientHandler* client = AppData::getInstance()->getClient();
	if (!client) return false;

	RigidBody* rb;
	// detach object
	if (rid < 0)
	{
		rb = NULL;
	}
	else 
	{
		// check if has ownership of rigid body transformation
		rb = client->getRigidBody(rid);
		if (!rb || 
			rb->getWorldID() >=0 && rb->getWorldID() != this->id) 
			return false;

		rb->setWorldID(this->id);
	}

	CaptureObject* object = getObject(oid);
	object->setRigidBody(rb, offset);
	updateObjectsNode();
	MainFormController::getInstance()->objectUpdateGridView(oid);
	return true;
}
// -------------------------------------------------------------------------
RigidBody *OgreBulletListener::addStaticTrimesh(const Ogre::String &instanceName,
                                                const Ogre::String &meshName,
                                                const Ogre::Vector3 &pos, 
                                                const Ogre::Quaternion &q, 
                                                const Ogre::Real bodyRestitution, 
                                                const Ogre::Real bodyFriction,
                                                bool castShadow)
{
    Entity *sceneEntity = mSceneMgr->createEntity(instanceName + StringConverter::toString(mNumEntitiesInstanced), meshName);
    sceneEntity->setCastShadows (castShadow);

    StaticMeshToShapeConverter *trimeshConverter = new StaticMeshToShapeConverter(sceneEntity);
    TriangleMeshCollisionShape *sceneTriMeshShape = trimeshConverter->createTrimesh();
    delete trimeshConverter;
    RigidBody *sceneRigid = new RigidBody(
        instanceName + "Rigid" + StringConverter::toString(mNumEntitiesInstanced),
        mWorld);

    SceneNode *node = mSceneMgr->getRootSceneNode ()->createChildSceneNode ();
    node->attachObject (sceneEntity);

    sceneRigid->setStaticShape(node, sceneTriMeshShape, bodyRestitution, bodyFriction, pos);

    mEntities.push_back(sceneEntity);
    mBodies.push_back(sceneRigid);
    mNumEntitiesInstanced++;

    return sceneRigid;
}
vector<pair<RigidBody *, RigidBody *>> &NSquared::ComputePairs()
{
	ColliderPairList.clear();

	//Outer Loop
	for(vector<RigidBody *>::iterator i = ColliderList.begin(); i != ColliderList.end(); ++i)
	{
		vector<RigidBody *>::iterator jStart = i;
		for(vector<RigidBody *>::iterator j = ++jStart; j != ColliderList.end(); ++j)
		{
			RigidBody *rBodyA = *i;
			RigidBody *rBodyB = *j;
			AABB *aabbA = rBodyA->GetBoundingBox();
			AABB *aabbB = rBodyB->GetBoundingBox();

			if(aabbA->checkCollision(*aabbB))
			{
				ColliderPairList.push_back(make_pair(rBodyA, rBodyB));
			}
			
		}
	}

	return ColliderPairList;
}
/**
 *	This method is used when a mouse event gets generated. This method returns true if the message gets processed, false otherwise.
 */
bool InteractiveWorld::onMouseEvent(int eventType, int button, int mouseX, int mouseY){
	//need to figure out if the mouse is in the push interface window (and if we care)...
	if (Globals::drawPushInterface == 1 && button == MOUSE_LBUTTON && eventType != MOUSE_UP){
		Vector3d input;
		Point3d p;
		if (bInterface == false){
			tprintf("Warning: No interaction interface was created!\n");
			return false;
		}

		if (world == NULL){
			tprintf("Warning: There is no valid reference to a world!\n");
			return false;
		}

		RigidBody* dBall = world->getRBByName("dodgeBall");
		if (dBall == NULL){
			tprintf("Warning: No dodgeBall loaded!\n");
			return false;
		}

		bool eventHandled = bInterface->handleMouseEvent(mouseX, mouseY, &input);
		if (eventHandled ){
			if (input.length() > 0){
				//get the object that we will be throwing...
				getDodgeBallPosAndVel(-input.x, input.y, input.length(), &p, &input);
				dBall->setCMPosition(p);
				dBall->setCMVelocity(input);
//				dBall->updateToWorldTransformation();
			}
			return true;
		}
	}
	return false;
}
Exemple #21
0
Node* SceneReplication::CreateControllableObject()
{
    ResourceCache* cache = GetSubsystem<ResourceCache>();
    
    // Create the scene node & visual representation. This will be a replicated object
    Node* ballNode = scene_->CreateChild("Ball");
    ballNode->SetPosition(Vector3(Random(40.0f) - 20.0f, 5.0f, Random(40.0f) - 20.0f));
    ballNode->SetScale(0.5f);
    StaticModel* ballObject = ballNode->CreateComponent<StaticModel>();
    ballObject->SetModel(cache->GetResource<Model>("Models/Sphere.mdl"));
    ballObject->SetMaterial(cache->GetResource<Material>("Materials/StoneSmall.xml"));
    
    // Create the physics components
    RigidBody* body = ballNode->CreateComponent<RigidBody>();
    body->SetMass(1.0f);
    body->SetFriction(1.0f);
    // In addition to friction, use motion damping so that the ball can not accelerate limitlessly
    body->SetLinearDamping(0.5f);
    body->SetAngularDamping(0.5f);
    CollisionShape* shape = ballNode->CreateComponent<CollisionShape>();
    shape->SetSphere(1.0f);
    
    // Create a random colored point light at the ball so that can see better where is going
    Light* light = ballNode->CreateComponent<Light>();
    light->SetRange(3.0f);
    light->SetColor(Color(0.5f + (Rand() & 1) * 0.5f, 0.5f + (Rand() & 1) * 0.5f, 0.5f + (Rand() & 1) * 0.5f));
    
    return ballNode;
}
void AiController::OnTick(const natU64 _dt)
{
	if(!m_lifeController->IsAlive())
	{
		// called spawner first
		//m_spawner->OnKilled(GetEntity());

		Spawned* spawned = GetEntity()->GetComponent<Spawned>();
		assert(spawned);
		spawned->Kill();
	}
	else
	{
		// move toward player
		Entity* player = m_playersManager->GetLocalPlayer();
		Transform* transform_player = player->GetComponent<Transform>();
		Transform* transform = GetEntity()->GetComponent<Transform>();
		RigidBody* rigidbody = GetEntity()->GetComponent<RigidBody>();

		glm::vec3 direction = transform_player->GetPos() - transform->GetPos();

		if(direction != glm::vec3(0.f))
		{
			direction = glm::normalize(direction);
			//transform->m_pos += static_cast<natF32>(_dt) * direction * m_speed;
			direction = static_cast<natF32>(_dt) * direction;
			rigidbody->ApplyLinearImpulse(direction);

		}
	}
}
Exemple #23
0
void PhysicsWorld::ConvexCast(PhysicsRaycastResult& result, CollisionShape* shape, const Vector3& startPos, const Quaternion& startRot, const Vector3& endPos, const Quaternion& endRot, unsigned collisionMask)
{
    if (!shape || !shape->GetCollisionShape())
    {
        LOGERROR("Null collision shape for convex cast");
        result.body_ = 0;
        result.position_ = Vector3::ZERO;
        result.normal_ = Vector3::ZERO;
        result.distance_ = M_INFINITY;
        return;
    }

    // If shape is attached in a rigidbody, set its collision group temporarily to 0 to make sure it is not returned in the sweep result
    RigidBody* bodyComp = shape->GetComponent<RigidBody>();
    btRigidBody* body = bodyComp ? bodyComp->GetBody() : (btRigidBody*)0;
    btBroadphaseProxy* proxy = body ? body->getBroadphaseProxy() : (btBroadphaseProxy*)0;
    short group = 0;
    if (proxy)
    {
        group = proxy->m_collisionFilterGroup;
        proxy->m_collisionFilterGroup = 0;
    }

    ConvexCast(result, shape->GetCollisionShape(), startPos, startRot, endPos, endRot, collisionMask);

    // Restore the collision group
    if (proxy)
        proxy->m_collisionFilterGroup = group;
}
//------------------------------------------------------------------------------
void SoccerBall::frameMove(float dt)
{
    RigidBody::frameMove(dt);

    return;
    
    if (!proxy_object_) return;

    RigidBody * body = (RigidBody*)game_state_->getGameObject(rel_object_id_);
    if (body)
    {
        Vector new_pos = body->getTransform().transformPoint(rel_pos_);

         setPosition(new_pos);
//         setGlobalLinearVel(body->getGlobalLinearVel());

//        getTarget()->setPosition(new_pos);
//        getTarget()->setGlobalLinearVel(body->getGlobalLinearVel());
//         handleProxyInterpolation();
//         handleProxyInterpolation();


//        proxy_object_->setPosition(proxy_object_->getPosition() + dt*body->getGlobalLinearVel());
        
    }
}
Exemple #25
0
void Ragdolls::SpawnObject()
{
    ResourceCache* cache = GetContext()->m_ResourceCache.get();

    Node* boxNode = scene_->CreateChild("Sphere");
    boxNode->SetPosition(cameraNode_->GetPosition());
    boxNode->SetRotation(cameraNode_->GetRotation());
    boxNode->SetScale(0.25f);
    StaticModel* boxObject = boxNode->CreateComponent<StaticModel>();
    boxObject->SetModel(cache->GetResource<Model>("Models/Sphere.mdl"));
    boxObject->SetMaterial(cache->GetResource<Material>("Materials/StoneSmall.xml"));
    boxObject->SetCastShadows(true);

    RigidBody* body = boxNode->CreateComponent<RigidBody>();
    body->SetMass(1.0f);
    body->SetRollingFriction(0.15f);
    CollisionShape* shape = boxNode->CreateComponent<CollisionShape>();
    shape->SetSphere(1.0f);

    const float OBJECT_VELOCITY = 10.0f;

    // Set initial velocity for the RigidBody based on camera forward vector. Add also a slight up component
    // to overcome gravity better
    body->SetLinearVelocity(cameraNode_->GetRotation() * Vector3(0.0f, 0.25f, 1.0f) * OBJECT_VELOCITY);
}
bool testBodyTreeModel1(unsigned numLevels, unsigned numBodies)
{
  SharedPtr<Group> group = new Group("Group");

  MobileRootJoint* mechanicRootJoint = new MobileRootJoint("RootJoint");
  group->addChild(mechanicRootJoint);

  RigidBody* rigidBody = new RigidBody("RigidBody");
  group->addChild(rigidBody);
  group->connect(mechanicRootJoint->getPort("link"),
                 rigidBody->addLink("rootLink"));
  
  Mass* mass = new Mass("Mass", 1, InertiaMatrix(1, 0, 0, 1, 0, 1));
  group->addChild(mass);
  group->connect(mass->getPort("link"), rigidBody->addLink("massLink"));

  addBodiesRecursive(numLevels, numBodies, rigidBody, group);

  SharedPtr<System> system = new System("Closed kinematic Loop 1");
  system->setNode(group);

  if (!system->init()) {
    std::cerr << "Initialization of single body model failed!" << std::endl;
    return false;
  }
  return true;
}
double ExcludedVolumeRestraint::unprotected_evaluate(DerivativeAccumulator *da)
    const {
  IMP_OBJECT_LOG;
  if (!initialized_) {
    initialize();
  } else {
    IMP_IF_CHECK(USAGE) {
      Model *m = get_model();
      IMP_CONTAINER_FOREACH(SingletonContainer, sc_, {
        if (RigidMember::get_is_setup(m, _1)) {
          RigidBody rb = RigidMember(m, _1).get_rigid_body();
          using IMP::operator<<;
          IMP_USAGE_CHECK(
              std::find(rbs_.begin(), rbs_.end(),
                        rb.get_particle()->get_index()) != rbs_.end(),
              "You cannot change the contents of the singleton container "
                  << "passed to ExcludedVolume after the first evaluate."
                  << " Found unexpected rigid body " << rb->get_name()
                  << " not in " << rbs_);
        } else {
          IMP_USAGE_CHECK(
              std::find(xyzrs_.begin(), xyzrs_.end(), _1) != xyzrs_.end(),
              "You cannot change the contents of the singleton container "
                  << "passed to ExcludedVolume after the first evaluate."
                  << " Found unexpected particle " << m->get_particle_name(_1));
        }
      });
    }
  }
bool testClosedKinematicLoop2()
{
  SharedPtr<Group> group = new Group("Group");

  MobileRootJoint* mechanicRootJoint = new MobileRootJoint("RootJoint");
  group->addChild(mechanicRootJoint);

  RigidBody* rigidBody = new RigidBody("RigidBody");
  group->addChild(rigidBody);
  group->connect(mechanicRootJoint->getPort("link"),
                 rigidBody->addLink("rootLink"));

  PrismaticJoint* prismaticJoint = new PrismaticJoint("PrismaticJoint");
  group->addChild(prismaticJoint);
  group->connect(rigidBody->addLink("jointLink0"),
                 prismaticJoint->getPort("link0"));
  group->connect(rigidBody->addLink("jointLink1"),
                 prismaticJoint->getPort("link1"));

  SharedPtr<System> system = new System("Closed kinematic Loop 1");
  system->setNode(group);

  if (system->init()) {
    std::cerr << "Detection of klosed kinematic loop failed!" << std::endl;
    return false;
  }
  return true;
}
void PhysicsStressTest::SpawnObject()
{
    ResourceCache* cache = GetSubsystem<ResourceCache>();
    
    // Create a smaller box at camera position
    Node* boxNode = scene_->CreateChild("SmallBox");
    boxNode->SetPosition(cameraNode_->GetPosition());
    boxNode->SetRotation(cameraNode_->GetRotation());
    boxNode->SetScale(0.25f);
    StaticModel* boxObject = boxNode->CreateComponent<StaticModel>();
    boxObject->SetModel(cache->GetResource<Model>("Models/Box.mdl"));
    boxObject->SetMaterial(cache->GetResource<Material>("Materials/StoneSmall.xml"));
    boxObject->SetCastShadows(true);
    
    // Create physics components, use a smaller mass also
    RigidBody* body = boxNode->CreateComponent<RigidBody>();
    body->SetMass(0.25f);
    body->SetFriction(0.75f);
    CollisionShape* shape = boxNode->CreateComponent<CollisionShape>();
    shape->SetBox(Vector3::ONE);
    
    const float OBJECT_VELOCITY = 10.0f;
    
    // Set initial velocity for the RigidBody based on camera forward vector. Add also a slight up component
    // to overcome gravity better
    body->SetLinearVelocity(cameraNode_->GetRotation() * Vector3(0.0f, 0.25f, 1.0f) * OBJECT_VELOCITY);
}
Exemple #30
0
void ContactGenerator::sphere_sphere(const CollisionShape &a, const RigidBody &rbA, const CollisionShape &b, const RigidBody &rbB, ContactManifold &contactManifold)
{
	// Make sure we have contacts left and Check if they're spheres.
	if ( a.getShapeType() != SHAPE_SPHERE || b.getShapeType() != SHAPE_SPHERE ) { return; }
	
	//  then typecast their shape to a sphere
	const ShapeSphere& shapeA = (const ShapeSphere&)a;
	const ShapeSphere& shapeB = (const ShapeSphere&)b;

	// Get the sphere positions
	Vec3 posA = a.getOffset().getPosition() + rbA.getPosition();
	Vec3 posB = b.getOffset().getPosition() + rbB.getPosition();

	// Find the vector between the two object
	Vec3 midLine = posA - posB;
	Scalar distance = midLine.length();

	// Check for collision
	if (distance <= 0.0f || distance >= shapeA.getRadius() + shapeB.getRadius())
	{
		return;
	}

	// Create contact data
	ContactPoint newContact;

	newContact.normal = midLine * ( ((Scalar)1.0) / distance );
	newContact.position = posA + (midLine * (Scalar)-0.5);
	newContact.penetration = (shapeA.getRadius() + shapeA.getRadius() - distance);

	contactManifold.addContactPoint(newContact);
}