7

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

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

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

4

4 回答 4

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 的“少写多做”解决方案:p

于 2014-11-17T08:06:38.543 回答
5

子弹示例浏览器

树内示例浏览器具有一些 OpenGL 物理绑定,因此您可以轻松地可视化模拟。

要查看它是否正常工作,您可以使用以下命令编译和运行它:

sudo apt build-dep libbullet-dev
git clone https://github.com/bulletphysics/bullet3
cd bullet3
git checkout 2.89
./build_cmake_pybullet_double.sh
./build_cmake/examples/ExampleBrowser/App_ExampleBrowser

截屏:

在此处输入图像描述

在 Ubuntu 20.04 上测试。

示例浏览器2.83代码分析

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

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

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

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

对象的颜色简单地循环超过 4 种可能的颜色OpenGLGuiHelper::sColors

autogenerateGraphicsObjects是从initPhysics几个例子中调用的。

在: 也有一些明确编码的立方体和球体,SimpleOpenGL3App.cpp如果您想要与物理不同的图形的可能性,可以作为起点,对于每个严肃的项目都应该如此:图形应该更详细,因为它们是计算成本更低。这些仅在少数示例中使用。

如果您要研究示例浏览器,我建议您使用带有调试器的 IDE:这对我的大脑静态分析来说太过间接了。我已经用 KDevelop4 完成了这个分析。

于 2016-05-05T20:24:02.800 回答
3

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

您可以将变换存储到单独的对象中,而不是修改顶点。这就是 Vehicle Dynamics Engine Demo (JOGL + JBullet) 和 JMonkeyEngine 3 所做的,它们有自己的 Bullet 绑定和基于 JOGL 2 的渲染器(以及我不使用的一些其他渲染器)。

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

于 2014-11-16T11:24:35.417 回答
0

在不研究 Bullet 或 OpenGL 的细节(我在 OpenGL 中编写过一些代码)的情况下,您似乎希望将 Bullet 应用于对象两次,一次用于 CollisionShape(无论是什么),然后用于绘制的 opengl 对象。

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

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

也许这会对你有所帮助,也许不会。如果没有,也许你可以解释你在哪里遇到了麻烦,我(或其他人)可以研究 OpenGL 和 Bullet 的细节来为你提出实际的算法(尽管我确信它可能存在于某个地方) . 如果您搜索得足够多,您可能会在 Interwebs 上找到执行类似操作的代码,您可以修改这些代码,或者您可以尝试自己做。

这可能是我的方法行不通,但是如果我正确理解您的问题(我可能不知道,首先不知道“CollisionShape”是什么),我看不出它为什么行不通的原因。

于 2014-11-15T16:48:44.240 回答