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

时间:2014-11-15 16:35:12

标签: opengl 3d jogl bullet jbullet

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

否则,我可以创建碰撞形状,在每个模拟步骤之后应用物理后获取碰撞形状的顶点,然后根据顶点的位置绘制对象。我已经查看了子弹的Hello world示例,但它只能帮助我在opengl对象的位置上应用物理(基于z,y,x轴_而不是很酷的东西,例如撞击平面的立方体的一角开始滚动和旋转。

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

4 个答案:

答案 0 :(得分:4)

下载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”与变换矩阵 图形形状,然后更新图形顶点)

Personnaly,我正在使用Irrlicht,因为Irrlicht是opengl的“少写,多做”解决方案:p

答案 1 :(得分:4)

Bullet 2.83示例浏览器

Bullet示例浏览器默认情况下远离examples/ExampleBrowser/GL_ShapeDrawer.cpp ,它使用过时的immediate OpenGL 2方法。它仍然可以启用,具体取决于NO_OPENGL3宏和command line arguments的值。

OpenGLWindow/GLInstancingRenderer.cpp是新的OpenGL 3呈现核心,包含glBindVertexArray中的GLInstancingRenderer::registerShape来电。

此方法是从OpenGLGuiHelper::autogenerateGraphicsObjects间接调用的,它绕过btDiscreteDynamicsWorld中的对象并生成这些形状的图形版本。

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

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

autogenerateGraphicsObjects来自几个例子的initPhysics

SimpleOpenGL3App.cpp还有一些显式编码的立方体和球体,如果你想要图形与物理不同的可能性,它可以作为一个起点,每个严肃的项目应该如此:图形应该更加详细,因为它们的计算成本较低。这些只在少数例子中使用。

如果您要学习示例浏览器,我建议使用带调试器的IDE:它与我的大脑静态分析有太多间接性。我已经用KDevelop4完成了这个分析。

答案 2 :(得分:3)

Bullet独立于OpenGL,您可以将转换应用于几何体。

您可以将变换存储到单独的对象中,而不是修改顶点。它是什么做车辆动力学引擎演示(JOGL + JBullet)和JMonkeyEngine 3,它有自己的Bullet绑定和基于JOGL 2的渲染器(以及我不使用的一些其他渲染器)。

请在此处使用JOGL和JBullet查看我们的演示:https://github.com/sgothel/jogl-demos/tree/master/src/jbullet

答案 3 :(得分:0)

如果没有研究Bullet或OpenGL的细节(我在OpenGL中编写了一点),你似乎希望将Bullet应用于对象两次,一次用于CollisionShape(无论是什么),然后用于绘制的opengl对象。

似乎是在内存对象中创建OpenGL对象,应用Bullet方法获取CollisionShape(无论是什么),将此数据保存在内存中,然后将Bullet方法应用于此新三角形列表世界定位(如果我对你的问题的理解是对的)。

类似于在没有矩阵数学的好处的情况下分别在对象上应用2个不同的变换。您可以根据旋转计算向量的新位置,然后在有这些点之后根据平移在世界中移动它们。您将有一个在内存中使用的中间步骤来应用您的第二个翻译。这就是我在第一次渲染的3D渲染中完成它的方式而没有学习如何完成它,看看我是否可以自己想出它。

也许这对你有帮助,也许不会。如果没有,也许你可以解释你遇到麻烦的地方,我(或其他人)可以查看OpenGL和Bullet的具体细节,为你提出实际的算法(尽管我确定它可能存在于某个地方) 。如果你搜索的足够多,你可能会在Interwebs上找到类似你可以修改的代码,或者你可以自己尝试。

这可能是我的方法不起作用,但我认为如果我没有正确理解你的问题,我没有理由不这样做(我可能不会,不知道什么是“CollisionShape”)。< / p>