标签: bulletphysics

BulletPhysic:联系力/冲动

我想检测一个(球)何时接触另一个物体(目标),我想知道那个接触的冲动.

我知道有三种方法来检测联系人

gContactAddedCallback
Run Code Online (Sandbox Code Playgroud)

要么

    int numManifolds = m_dynamicsWorld->getDispatcher()->getNumManifolds();
    for (int i=0;i<numManifolds;i++)
    {
        btRigidBody* obA = static_cast<btRigidBody*>(contactManifold->getBody0());
        btRigidBody* obB = static_cast<btRigidBody*>(contactManifold->getBody1());
        // May be there is contact obA and obB

        btPersistentManifold* contactManifold =  m_dynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i);
        int numContacts = contactManifold->getNumContacts();
        for (int j=0;j<numContacts;j++)
        {
            btManifoldPoint& pt = contactManifold->getContactPoint(j);
            if (pt.getDistance()<0.f)
            {
                // One contact point is inside of another object
                // But some contacts are ignored
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

要么

检查线性和角速度变化.(不清楚是否有接触和什么物体使速度发生变化,是物体还是阻尼,重力或某些力场.


我希望有联系信息,包括联系人冲动.我注意到在1帧模拟中解决了一些接触,其他需要2帧,脉冲则低两倍.(我得到了它调试代码.)我会很乐意得到一个总冲动的联系通知.

我列出的所有方法都没有为我提供联系方式的完整信息.有一段时间它会在球飞近目标时发射,甚至不会碰到目标.

什么是预期的方法呢?

如果接触能量很高,这些信息可用于播放冲击声或开始一些动画.

contact bullet game-physics bulletphysics

7
推荐指数
1
解决办法
1844
查看次数

如何在OpenGL 4.0中实现Bullet的btIDebugDraw接口

Bullet在旧的OpenGL中有一个btIDebugDraw接口的实现,用于绘制物理世界以进行调试.界面是这样的:

class GLDebugDrawer : public btIDebugDraw
{
int m_debugMode;

public:

GLDebugDrawer();
virtual ~GLDebugDrawer(); 

virtual void    drawLine(const btVector3& from,const btVector3& to,const btVector3&  fromColor, const btVector3& toColor);

virtual void    drawLine(const btVector3& from,const btVector3& to,const btVector3& color);

virtual void    drawSphere (const btVector3& p, btScalar radius, const btVector3& color);

virtual void    drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha);

virtual void    drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color);

virtual void    reportErrorWarning(const char* warningString);

virtual void    draw3dText(const btVector3& location,const char* textString); …
Run Code Online (Sandbox Code Playgroud)

bulletphysics opengl-3

6
推荐指数
1
解决办法
2710
查看次数

如何用Bullet物理逼真地模拟高尔夫球击球?(包括现场演示)

背景

我正在玩一个迷你高尔夫游戏,使用three.js和弹药物理库的ammo.js转换,但是我在让球实际移动方面遇到了一些麻烦.

(我在penguinspuzzle.appspot.com/minigolf.html上放了一个演示,如果你想看看它在实践中是如何工作的.)

什么是一个很好的算法,以提供迷你高尔夫球的更逼真的运动?

我试过的

在ammo.js中,有摩擦,线性阻尼和旋转阻尼选项.

当球滚动时,摩擦设置似乎没有太大影响.

我正在使用

body.setRestitution(0.8);
body.setFriction(1);
body.setDamping(0.2,0.1); // linear damping, rotational damping
Run Code Online (Sandbox Code Playgroud)

问题

由于线性阻尼值较高,球似乎减速得太快.

价值较低似乎需要很长时间才能最终停止.

当球在空中时,完全应用线性阻尼似乎是不合理的.

分析

我认为问题可能是ammo.js中的线性阻尼导致指数减慢.

我试过了:

  1. 录制高尔夫击球的视频
  2. 测量每个框架中球的位置
  3. 根据时间绘制球的位置和速度

结果如下所示.在我看来,速度曲线更接近于线性而非指数.

有什么建议让算法让ammo.js更加真实吗?

高尔夫分析

javascript algorithm physics bulletphysics ammo.js

6
推荐指数
1
解决办法
2061
查看次数

Bullet 中的凹面碰撞检测

我是 Bullet 新手,如果我的问题对您来说很琐碎,我提前道歉。

我需要从 .stl 文件加载一组凹三角形网格并执行碰撞检测。用户可以移动对象。从用户手册中,我读到:“凹三角形网格:对于静态世界环境,表示静态三角形网格的一种非常有效的方法是使用 btBvhTriangleMeshShape。”

因此,我的问题是: - Bullet 可以检测使用 BvhTriangleMeshShape 建模的凹面网格对象之间的碰撞吗?- contactTest 和 CollisionWorld::PerformDiscreteCollisionDetection() 之间的真正区别是什么 - 我是否需要为凹面碰撞检测指定不同的碰撞算法?

我正在使用BulletSharp维护的 Bullet C# 包装器。我所做的是设置我的子弹环境:

CollisionConfiguration bt_collision_configuration;
CollisionDispatcher bt_dispatcher;
BroadphaseInterface bt_broadphase;
CollisionWorld bt_collision_world;

double scene_size = 500;
uint max_objects = 16000;

bt_collision_configuration = new DefaultCollisionConfiguration();
bt_dispatcher = new CollisionDispatcher(bt_collision_configuration);

float sscene_size = (float)scene_size;
Vector3 worldAabbMin = new Vector3(-sscene_size, -sscene_size, -sscene_size);
Vector3 worldAabbMax = new Vector3(sscene_size, sscene_size, sscene_size);
bt_broadphase = new AxisSweep3_32Bit(worldAabbMin, worldAabbMax, max_objects);
bt_collision_world = new CollisionWorld(bt_dispatcher, bt_broadphase, bt_collision_configuration);    [/code] …
Run Code Online (Sandbox Code Playgroud)

c# concave collision-detection bulletphysics

6
推荐指数
1
解决办法
2551
查看次数

理解逆运动学 pybullet

我正在尝试使用pybullet中的模拟 PR2 机器人进行笛卡尔控制。在 pybullet 中,函数calculateInverseKinematics(...)可以选择采用关节下限、上限、关节范围和静止姿势来进行零空间控制。

首先,使用零空间控制而不是“常规”逆运动学可以获得什么实际好处?

其次,为什么要指定关节范围,这不完全是由上下限决定的吗?连续关节的范围是多少?

休息姿势到底是什么?这只是机器人开始执行任务之前的初始姿势吗?

robotics inverse-kinematics bulletphysics

6
推荐指数
1
解决办法
6499
查看次数

在 Bullet 物理中动态更改 btRigidBody 的位置/方向

我知道它违反了物理定律,但尽管在游戏中经常有实际原因需要立即改变身体的位置和方向,但大多数物理模拟库不允许这样做,所以 BulletPhysics 也不允许。

因此,我很感激对此的任何建议或评论。

顺便说一下,我想到了瞬移,它需要那些即时的改变。此外,一种更奇特的应用可能是惯性 - 例如,当倾斜或旋转带有加速计的便携式设备时,物体看起来相对于用户是静态的。增强现实听起来不应该很俗气。

position rotation on-the-fly bulletphysics

5
推荐指数
1
解决办法
3359
查看次数

与 CPU 上的物理引擎相比,GPU 上的 PhysX 速度有多快?

我有一个为使用Bullet物理引擎而编写的应用程序。我在 8 核 Intel i7 2600K CPU 上运行它。该应用程序必须处理数百万个物理工作块,每个工作块都可以独立完成。目前它有8 个进程运行,每个进程独立地完成其总数的配额。综上所述,这项工作有很多容易并行的地方。

假设我可以获得最好的 NVIDIA 消费类显卡(例如 Titan),通过从 CPU 上的 Bullet 切换到GPU 上的Physx,我可以看到物理引擎性能的大致改进是多少?也就是说,如果针对 Physx 重写,该应用程序的运行速度大约会快多少?

我找到了一些比较 Bullet 和 Physx 的结果质量的论文,但找不到任何有关性能比较的信息。

gpu physx game-physics bulletphysics physics-engine

5
推荐指数
1
解决办法
9868
查看次数

如何在《子弹物理》中控制玩家角色?

我不知道你应该如何控制子弹中的玩家角色。我读到的方法是使用提供的 btKinematicCharacterController。我还从演示中看到了使用 btDynamicCharacterController 的方法。然而,手册中指出运动控制器有几个突出的问题。这仍然是首选路径吗?如果是这样,有这方面的教程或文档吗?我发现的只是演示中的代码片段,以及 Ogre 控制器的使用,但我不使用它。

如果这不是应该走的路,那么有人会向我指出正确的解决方案。我是Bullet新手,想要一个简单、简单的解决方案。我目前拥有的是将 btKinematicCharacterController 的各个部分拼凑在一起。

这是我用来设置控制器的代码:

playerShape = new btCapsuleShape(0.25, 1);
ghostObject= new btPairCachingGhostObject();
ghostObject->setWorldTransform(btTransform(btQuaternion(0,0,0,1),btVector3(0,20,0)));
physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
ghostObject->setCollisionShape(playerShape);
ghostObject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);
controller = new btKinematicCharacterController(ghostObject,playerShape,0.5);
physics.getWorld()->addCollisionObject(ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
physics.getWorld()->addAction(controller);
Run Code Online (Sandbox Code Playgroud)

这是我用来访问控制器位置的代码:

trans = controller->getGhostObject()->getWorldTransform();
camPosition.z = trans.getOrigin().z();
camPosition.y = trans.getOrigin().y()+0.5;
camPosition.x = trans.getOrigin().x();
Run Code Online (Sandbox Code Playgroud)

我控制它的方式是通过setWalkDirection()和jump()(如果canJump()为true)。

现在的问题是,角色有点兴奋,然后从静态地板上掉下来。显然这不是有意的。这是因为缺乏刚体吗?如何整合它?

事实上,现在它只是按其应有的方式掉落,但随后慢慢地沉入地板。

我已将这条线移至创建动态世界后的右侧

physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
Run Code Online (Sandbox Code Playgroud)

现在是这样的:

broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
Run Code Online (Sandbox Code Playgroud)

我还使用从搅拌机导入的 .bullet 文件(如果相关的话)。

问题出在子弹文件上,该文件现已修复(碰撞盒不起作用)。但还是会出现心慌、时不时爬不上去、从高处瞬间跳下来等问题。

c++ bulletphysics

5
推荐指数
1
解决办法
1万
查看次数

在libGDX中调试绘图

在libGDX中调试绘制Bullet物理的正确方法是什么,以便我可以看到btCollisionObjects我正在设置的?

到目前为止,我有下面的内容,但似乎没有btCollisionObjects出现.

public void render(float delta) {

    debugDrawer.begin(cam);
    collisionWorld.debugDrawWorld();
    debugDrawer.end();
    modelBatch.begin(cam);
    ...
    modelBatch.end();
}

@Override
public void show() {
    Bullet.init();
    ...         
    collisionConfig = new btDefaultCollisionConfiguration();
    dispatcher = new btCollisionDispatcher(collisionConfig);
    broadphase = new btDbvtBroadphase();
    collisionWorld = new btCollisionWorld(dispatcher, broadphase, collisionConfig);
    debugDrawer = new DebugDrawer();
    collisionWorld.setDebugDrawer(debugDrawer);
    debugDrawer.setDebugMode(btIDebugDraw.DebugDrawModes.DBG_MAX_DEBUG_DRAW_MODE);
}
Run Code Online (Sandbox Code Playgroud)

debugging bulletphysics libgdx

5
推荐指数
1
解决办法
1948
查看次数

如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目,在构建整个解决方案时,它会构建附加了 SOVERSION 的 Bullet 输出库,并创建一个不带版本的符号链接。

对于我的特定场景,我不喜欢这种行为,并且我不想编辑项目符号子模块的 CMakeLists 文件。

这是我的 CMake,其中包含项目符号库:

    set(USE_DOUBLE_PRECISION ON CACHE BOOL "" FORCE)
    set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
    
    set(BUILD_BULLET3 OFF CACHE BOOL "" FORCE)
    set(BUILD_EGL OFF CACHE BOOL "" FORCE)
    set(BUILD_ENET OFF CACHE BOOL "" FORCE)
    set(BUILD_PYBULLET OFF CACHE BOOL "" FORCE)
    set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "" FORCE)
    set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
    set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
    set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
    
    set(INSTALL_LIBS OFF CACHE BOOL …
Run Code Online (Sandbox Code Playgroud)

c++ linux cmake bulletphysics

5
推荐指数
1
解决办法
664
查看次数