我想检测一个(球)何时接触另一个物体(目标),我想知道那个接触的冲动.
我知道有三种方法来检测联系人
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帧,脉冲则低两倍.(我得到了它调试代码.)我会很乐意得到一个总冲动的联系通知.
我列出的所有方法都没有为我提供联系方式的完整信息.有一段时间它会在球飞近目标时发射,甚至不会碰到目标.
什么是预期的方法呢?
如果接触能量很高,这些信息可用于播放冲击声或开始一些动画.
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) 我正在玩一个迷你高尔夫游戏,使用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中的线性阻尼导致指数减慢.
我试过了:
结果如下所示.在我看来,速度曲线更接近于线性而非指数.
有什么建议让算法让ammo.js更加真实吗?

我是 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) 我正在尝试使用pybullet中的模拟 PR2 机器人进行笛卡尔控制。在 pybullet 中,函数calculateInverseKinematics(...)可以选择采用关节下限、上限、关节范围和静止姿势来进行零空间控制。
首先,使用零空间控制而不是“常规”逆运动学可以获得什么实际好处?
其次,为什么要指定关节范围,这不完全是由上下限决定的吗?连续关节的范围是多少?
休息姿势到底是什么?这只是机器人开始执行任务之前的初始姿势吗?
我知道它违反了物理定律,但尽管在游戏中经常有实际原因需要立即改变身体的位置和方向,但大多数物理模拟库不允许这样做,所以 BulletPhysics 也不允许。
因此,我很感激对此的任何建议或评论。
顺便说一下,我想到了瞬移,它需要那些即时的改变。此外,一种更奇特的应用可能是惯性 - 例如,当倾斜或旋转带有加速计的便携式设备时,物体看起来相对于用户是静态的。增强现实听起来不应该很俗气。
我有一个为使用Bullet物理引擎而编写的应用程序。我在 8 核 Intel i7 2600K CPU 上运行它。该应用程序必须处理数百万个物理工作块,每个工作块都可以独立完成。目前它有8 个进程运行,每个进程独立地完成其总数的配额。综上所述,这项工作有很多容易并行的地方。
假设我可以获得最好的 NVIDIA 消费类显卡(例如 Titan),通过从 CPU 上的 Bullet 切换到GPU 上的Physx,我可以看到物理引擎性能的大致改进是多少?也就是说,如果针对 Physx 重写,该应用程序的运行速度大约会快多少?
我找到了一些比较 Bullet 和 Physx 的结果质量的论文,但找不到任何有关性能比较的信息。
我不知道你应该如何控制子弹中的玩家角色。我读到的方法是使用提供的 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 文件(如果相关的话)。
问题出在子弹文件上,该文件现已修复(碰撞盒不起作用)。但还是会出现心慌、时不时爬不上去、从高处瞬间跳下来等问题。
在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) 我正在使用 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)