Physics Simulation Forum

 

All times are UTC




Post new topic Reply to topic  [ 2 posts ] 
Author Message
PostPosted: Tue Jun 12, 2012 12:35 am 
Offline

Joined: Tue May 29, 2012 1:51 pm
Posts: 4
I am new to working with Bullet and am trying to verify whether or not it is possible to do the following:
1) Capture the complete state of a train-like sequence of rigid body objects in memory.
2) After allowing the physics to step forward for some duration, return the simulation to the stored state.

I read through the forums and learned that complete determinism in Bullet is planned for version 3.0.

I am wondering if the non-deterministic behavior I am observing is due to absence of the work-in-progress features,
or whether I am simply doing something wrong, like not storing all of the correct attributes to capture the state.

The objects whose state I want to store are a series wheeled vehicle rigid-body objects connected by btHingeConstraints, like a train.

The following pseudo code the attributes I currently save as the state of the train:

Save:
State* state = new State()
// breaking, engine, steering apply only to first train engine, storing them outside of loop
state->SetBreakingForce(m_breakingForce);
state->SetEngineForce(m_engineForce);
state->SetVehicleSteering(m_vehicleSteering);
foreach body in train:
save body->getWorldTransform();
save body->getLinearVelocity();
save body->getAngularVelocity();

I tried 2 approaches for restoring that state:
First Case: I remove the train, and add a new train with the stored state value.
Second Case: I apply the stored state values directly to the existing train.

In both cases, it appears I neglected to store or reset some important force.
It is more apparent in the second case, but still easy to spot in the first case too.

Any suggestions on what I may be missing?
Or whether this might be related to something else?

Thank you for any ideas!

-Brian


Top
 Profile  
 
PostPosted: Tue Jun 12, 2012 6:33 pm 
Offline

Joined: Tue May 29, 2012 1:51 pm
Posts: 4
After seeing suggestions in a related post, I looked closer and found I was leaving out several things.
After using code like what is below for each segment of the train, I believe I have the state saved/restored as completely as possible for the current Bullet version with the post-restore variations being due to this issue http://code.google.com/p/bullet/issues/detail?id=519.

Code:
    m_rigidBody->clearForces();
    m_rigidBody->getMotionState()->setWorldTransform(*state->m_segTransform);
    m_rigidBody->setCenterOfMassTransform(*state->m_segTransform);
    m_rigidBody->setLinearVelocity(*state->m_segLinearVel);
    m_rigidBody->setAngularVelocity(*state->m_segAngularVel);
    m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->
    cleanProxyFromPairs(m_rigidBody->getBroadphaseHandle(),
                        m_dynamicsWorld->getDispatcher());
   if (m_vehicle)
   {
      m_vehicle->resetSuspension();
      for (int i=0;i<m_vehicle->getNumWheels();i++)
      {
         //synchronize wheels with (interpolated) chassis worldtransform
         m_vehicle->updateWheelTransform(i,true);
      }
   }


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 2 posts ] 

All times are UTC


Who is online

Users browsing this forum: Bing [Bot], Google [Bot], MSN [Bot] and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group