我只是想知道是否有办法将子弹物理应用于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对象的信息。
答案 0 :(得分:4)
下载Bullet Physics SDK后,查看文件GL_ShapeDrawer.cpp,你会发现一些有趣的函数,比如drawSphere,drawCylinder,drawOpenGl ..我提到的最后一个函数可以让你绘制任何类型的支持形状:
shape-> getShapeType()的每种形状都有自己的专用函数,用于使用opengl进行渲染
但我的方法涉及到
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>