到目前为止,我的世界里有两具尸体,一只是地面,另一只是一个叫做“坠落的星星”的坠落的盒子.
1)我不明白为什么我的子弹世界与我绘制的世界不一致,除非我将btVector3(2,2,2)的偏移量设置为(btDefault)MotionState.
在代码中的任何地方都没有花哨的魔法来解释偏移.或者至少我找不到任何理由,不是在着色器中,而是在任何地方.
2)我希望能够使用btDefaultMotionState的多个实例,确切地说,我想使用一个实例用于下降实体并将其放置在地面上的某个位置,然后为地面创建另一个应该与我的对齐的实例图形地面,永不动摇.
我在2)方面遇到的是,无论出于何种原因,下降实体的btDefaultMotionState实例总是也影响地面实例,没有任何参考.
现在到代码:
创建fallBox:
btCollisionShape *fallingBoxShape = new btBoxShape(btVector3(1,1,1)); btScalar fallingBoxMass = 1; btVector3 fallingBoxInertia(0,0); fallingBoxShape->calculateLocalInertia(fallingBoxMass,fallingBoxInertia); // TODO this state somehow defines where exactly _ALL_ of the physicsWorld is... btDefaultMotionState *fallMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,1),btVector3(2,2))); //btDefaultMotionState *fallMotionState = new btDefaultMotionState(); btRigidBody::btRigidBodyConstructionInfo fallingBoxBodyCI(fallingBoxMass,fallMotionState,fallingBoxShape,fallingBoxInertia); /*btTransform initialTransform; initialTransform.setOrigin(btVector3(0,5,0));*/ this->fallingBoxBody = new btRigidBody(fallingBoxBodyCI); /*fallMotionState->setWorldTransform(initialTransform); this->fallingBoxBody->setWorldTransform(initialTransform);*/ this->physicsWorld->addBody(*fallingBoxBody);
现在对我来说有趣的部分是btVector3(2,2)的必要偏移量,以使其与我绘制的世界对齐并且:
btTransform initialTransform; initialTransform.setOrigin(btVector3(0,0)); this->fallingStarBody = new btRigidBody(fallingStarBodyCI); fallMotionState->setWorldTransform(initialTransform);
如果我重新启用代码的这一部分,所有主体再次显示一个偏移,但不仅仅是5,我可以以某种方式理解,worldTransform将影响每个实体,但大约2,2关…我根本无法掌握.
我猜这条线是没用的:
fallMotionState-> setWorldTransform(initialTransform);因为它不会改变任何东西,无论它是否存在.
现在到地面创建的代码:
btCompoundShape *shape = new btCompoundShape(); ... just some logic,nothing to do with bullet btTransform transform; transform.setIdentity(); transform.setOrigin(btVector3(x + (this->x * Ground::width),y + (this->y * Ground::height),z + (this->z * Ground::depth))); btBoxShape *BoxShape = new btBoxShape(btVector3(1,1)); // flat surface,no Box shape->addChildShape(transform,BoxShape);
(这部分只是为每个表面贴砖创建了一个复合形状:)
btRigidBody::btRigidBodyConstructionInfo info(0,nullptr,shape); return new btRigidBody(info);
在这里,我故意将motionstate设置为nullptr,但这并没有改变任何东西.
现在我真的很好奇…我想也许btDefaultMotionState的实现是一个单身,但它看起来不那么,所以……为什么地狱设置一个身体的运动状态影响整个世界?
解决方法
要设置btRigidBody的位置,请尝试以下方法: –
btTransform transform = body -> getCenterOfMassTransform(); transform.setOrigin(aNewPosition); //<- set orientation / position that you like body -> setCenterOfMassTransform(transform);
如果您的代码只在设置的转换部分出错(我猜测是通过略读代码),那么应该解决它.
请注意,此代码段仅适用于动态正文,而不适用于静态正文.
关于CompoundBody: –
如果是复合体,例如形状B包含形状C.
设置B的转换将起作用(设置B的主体),但不适用于C.
(因为C只是一个形状,转换只支持体.)
如果我想改变C到B的相对转换,我会创建一个全新的复合形状和一个新的刚体.不要忘记删除旧的身体和形状.
这是一个库限制.
附:
我无法回答你的一些疑问/问题,这些信息是我在Bullet论坛中跟踪一段时间后收集到的,并由我自己测试.
(我也在使用Bullet和其他开放源代码从头开始编写游戏游戏库.)
编辑:(关于新问题)
it just slowly falls down (along with the ground itself,which should
not move as I gave it a mass of 0)
我会尝试按此顺序解决它.
想法A.
>设置为复合质量= 0,因为设置子形状的质量没有意义.
想法B.
>首先检查 – > getCenterOfMassTransform()每一步,它真的下降了吗?
>如果它实际上正在下降,请务必尝试动态世界 – > setGravity(btVector3(0,0));.
>如果仍然无法工作,请尝试使用非常简单的世界(1个简单的对象,没有化合物)并查看.
想法C(现在我开始绝望)
>确保您的相机位置恒定.>如果问题仍然存在,我认为您现在可以创建一个简单的测试用例并在Bullet论坛中发布它而不需要太多努力.>较少的代码行=更好的反馈