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;
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);
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();
}