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的实现是一个单例,但它看起来并不那么...所以......为什么地狱正在设置影响整个世界的一个身体的运动状态?

对于btDefaultMotionState,不带btVector3(2,2,2)

使用btVector3(2,2,2)为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只是一个形状,转化支持而已)。

如果我想改变CB相对转换,我会创建一个全新的复合形状和一个新的刚体。 不要忘记删除旧的身体和形状。

这是一个图书馆的限制。

PS

我无法回答您的疑问/问题,这些信息是我在Bullet论坛中跟踪一段时间后收集的,并由我自己进行测试。

(我也是从零开始编码游戏+游戏库,使用Bullet和其他开源资源。)

编辑:(关于新问题)

它只是慢慢地倒下来(与地面本身一样,它不应该像我给它的质量一样移动)

我会试着按这个顺序解决它。

想法A

  • 而是设置为复合质量= 0,因为设置子形状的质量没有意义。
  • 理念B

  • 首先检查-> getCenterOfMassTransform()每个时间步骤,它真的下降?
  • 如果实际下降,可以肯定的是,尝试一下dynamicsWorld->setGravity(btVector3(0,0,0));
  • 如果还是不行的话,试着用非常简单的世界(1个简单的物体,没有化合物)来看看。
  • 想法C (现在我开始绝望)

  • 确保您的相机位置不变。
  • 如果问题仍然存在,我认为您现在可以创建一个简单的测试用例,并在Bullet论坛中发布,而不需要太多的努力。
  • 更少的代码行数量=更好的反馈

  • 你所描述的不是正常的子弹行为。 你对图书馆的理解是正确的。

    你最有可能处理的是缓冲区溢出或悬挂指针。 你发布的代码没有明显的代码,所以它会来自你的代码库中的其他地方。 你可能能够使用良好的内存断点来追踪它。

    您“可能”正在处理标题/二进制版本不一致问题,但这不太可能,因为您可能会看到其他主要问题。


    在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

    下一篇: Failed to open stream. Bad request