collision detection between rigidbody and softbody

Post Reply
water
Posts: 33
Joined: Fri Jun 05, 2020 8:36 am

collision detection between rigidbody and softbody

Post by water »

I want to realize the collision between rigidbody and softbody, but the collision has not been detected. This is my code, can you tell me where I am going wrong? thank you very much.

softbody

Code: Select all

	const btVector3 c[] = {
		btVector3(-1, -1, -1),
		btVector3(+1, -1, -1),
		btVector3(-1, +1, -1),
		btVector3(+1, +1, -1),
		btVector3(-1, -1, +1),
		btVector3(+1, -1, +1),
		btVector3(-1, +1, +1),
		btVector3(+1, +1, +1)
	};

	//sphere1 = btSoftBodyHelpers::CreateFromTriMesh(softBodyWorldInfo, (btScalar*)pointss, &triangles[0], triangles.size()/3);
	//sphere1 = btSoftBodyHelpers::CreateEllipsoid(softBodyWorldInfo,btVector3(0, 0, 0),btVector3(1, 1, 1) * 60,10000);
	//m_softBodySolver = softbodySolver;
	
	sphere = btSoftBodyHelpers::CreateFromConvexHull(softBodyWorldInfo, c, 8, true);
	sphere->setSoftBodySolver(softbodySolver);
	


	btTransform strans;
	strans.setIdentity();
	strans.setOrigin(btVector3(0, -10, 0));
	sphere->transform(strans);
	

	sphere->m_cfg.kVC = 0.5;
	btSoftBody::Material* pSpMat = sphere->appendMaterial();
	sphere->m_cfg.kDP = 0.0;
	sphere->m_cfg.kDF = 0.0;
	sphere->m_cfg.kMT = 0.0;
	sphere->m_cfg.kCHR = 0.0;
	sphere->m_cfg.kKHR = 0.0;
	sphere->m_cfg.kSHR = 0.0;
	sphere->m_cfg.collisions = btSoftBody::fCollision::SDF_RS + btSoftBody::fCollision::CL_SS + btSoftBody::fCollision::CL_SELF;
	sphere->m_cfg.piterations = 1;
	pSpMat->m_kLST = 0.1;
	sphere->m_cfg.collisions += btSoftBody::fCollision::CL_RS;
	sphere->setPose(true, true);
	sphere->generateBendingConstraints(2);
	sphere->randomizeConstraints();
	sphere->getCollisionShape()->setMargin(0.5);	
	mp_btDynamicsWorld->addSoftBody(sphere);
	cout << 1;
rigidbody

Code: Select all

	btConvexHullShape * mp_collisionShape = new btConvexHullShape((btScalar*)points, pic.F.size() * 3);

	collisionShapes.push_back(mp_collisionShape);
	btTransform mp_ballTransform;
	mp_ballTransform.setIdentity();
	//ballTransform.setOrigin(btVector3(13, 10, 0)); 
	mp_ballTransform.setOrigin(btVector3(x, y, z)); 
	btScalar mass(01.0f);
	btQuaternion mp_quaternion = btQuaternion(yaw * RADIANS_PER_DEGREE, pich * RADIANS_PER_DEGREE, roll* RADIANS_PER_DEGREE);
	//btQuaternion quaternion = btQuaternion(sin(PI / 4), 0, 0, cos(PI / 4));
	mp_ballTransform.setRotation(mp_quaternion);

	btDefaultMotionState* mp_ballMotionState = new btDefaultMotionState(mp_ballTransform);
	bool mp_isDynamic = (mass != 0.f);
	btVector3 localInertia(0, 0, 0);
	if (mp_isDynamic)
		mp_collisionShape->calculateLocalInertia(mass, localInertia);
	btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, mp_ballMotionState, mp_collisionShape, localInertia);
	body = new btRigidBody(rbInfo);
	body->setRestitution(01.00f);
	body->setActivationState(DISABLE_DEACTIVATION);

	body->saveKinematicState(timeStep);
	//compound->addChildShape(ballTransform, collisionShape);
	mp_btDynamicsWorld->addRigidBody(body);
dispaly

Code: Select all

	for (int j = mp_btDynamicsWorld->getNumCollisionObjects() - 1; j >= 0; j--)
	{

		btCollisionObject* obj = mp_btDynamicsWorld->getCollisionObjectArray()[j];
		btRigidBody* body = btRigidBody::upcast(obj);
		body->getCenterOfMassPosition();
		btSoftBody* softBody = btSoftBody::upcast(obj);
		btTransform trans;
		if (body && body->getMotionState())
			body->getMotionState()->getWorldTransform(trans);
		else
			trans = obj->getWorldTransform();
		printf("world pos object %d = %f,%f,%f\n"
			, j, float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));



		if (j == 1)
		{
			glPushMatrix();
			glTranslated(float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));
			DrawMesh();
			glPopMatrix();


		}
		else if (j == 0)
		{
			glPushMatrix();
			glTranslated(float(trans.getOrigin().getX()), float(trans.getOrigin().getY()), float(trans.getOrigin().getZ()));
			DrawBulletObject();
			glPopMatrix();
		}




		int numManifolds = mp_btDynamicsWorld->getDispatcher()->getNumManifolds();
		for (int i = 0; i < numManifolds; i++)
		{
			btTransform trans;
			btPersistentManifold * contactManifold = mp_btDynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i);
			int numContacts = contactManifold->getNumContacts();
			if (numContacts > 0)
			{
				cerr << "get it" << endl;
			}
		}
		mp_btDynamicsWorld->stepSimulation(1.f / 120.f, 10);
		softBodyWorldInfo.m_sparsesdf.GarbageCollect();
		update();
	}
Post Reply