Articles of 子弹物理

如何使用OpenGL绘制一个相当于给定btStaticPlaneShape的平面

有了子弹中的所有其他形状,您可以轻松地从保存原点,比例和旋转的MotionState进行变换。 似乎没有办法获得有关btStaticPlaneShape的相同信息。 我如何获得这些信息,以便我可以构建一个有4个顶点的矩形,这些顶点将在OpenGL中作为一个表示?

子弹3:一旦物体静止就施加力的问题

我刚开始使用子弹,我遇到了一个问题,一旦我的刚体在地板上复位,当我施加一个力时它就不会移动。 我已经创建了一个小演示,使用这里提供的hello world示例来展示这个。 for(int i = 0; i<30000; i++) // Give it a lot of time to hit the ground { dynamicsWorld->stepSimulation(1 / 60.f, 10); } btVector3 froce(0.0, 2000.0, 0.0); fallRigidBody->applyCentralForce(froce);// Apply a force on the Y axis for(int i = 0; i<300; i++) { dynamicsWorld->stepSimulation(1 / 60.f, 10); btTransform trans; fallRigidBody->getMotionState()->getWorldTransform(trans); std::cout << "Frame […]

不规则的椭圆形碰撞检测

我正在使用基于Bullet物理引擎的物理库。 如何创建一个卵形物体或一个宽度与深度不同的圆柱体(即椭圆形)? 我不是在寻找代码,而是为了帮助我理解这个概念的答案,或者是一个有用的近似值。

摩擦不适用于BulletPhysics的车辆

我正在使用子弹物理引擎(v 2.82)创建一辆车。 我创建了一个地面(btBoxShape) , 一个盒子和一辆车 (在演示之后)。 但地面和车轮之间的摩擦似乎不起作用。 一旦车辆进入三维世界,它就开始前进。 开始: 车辆转向工作,但engineForce和制动力不起作用(即我不能加速或停止车辆): 我创造这样的物理世界: void initPhysics() { broadphase = new btDbvtBroadphase(); collisionConfiguration = new btDefaultCollisionConfiguration(); dispatcher = new btCollisionDispatcher(collisionConfiguration); solver = new btSequentialImpulseConstraintSolver(); dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); dynamicsWorld->setGravity(btVector3(0, -9.81, 0)); // Debug Drawer bulletDebugugger.setDebugMode(btIDebugDraw::DBG_DrawWireframe); dynamicsWorld->setDebugDrawer(&bulletDebugugger); //groundShape = new btStaticPlaneShape(btVector3(0, 1, 0), 1); groundShape = new […]

如何加载一个用于子弹物理库的级别

我正在尝试使用Assimp加载的.obj格式的级别来生成与Bullet物理库一起使用的btBvhTriangleMeshShape 。 我可以成功加载btConvexHullShape以及btBvhTriangleMeshShape并使它们相互碰撞。 但是,如果我试图生成一个btBvhTriangleMeshShape ,程序崩溃时释放它。 因此,我认为我的错误是在我的加载函数: load_static_collision_shape 。 代码如下: #include "Physics.hpp" #include <GLEW/glew.h> #include "Structs.hpp" #include <Bullet/btBulletDynamicsCommon.h> #include <Bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h> #include <Bullet/BulletCollision/CollisionShapes/btShapeHull.h> namespace { btBroadphaseInterface* m_broadphase; btDefaultCollisionConfiguration* m_collision_configuration; btCollisionDispatcher* m_dispatcher; btSequentialImpulseConstraintSolver* m_solver; btDiscreteDynamicsWorld* m_dynamics_world; struct Physics_object { bool dynamic; btConvexHullShape* unoptimized_hull; btShapeHull* hull_optimizer; btConvexHullShape* hull; btTriangleMesh* triangle_mesh; btBvhTriangleMeshShape* triangle_mesh_shape; btCollisionShape* collision_shape; btDefaultMotionState* motion_state; btScalar mass; btVector3 […]

在两个物理世界/实例之间交互刚体

我会在这里发表我的第一个问题。 这是一个很难的! 但也许你知道一个简单的解决scheme:) 我正在尝试使用子弹物理来制作多人游戏。 我遇到了很多问题,但现在只有一个(我希望)需要一个我无法find的解决scheme。 这是一个简化的scheme:我的游戏有人(玩家),船只和海洋。 船只和玩家可以通过海运。 玩家可以上船走进里面。 使用普通的物理,当玩家在船上快速行驶时,会发生不好的事情。 远航导航时也有单浮点精度损失,我要在船上精确到毫米。 所以我想出了一个主意:每艘船都有自己的坐标原点设在船中心的物理世界,当玩家登上时,它的刚体将从主海洋世界移动到船的世界。 但是:当人们在船上时,将不能与靠近船只的物体发生碰撞,但不能靠近它,反之亦然。 IE挂在船边的一个玩家修理船体突破口被认为是在船上(在船的世界),所以他们不能被另一艘船击中。 我唯一要做的就是为两个世界的玩家设定一个刚体 – 主要是海洋世界和船只世界 – 但是我不知道他们如何“分享”物理效应,所以当某些东西与主要玩家rb碰撞时海洋世界,船舶世界的rb反应了碰撞。 事情是,海洋世界rb将需要跟随rb在船上的运动,除非它碰撞,应该导致船只rb对此作出反应。 考虑到: 不能使用双浮点精度。 如果需要的话,不能使用许多碰撞标志。 在海洋世界里,船只只有一个主要的外部复合对撞机,而船的世界将有所有的地板,门等。 虽然船上的玩家可能会静止不动,但是海洋世界的玩家将以船速移动。 那么,有什么想法? 将非常感激。

获取在Unity中实例化的GameObject

我怎样才能从另一个游戏对象获得一个游戏对象? 如果我知道,GameObject我想要实例化(使用函数Instantite())我想从中获取它的GameObject。 如果没有解决scheme,我怎么能find应该移动实例化子弹的方向? 我的意思是应该是1或-1。

人物方向改变

我正在使用Bullet Physics和DirectX编写游戏。 我最近开始移动主角,现在我有一个错误,希望有人能够发现。 角色是完全物理的物体(有腿)。 静止时,角色在X,Y,Z上有摩擦 当向前移动时,摩擦力被消除,中心脉冲被施加在必要的方向上。 计算冲动的应用,使得角色以受控的速度行走。 方向由头部控制。 当角色向左或向右看时,脉冲方向相应地改变。 这一切工作正常。 当我环顾四周,我可以将我的角色向任何方向移动。 问题是如果我改变方向(移动头部),那么当我正确计算冲动时,角色将继续沿原始方向移动,只能缓慢地改变到新的方向。 我知道这是因为角色还没有停止,所以摩擦仍然是0,所以我们仍然有从前一个动作的速度。 如果角色要停下来转动,那么它就能正常工作,并且能够在任何方向上正确地行走,因为停止摩擦会消除以前的所有动作。 为了解决这个问题,我相信我需要改变我的冲动方向计算,以便取消以前的运动。 但是,虽然这几乎工作,我有一些错误,这意味着字符左右摇摆。 所以有些事情是错的,但我不知道是什么。 这是我的: + X =右+ Y =上+ Z =正向 //Try and move forward auto energy = btVector3(0,0,20) //Get a quaternion for the direction we are already moving auto motionDirection = (lastPosition – position).normalized(); auto forward = motionDirection; auto right […]

为什么第二个歧管点在识别二维碰撞?

在二维空间中,我可以看到一个盒子如果只从一个侧面被推倒,如果一个盒子从其正确的质心推出,它不应该旋转。 那么为什么Box2D物理引擎需要两个stream形点(见b2Manifold和b2_maxManifoldPoints )呢? 不应该只有一个点(位于两点之间的位置),并且可能在多方面的信息中有一个不旋转的位,就足以得到与最多两点一样好的模拟结果? 其他物理引擎用于2D空间的点数有多less? 在3D中,我可以看到最多有两个点是有用的,因此可以对点或边缘碰撞进行建模,也可能再次对面部碰撞使用不旋转位。 我只是使用一个stream形点和可能的一点标志(以及最多2个点和一个标志位的三维碰撞)来模拟我所缺less的或者二维的碰撞。

jBullet碰撞/物理没有按预期工作

下面是我创建的游戏中的一个对象的代码(是的,虽然这是一个多维数据集,我不是像MineCraft那样远程做任何事情),而我的问题是当多维数据集将显示,并且确实遵循物理立方体落下,它不会与游戏中的任何其他物体相互作用。 如果我立刻在屏幕上放置多个立方体,他们都会坐在那里,或者四处射击,永不停歇。 无论如何,我是jBullet的新手,任何帮助将不胜感激。 // Constructor public Cube(float pX, float pY, float pZ, float pSize) { posX = pX; posY = pY; posZ = pZ; size = pSize; rotX = 0; rotY = 0; rotZ = 0; // physics stuff fallMotionState = new DefaultMotionState(new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(posX, posY, posZ), 1))); fallRigidBodyCI […]