void CreateSoftDynamicsWorld()
{
btVector3 gravityVec = new btVector3(Gravity.x, Gravity.y, Gravity.z);
btCollisionObject tempObject = new btCollisionObject();
btConstraintSetting tempObject2 = new btConstraintSetting();
softBodyWorldInfo = new btSoftBodyWorldInfo();
///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration.
softCollisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration();
///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
dispatcher = new btCollisionDispatcher(softCollisionConfiguration.GetSwigPtr());
softBodyWorldInfo.m_dispatcher = dispatcher.GetSwigPtr();
btVector3 worldAabbMin = new btVector3(-1000,-1000,-1000);
btVector3 worldAabbMax = new btVector3(1000,1000,1000);
axisBroadphase = new btAxisSweep3(worldAabbMin.GetSwigPtr(),worldAabbMax.GetSwigPtr(),32766);
softBodyWorldInfo.m_broadphase = axisBroadphase.GetSwigPtr();
///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
solver = new btSequentialImpulseConstraintSolver();
softDynamicsWorld = new btSoftRigidDynamicsWorld(dispatcher.GetSwigPtr(), axisBroadphase.GetSwigPtr(), solver.GetSwigPtr(), softCollisionConfiguration.GetSwigPtr());
dynamicsWorld = btDiscreteDynamicsWorld.GetObjectFromSwigPtr(softDynamicsWorld.getDiscreteDynamicsWorld());
SWIGTYPE_p_btCollisionWorld collisionWorldPtr = dynamicsWorld.getCollisionWorld();
collisionWorld = btCollisionWorld.GetObjectFromSwigPtr(collisionWorldPtr);
dynamicsWorld.setGravity(gravityVec.GetSwigPtr());
softBodyWorldInfo.m_gravity = gravityVec.GetSwigPtr();
btVector3 water_nomalVec = new btVector3(0,0,0);
softBodyWorldInfo.air_density = 1.2f;
softBodyWorldInfo.water_density = 0;
softBodyWorldInfo.water_offset = 0;
softBodyWorldInfo.water_normal = water_nomalVec.GetSwigPtr();
sparseSdf = softBodyWorldInfo.m_sparsesdf;
sparseSdf.Initialize();
AddBulletObjects();
}