如何将Bullet物理应用于绘制Opengl 3d形状

Noi*_*oir 7 opengl 3d jogl bullet jbullet

我只是想知道是否有办法将子弹物理学应用于opengl绘制的对象(使用glVertex3f创建或使用glVertexAttribPointer创建三角形网格).我目前正在使用jogl和jbullet将物理应用到我的3D对象.具体来说,如果我为3d对象的三角形网格形状提供顶点缓冲区.我需要Bullet来创建基于三角形网格形状的CollisionShape,并将物理应用于它,同时将物理应用于绘制的opengl对象.此刻,物理碰撞形状可能会移动(在子弹中),但绘制的opengl形状不是.

否则,我可以创建碰撞形状,在每个模拟步骤之后应用物理后获取碰撞形状的顶点,然后根据顶点的位置绘制对象.我已经看了看Hello World示例的子弹,但只帮我申请对OpenGL的对象(基于Z,Y,X axis_的位置物理学和不冷静之类的东西,例如立方体的一角打一个平面开始滚动和旋转.

如果有人能给我一些可以做到这一点的代码或演示,那就太棒了.或者给我一些关于如何使这项工作的提示.我已经在子弹上查看了这个教程:http://www.raywenderlich.com/53077/bullet-physics-tutorial-getting-started.但我似乎无法找到有关如何将子弹应用于opengl对象的信息.

Irr*_*ich 5

下载Bullet Physics SDK之后,查看文件GL_ShapeDrawer.cpp,您会发现一些有趣的函数,例如drawSphere,drawCylinder,drawOpenGl。。我提到的最后一个函数可以绘制任何支持的形状:

  • CUSTOM_CONVEX_SHAPE_TYPE
  • BOX_SHAPE_PROXYTYPE
  • UNIFORM_SCALING_SHAPE_PROXYTYPE
  • COMPOUND_SHAPE_PROXYTYPE
  • BOX_SHAPE_PROXYTYPE
  • SPHERE_SHAPE_PROXYTYPE

shape-> getShapeType()中的每种形状都有其专用的函数,用于使用opengl进行渲染

但是我的方法涉及

  • 1-使用网格物体加载器加载3D模型
  • 2-使用先前的网格加载器使用opengl函数创建图形形状
  • 3-从网格物体加载器使用的顶点创建子弹形状
  • 4-实施“项目符号运动状态”(当形状要旋转或平移或只是“变形”时,您将项目符号形状的“ btTransform”与图形形状的转换矩阵同步化,然后更新图形顶点)

个人而言,我使用Irrlicht是因为Irrlicht是opengl的“少写,多做”的解决方案:


Cir*_*四事件 5

项目符号2.83浏览器示例

Bullet示例浏览器已从examples/ExampleBrowser/GL_ShapeDrawer.cpp 默认情况下移开,后者使用了过时的即时 OpenGL 2方法。仍然可以根据NO_OPENGL3宏和命令行参数的值将其打开。

OpenGLWindow/GLInstancingRenderer.cpp是新的OpenGL 3渲染核心,并包含中的glBindVertexArray调用GLInstancingRenderer::registerShape

从中间接调用此方法OpenGLGuiHelper::autogenerateGraphicsObjects,该方法会在中的对象上循环btDiscreteDynamicsWorld并生成这些形状的图形版本。

转换的核心部分似乎是OpenGLGuiHelper::createCollisionShapeGraphicsObjectInternal

对象的颜色只是从中循环了4种可能的颜色OpenGLGuiHelper::sColors

autogenerateGraphicsObjectsinitPhysics几个示例中被调用。

在以下位置,还有一些显式编码的多维数据集和球体:SimpleOpenGL3App.cpp如果您希望图形不同于物理的可能性(例如每个严肃的项目都应如此),它们可以作为起点:图形应该更详细,因为它们是减少计算成本。这些仅在几个示例中使用。

如果要研究示例浏览器,我建议将IDE与调试器一起使用:从我的大脑静态分析来看,它太多了。我已经使用KDevelop4进行了此分析。