子弹物理质心和奇怪的物体反应

Posted

技术标签:

【中文标题】子弹物理质心和奇怪的物体反应【英文标题】:Bullet physics mass center and weird object reaction 【发布时间】:2015-02-27 01:29:30 【问题描述】:

我是子弹新手,我可能有一个基本问题。 我尝试模拟弓形销坠落,但它们在坠落后自行爬起,没有任何外力。

我想知道我的错误在哪里,你们中的任何人都可以帮忙,我将不胜感激。

这是一个视频,展示了发生的情况: 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。伤害可能是无害的,但我不会碰它。 【参考方案1】:

这将是由于您的模型的轴心点/变换原点位于保龄球瓶底部或附近。在 Bullet 中,刚体变换是质心,因此您看到的是重心通过重力自行校正,从而将销拉直。

你有几个选择:

更改您的模型,使变换原点位于可能的质心附近,即下半身最肥部分的中间附近。这将是最简单的方法,但您可能需要更改定位代码以解决偏移问题。 创建一个 btCompoundShape 来包裹您的 btConvexHullShape。这允许您在复合形状内变换形状。这里有一些讨论:http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=6244&f=9&t=1506

【讨论】:

以上是关于子弹物理质心和奇怪的物体反应的主要内容,如果未能解决你的问题,请参考以下文章

如何估算各种物体的重心

如何估算各种物体的重心

three.js入门系列之光和阴影

子弹物理:接触力/冲量

如何在安装后使物体产生反应?

Listview对点击的奇怪反应