c – btDefaultMotionState的多个实例,全部被忽略,但只有一个

前端之家收集整理的这篇文章主要介绍了c – btDefaultMotionState的多个实例,全部被忽略,但只有一个前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
总结问题:

到目前为止,我的世界里有两具尸体,一只是地面,另一只是一个叫做“坠落的星星”的坠落的盒子.

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

解决方法

Bullet是一个很好的库,但只有少数人花时间编写好的文档.

要设置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论坛中发布它而不需要太多努力.>较少的代码行=更好的反馈

猜你在找的C&C++相关文章