Центр масс пули и странная реакция объекта

Я новичок в пуле, и у меня, вероятно, основная проблема. Я пытаюсь имитировать падение булавки, но они, упав, встают сами, без приложения силы.

Интересно, где моя ошибка, может ли кто-нибудь из вас помочь, я был бы признателен.

вот видео, показывающее, что происходит: 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;
}

Я пытался изменить форму штифта, массу, трение и восстановление, но ничего не помогло, есть ли способ изменить центр масс, может быть, это поможет?


person Magda Aarsman    schedule 30.12.2014    source источник
comment
Этот сайт sendspace предлагает мне загрузить mp4, и когда я пытаюсь это сделать, он пытается отправить мне dmg. Урон может быть безобидным, но я не буду его трогать.   -  person Beta    schedule 04.01.2015


Ответы (1)


Это будет вызвано тем, что ваша модель имеет точку поворота / начало преобразования в основании или рядом с основанием кегли. В Bullet преобразование твердого тела — это центр масс, поэтому то, что вы видите, — это тяжелый центр масс, исправляющийся под действием силы тяжести и, таким образом, вытягивающий штифт вертикально.

У вас есть несколько вариантов:

  • Измените свою модель так, чтобы начало преобразования находилось где-то рядом с вероятным центром масс, то есть примерно в середине самой толстой части нижней части тела. Это будет самый простой способ, однако вам может потребоваться изменить код позиционирования, чтобы учесть смещение.
  • Создайте btCompoundShape, чтобы обернуть btConvexHullShape. Это позволяет преобразовывать фигуры внутри составной формы. Здесь есть обсуждение этого вопроса: http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=6244&f=9&t=1506
person mysticcoder    schedule 07.04.2015