Bullet debug drawer with OpenGL

情到浓时终转凉″ 提交于 2020-02-01 08:27:09

问题


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.




回答2:


First you have to pass a reference of your instantiated class to the setDebugDrawer function like this:

GLDebugDrawer MyDrawer;
...
bt_dynamicsWorld->setDebugDrawer(&MyDrawer);

Second, and equally as important, you must define the virtual functions laid out in your GLDebugDrawer class so that when bullet calls one of these functions to draw debugging information your debug drawer can actually draw something to the screen.



来源:https://stackoverflow.com/questions/19976935/bullet-debug-drawer-with-opengl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!