Bullet debug drawer with OpenGL

2019-04-15 04:23发布

问题:

I have been fiddling around with bullet for a bit and I now want to draw debug. I have an opengl world with working bullet physics and everything.

What I have tried is this: I have created a class GLDebugDrawer like this:

#include "LinearMath/btIDebugDraw.h"

class GLDebugDrawer : public btIDebugDraw
{
   int m_debugMode;

public:

   GLDebugDrawer();
   virtual ~GLDebugDrawer();

   virtual void   drawLine(const btVector3& from, const btVector3& to, const btVector3& fromColor, const btVector3& toColor);

   virtual void   drawLine(const btVector3& from, const btVector3& to, const btVector3& color);

   virtual void   drawSphere(const btVector3& p, btScalar radius, const btVector3& color);

   virtual void   drawTriangle(const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& color, btScalar alpha);

   virtual void   drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color);

   virtual void   reportErrorWarning(const char* warningString);

   virtual void   draw3dText(const btVector3& location, const char* textString);

   virtual void   setDebugMode(int debugMode);

   virtual int      getDebugMode() const { return m_debugMode; }

};

Then in the game I include this header and create a instance of it.

Where I initialize the bt world, I set the debug draw type like this:

debugDraw->DBG_DrawWireframe; // this breaks when I run the app
debugDraw->setDebugMode(btIDebugDraw::DBG_DrawWireframe); // so does this
debugDraw->setDebugMode(1); // this doesn't

I then set the debug to the bullet world like this:

bt_dynamicsWorld->setDebugDrawer(debugDraw);

And finally, I render the debug draw after I render the bullet bodies like this:

bt_dynamicsWorld->debugDrawWorld();

There must be something that I am missing as I am not getting any wireframes or anything when running.

回答1:

There is a simple set of code available at http://sio2interactive.forumotion.net/t599-enabling-bullet-debug-draw-code-included which should be relatively straightforward to use to modify your code, looks like you may need to change bt_dynamicsWorld->setDebugDrawer(debugDraw); to bt_dynamicsWorld->setDebugDrawer(&debugDraw); (not sure though as don't know how you have your framework setup.