3
\$\begingroup\$

I have a robot (btTriangleMeshShape for each component) and a chain of boxes used as a cable, which is anchored on two components of the robot. I want to rotate a robot component and when this happens, I want to twist/ roll the cable on that component. The problem is - when i rotate a robot component, collision does not work anymore with that component.

I cannot use btHullShape because of the lack of accuracy, neither btGimpact because of the complexity of computations (which gives a really unsatisfying performance). I couldn't improve enough any of these two shapes, so that is why I use btTriangleMeshShape and rotate it by code.

Also, I have replaced the btTriangleMeshShape of the rotating component with a simple static box and rotate the box. Using the box shape, collision is working with that box.

So the problem of collision not working is only when trying to rotate a (static) btTriangleMeshShape.

Here is the code I use to rotate the static body, although I don't think it's necessary (it works for box shape, not for triangle mesh shape):

   btTransform tr = m_dynamicsWorld->getCollisionObjectArray()[7]->getWorldTransform();
   static float angle = 0.f;
   angle += 0.1f;
   tr.setRotation(btQuaternion(btVector3(1, 0, 0), -angle));
   m_dynamicsWorld->getCollisionObjectArray()[7]->setWorldTransform(tr);

   m_dynamicsWorld->updateAabbs();
   m_dynamicsWorld->computeOverlappingPairs();

I have to mention that I've searched the web before and couldn't find any solution and also I'm a newbie on Bullet Physics and any graphic libraries.

Any help would by really apreciated,

\$\endgroup\$
0

1 Answer 1

3
\$\begingroup\$

btTriangleMeshShape cannot be used as a dynamic objects as stated in the API documentation.

The btBvhTriangleMeshShape is a static-triangle mesh shape, it can only be used for fixed/non-moving objects.

So your alternative is to represent the mesh using Collision Primitives or a collection of them.

Single Primative

Using a singluar primitve is the easiest but loses accuraccy on complex models. For example:

Image showing the collision box of Suzanne

You would rotate the collision box and then apply the rotation from bullet to your robot mesh.

Multiple Primitives / Compound Collisions

The alternative is to use multiple collision primatives, choosing a base primative to rotate the mesh and to have all other primatives connected to. For example:

Compound Collision Primitives

\$\endgroup\$
2
  • \$\begingroup\$ thank you Soapy for your answer, but as i've already specified, i'm trying to use btTriangleMeshShape for both accuracy and performance. If I use CollisionPrimitives I lose accuracy. That's not ok in my case. If it would be ok, then I think btHullShape would be more indicated, I've already tried it:) \$\endgroup\$
    – tame
    May 6, 2015 at 13:19
  • \$\begingroup\$ Thanks! Using multiple primitives / compound collisions is the route I took, however, there is a way to automate the process using algorithms, such as github.com/kmammou/v-hacd which has been added to the Bullet physics engine: github.com/bulletphysics/bullet3/tree/master/Extras/VHACD \$\endgroup\$
    – Glavin001
    Jan 23 at 23:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .