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

如何将Bullet物理应用于绘制的Opengl 3d形状,opengl,3d,jogl,bullet,jbullet,Opengl,3d,Jogl,Bullet,Jbullet,我只是想知道是否有一种方法可以将bullet物理应用于opengl绘制的对象(使用glVertex3f或带有GLVertexAttribute指针的三角形网格创建)。我目前正在使用jogl和jbullet将物理应用于我的3D对象。特别是如果我为3d对象的三角形网格形状提供顶点缓冲区。我需要Bullet根据三角形网格形状创建一个碰撞形状,并对其应用物理,同时将物理应用于绘制的opengl对象。此时,物理碰撞形状可能会移动(在bullet中),但绘制的opengl形状不会移动 否则,我可以创建碰撞形

我只是想知道是否有一种方法可以将bullet物理应用于opengl绘制的对象(使用glVertex3f或带有GLVertexAttribute指针的三角形网格创建)。我目前正在使用jogl和jbullet将物理应用于我的3D对象。特别是如果我为3d对象的三角形网格形状提供顶点缓冲区。我需要Bullet根据三角形网格形状创建一个碰撞形状,并对其应用物理,同时将物理应用于绘制的opengl对象。此时,物理碰撞形状可能会移动(在bullet中),但绘制的opengl形状不会移动

否则,我可以创建碰撞形状,在每个模拟步骤后应用物理后获取碰撞形状的顶点,然后根据顶点的位置绘制对象。我已经看过bullet的Hello world示例,但它只帮助我在opengl对象的位置上应用物理(基于z、y、x轴),而不是像立方体的一个角撞到一个平面开始滚动和旋转这样很酷的事情


如果有人能给我一些可以实现这一点的代码或演示,或者给我一些关于如何实现这一点的提示,那就太好了。我已经看了关于bullet.的本教程,但我似乎找不到bullet如何应用于opengl对象的信息。

没有研究bullet或opengl的细节(我已经在OpenGL中编写了一点代码)似乎您希望将Bullet应用于对象两次,一次应用于CollisionShape(不管是什么),然后应用于绘制的OpenGL对象

似乎这将是一个在内存对象中创建OpenGL对象的问题,应用Bullet方法获得碰撞形状(不管是什么),将数据保存在内存中,然后将Bullet方法应用到这个新的三角形列表以进行世界定位(如果我对您的问题的理解是正确的)

这类似于在一个对象上分别应用两种不同的变换,而不借助矩阵数学。你可以基于旋转计算向量的新位置,然后在这些点在世界上基于平移移动它们。你可以在内存中使用中间步骤来应用第二个t翻译。这是我在第一次3d渲染中的做法,我没有学习如何翻译,看我是否能自己完成

也许这会对你有帮助,也许不会。如果没有,也许你可以解释你遇到的问题,我(或其他人)可以研究OpenGL和Bullet的细节,为你提出实际的算法(尽管我确信它可能存在于某个地方).如果你搜索得足够多,你可能会在互联网站上找到做类似事情的代码,你可以修改,也可以尝试自己做


这可能是因为我的方法不起作用,但如果我正确理解了你的问题,我看不出有什么理由不起作用(我可能不知道,首先不知道“碰撞形状”是什么)。

Bullet独立于OpenGL,由你将变换应用于几何体

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


请在这里查看我们使用JOGL和JBullet的演示:

下载Bullet Physics SDK后,查看文件GL_ShapeDrawer.cpp,您会发现一些相互测试的函数,如drawSphere、drawCylinder、drawOpenGl。我提到的最后一个函数允许您绘制任何类型的支持形状:

  • 自定义\u凸面\u形状\u类型
  • 长方体\形状\代理类型
  • 均匀\缩放\形状\代理类型
  • 复合型
  • 长方体\形状\代理类型
  • 球体\形状\代理类型
shape->getShapeType()中的每种形状类型都有自己的专用函数,用于使用opengl进行渲染

但我的方法是

  • 1-使用网格加载器加载三维模型
  • 2-使用opengl函数创建图形形状 以前的网格加载程序
  • 3-从网格加载程序使用的顶点创建项目符号形状
  • 4-实现子弹运动状态(当形状将要 旋转、平移或只是“变换”,您可以同步 使用的变换矩阵对子弹形状进行“btTransform” 图形形状,然后更新图形顶点)

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

树内示例浏览器具有一些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示例浏览器已从使用过时的OpenGL 2方法的移动。根据宏和的值,它仍然可以打开

是新的OpenGL 3渲染中心,包含
glBindVertexArray
调用
glinstanceRenderer::registerShape

此方法间接从调用,它在
btDiscretedDynamicsWorld
中的对象上循环,并生成这些形状的图形版本

转换的核心部分似乎是

对象的颜色只是从中循环4种可能的颜色

autogenerateGraphicsObjects
是从几个示例的
initPhysics
中调用的

在:,也有一些明确编码的立方体和球体,如果你想要不同于物理的图形的可能性,这可以作为一个起点,每一个系列都应该如此