Bullet物理引擎的质心和奇怪的物体反应

3

我是一个新手,对于bullet物理引擎还不太熟悉,遇到了一个基本问题。我试图模拟保龄球的倒塌,但它们在倒下后自己站起来而没有加入任何力。

我想知道我的错误在哪里,能否有人帮忙解决,我将不胜感激。

这里有一个视频展示了发生了什么: https://www.sendspace.com/file/78tncr

以下是我如何添加地面:

tTransform l;
l.setIdentity();
l.setOrigin(btVector3(0,0,0));
btStaticPlaneShape* plane=new btStaticPlaneShape(btVector3(0,1,0),0);
btMotionState* motion=new btDefaultMotionState(l);
btRigidBody::btRigidBodyConstructionInfo info(0.0,motion,plane);
btRigidBody* body=new btRigidBody(info);
world->addRigidBody(body);
bodies.push_back(body);

这是我如何添加保龄球瓶的方法:
btRigidbodyaddBolw (float x, float y , float z,float mass)
{
btTransform t;  
t.setIdentity();
t.setOrigin(btVector3(x,y,z));
btTriangleMesh * tmptri= new btTriangleMesh();
//this is simply reading from std::vector, where I have vertex of a shape
for(int i=0;i<=faces.size()-3;i=i+3)
{
    if(faces[i].wektor==-100)
    {
        i=i-2;
        continue;
    }
    btVector3 vertex1(vertexy[faces[i].wektor].GetX(), vertexy[faces[i].wektor].GetY(), vertexy[faces[i].wektor].GetZ());
    btVector3 vertex2(vertexy[faces[i+1].wektor].GetX(), vertexy[faces[i+1].wektor].GetY(), vertexy[faces[i+1].wektor].GetZ());
    btVector3 vertex3(vertexy[faces[i+2].wektor].GetX(), vertexy[faces[i+2].wektor].GetY(), vertexy[faces[i+2].wektor].GetZ());

    tmptri->addTriangle(vertex1, vertex2, vertex3);
}
btConvexShape *tmpshape = new btConvexTriangleMeshShape(tmptri);
btShapeHull *hull = new btShapeHull(tmpshape);
btScalar margin = tmpshape->getMargin();
hull->buildHull(margin);
btConvexHullShape* simplifiedConvexShape = new btConvexHullShape();
for (int i=0;i<hull->numVertices();i++)
{
    simplifiedConvexShape->addPoint(hull->getVertexPointer()[i]);   
}
delete tmpshape;
delete hull;
btMotionState * motion = new btDefaultMotionState(t);
btVector3 inertia(0,0,0);
if(mass!=0.0)
    simplifiedConvexShape->calculateLocalInertia(mass,inertia); 
btRigidBody::btRigidBodyConstructionInfo info(mass,motion,simplifiedConvexShape,inertia);
btRigidBody* body=new btRigidBody(info);
world->addRigidBody(body);  //and let the world know about it
bodies.push_back(body); //to be easier to clean, I store them a vector
return body;
}

我尝试改变针的形状、质量、摩擦力和恢复系数,但没有任何帮助,有没有改变重心的方法,也许会有帮助呢?


那个“sendspace”网站邀请我下载MP4文件,但当我尝试下载时,它试图发送给我一个DMG文件。这个DMG文件可能是无害的,但我不想去碰它。 - Beta
1个回答

2
这是由于您的模型的枢轴点/变换原点位于保龄球瓶底部或附近所导致的。在Bullet中,刚体变换是质心,因此您看到的是重心通过重力自我校正,从而将保龄球瓶拉直。
您有几个选择:
  • 更改您的模型,使变换原点位于可能的质心附近,即下半身最粗部分的中心位置。这将是最简单的方法,然而您可能需要更改您的定位代码以考虑偏移量。
  • 创建一个btCompoundShape来包装您的btConvexHullShape。这允许您在复合形状内部变换形状。关于这个问题有一些讨论:http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=6244&f=9&t=1506

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接