btDefaultMotionState的多个实例都被忽略,但是只有一个
总结问题:
到目前为止,我的世界上有两个身体,一个是地面,另一个是坠落的盒子,叫做“流星”。
1)我不明白为什么我的子弹世界不符合我绘制的世界,除非我设置了btVector3(2,2,2)
到(btDefault)MotionState的偏移量。 代码中的任何地方都没有奇特的魔法可以解释偏移量。 或者至少我找不到任何理由,不是在着色器中,也不在任何地方。
2)我期望能够使用btDefaultMotionState
多个实例, btDefaultMotionState
确切地说,我想为下降的实体使用一个实例并将它放置在地面上方的某个位置,然后为地面创建另一个实例,该实例应该简单地与我的图形地面,永远不动。
我在2)中btDefaultMotionState
情况是,无论出于何种原因,下降实体的btDefaultMotionState
实例总是也会影响地面实体的实例,而没有任何参考。
现在到代码:
FallBox的创建:
btCollisionShape *fallingBoxShape = new btBoxShape(btVector3(1,1,1));
btScalar fallingBoxMass = 1;
btVector3 fallingBoxInertia(0,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,0,0,1), btVector3(2,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,2)
的必要偏移量, btVector3(2,2,2)
与我绘制的世界对齐:
btTransform initialTransform;
initialTransform.setOrigin(btVector3(0,5,0));
this->fallingStarBody = new btRigidBody(fallingStarBodyCI);
fallMotionState->setWorldTransform(initialTransform);
如果我重新启用了这部分代码所有机构再次显示偏移,但不只是5了,这是我能在某种程度上理解,如果出于某种原因,worldTransform将影响每一个实体,而是2,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,0,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
相对转换,我会创建一个全新的复合形状和一个新的刚体。 不要忘记删除旧的身体和形状。
这是一个图书馆的限制。
PS
我无法回答您的疑问/问题,这些信息是我在Bullet论坛中跟踪一段时间后收集的,并由我自己进行测试。
(我也是从零开始编码游戏+游戏库,使用Bullet和其他开源资源。)
编辑:(关于新问题)
它只是慢慢地倒下来(与地面本身一样,它不应该像我给它的质量一样移动)
我会试着按这个顺序解决它。
想法A
理念B
-> getCenterOfMassTransform()
每个时间步骤,它真的下降? dynamicsWorld->setGravity(btVector3(0,0,0));
。 想法C (现在我开始绝望)
你所描述的不是正常的子弹行为。 你对图书馆的理解是正确的。
你最有可能处理的是缓冲区溢出或悬挂指针。 你发布的代码没有明显的代码,所以它会来自你的代码库中的其他地方。 你可能能够使用良好的内存断点来追踪它。
您“可能”正在处理标题/二进制版本不一致问题,但这不太可能,因为您可能会看到其他主要问题。
在DebugDrawer暂停在世界之巅的时候,只是具有完全相同的行为类型。 通过传递给Bullet Physics单独的投影视图矩阵来解决这个问题,而没有他已有的并且已经与之相乘的模型矩阵:
glUseProgram(shaderID);
m_MVP = m_camera->getProjectionViewMatrix();
glUniformMatrix4fv(shaderIDMVP, 1, GL_FALSE, &m_MVP[0][0]);
if (m_dynamicWorld) m_dynamicWorld->debugDrawWorld();
链接地址: http://www.djcxy.com/p/94479.html
上一篇: Multiple instances of btDefaultMotionState, all ignored, but one