2

我一直在摆弄子弹,现在我想绘制调试。我有一个带有工作子弹物理和一切的opengl世界。

我尝试过的是:我创建了一个像这样的类 GLDebugDrawer:

#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; }

};

然后在游戏中我包含这个标题并创建它的一个实例。

在初始化 bt 世界的地方,我设置了调试绘制类型,如下所示:

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

然后我将调试设置为子弹世界,如下所示:

bt_dynamicsWorld->setDebugDrawer(debugDraw);

最后,我在渲染子弹体后渲染调试绘图,如下所示:

bt_dynamicsWorld->debugDrawWorld();

一定有一些我错过的东西,因为我在运行时没有得到任何线框或任何东西。

4

2 回答 2

1

http://sio2interactive.forumotion.net/t599-enabling-bullet-debug-draw-code-included提供了一组简单的代码, 用于修改代码应该相对简单,看起来您可能需要更改bt_dynamicsWorld->setDebugDrawer(debugDraw);bt_dynamicsWorld->setDebugDrawer(&debugDraw);(不确定,因为不知道您是如何设置框架的。

于 2013-11-14T15:07:40.607 回答
0

首先,您必须将实例化类的引用传递给setDebugDrawer函数,如下所示:

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

其次,同样重要的是,您必须定义在您的GLDebugDrawer类中布置的虚函数,以便当子弹调用这些函数之一来绘制调试信息时,您的调试抽屉实际上可以在屏幕上绘制一些东西。

于 2019-11-27T12:24:02.133 回答