【问题标题】:How would i set up collision using the Bullet Physics Library?我将如何使用 Bullet 物理库设置碰撞?
【发布时间】:2011-04-05 22:49:44
【问题描述】:

嘿,我在我的 opengl/sfml 游戏中设置一些碰撞时有点“延迟”。它没有太大的错误,只是寻求一些帮助。我正在使用Bullet Physics(这是 API 参考),我一直在研究不同的函数和类。然后我注意到图书馆中包含演示,所以在查看它们时我并不完全理解它们..

他们推荐我使用的主要库是 CollisionInterfaceDemo,因为我已经将 GLM 用于 opengl 中的模型,并将 sfml 用于 2D 目的和窗口。

我只是想知道是否有人知道我将如何在我的游戏中实现碰撞。

【问题讨论】:

  • 如果您能够编译和运行演示,哪一个最符合您所追求的行为类型?

标签: c++ opengl sfml glm-math bulletphysics


【解决方案1】:

不确定这是否是您所追求的,但这是我的基本刚体物理设置代码:

#include "btBulletDynamicsCommon.h"

...

m_pBroadphase = new btDbvtBroadphase();
m_pCollisionConfig = new btDefaultCollisionConfiguration();
m_pCollisionDispatcher = new btCollisionDispatcher(m_pCollisionConfig);
m_pSolver = new btSequentialImpulseConstraintSolver();
m_pDynamicsWorld = new btDiscreteDynamicsWorld(m_pCollisionDispatcher, 
                                               m_pBroadphase, 
                                               m_pSolver, 
                                               m_pCollisionConfig);

之后,只需向世界添加实体...

btRigidBody::btRigidBodyConstructionInfo info;

// set physical properties like mass, coefficient of restitution etc
info.m_mass = 10;
info.m_restitution = 0.5;
...

// Use a motion state to link the physics body with the graphics object.  
// This is the glue between Bullet and your code, called by bullet to update the 
// position & orientation of the object
info.m_motionState = new YourCustomMotionState(...) ; 

btRigidBody* pRigidBody = new btRigidBody(info);
m_pDynamicsWorld->addRigidBody(pRigidBody);

...然后每帧更新世界状态。

m_pDynamicsWorld->stepSimulation(deltaTime, m_maxSubSteps);

这将为您提供一个简单的物理模拟,其中刚体相互碰撞和反弹,Bullet 控制着物体的移动方式。

【讨论】:

  • 好吧,我玩了一下,看看我在哪里,谢谢 :) 我应该为此包含哪些标题?只是这样我就不会分散 xD
  • btBulletDynamicsCommon.h 包含您目前所需的一切
  • 嘿,new YourCustomMotionState(...) ; 部分,这会是我的模型,例如 GLM 模型还是什么?只是确保我做对了
  • 基本上你必须编写你自己的派生自 btMotionState 的类,当 Bullet 调用 setWorldTransform() 时更新你的模型
  • 好吧,我做了第一部分,但我正在思考如何设置碰撞形状,例如胶囊?
【解决方案2】:

如何将 Bullet Physics 插入 iOS:iOS OpenGL BulletPhysics Sample Code

下载示例代码或使用 iOS openGL 模板新建项目表单 Xcode:

  1. 下载子弹物理...将其放入如下文件夹:

*(注意有一个项目文件夹,里面有Xcode项目文件)

/MyProjectFolder/bullet-2.78/
/MyProjectFolder/MyProject/MyProject.xcproj

1.5。在物理目录中运行 CMake 以编译框架(假设您已经安装了 cmake CMake)这一步对于我上传的示例代码是可选的,因为它已经包含了已编译的框架......这使得文件 100 megs 但是现在 100 兆是多少?

cmake . -G "Unix Makefiles" -DINSTALL_LIBS=ON -DBUILD_SHARED_LIBS=ON     -DFRAMEWORK=ON  -DCMAKE_OSX_ARCHITECTURES='i386;x86_64'     -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/Library/Frameworks     -DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks -DBUILD_DEMOS:BOOL=OFF
make -j4
sudo make install
  1. 转到您的 MyProject.xcproj 并在 Xcode 中打开...

在 XCode 中转到您希望将物理代码添加到的任何文件...您必须了解 cpp 文件是 c++ 而 .m .h 文件通常是 cocoa。您必须更改要添加物理引擎代码的类,使其具有 .mm 扩展名,表示它应编译为 Objective-C++ 代码...

  1. 在要添加物理的特定类中,现在是 Objective-C++ 文件或 cpp 文件,添加行

    #include "btBulletDynamicsCommon.h"
    

你应该编译...错误是找不到文件...

  1. 接下来转到 MyProjectFolder/bullet-2.78/src 并将 src 文件夹拖到您的项目中。
  2. 删除名为 BulletMultiThread 的文件夹...它将消除尝试编译某些 openCL (.cl) 文件的错误

  3. 最后一步,将以下框架从子弹物理安装的 src 文件夹复制到您的项目中:

    /MyProjectFolder/bullet-2.78/LinearMath/LinearMath.framework /MyProjectFolder/bullet-2.78/BulletCollision/BulletCollision.framework /MyProjectFolder/bullet-2.78/LinearMath/LinearMath.framework

  4. Build and Run...现在应该可以顺利编译到 iOS 和 Mac...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多