如何在Bullet物理引擎中禁用Y轴运动


11

我想创建一个对象,而不仅要沿X和Z轴移动,同时还要使Y轴保持禁用状态(就像在2D模式下移动一样,该对象也不会掉落)。

我目前正在使用6自由度约束来限制Y轴上的移动,但是它不起作用:

btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to
btRigidBody* robot = mCarChassis->getBulletRigidBody();

btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false);

constrict->setLinearLowerLimit( btVector3( 1, 1, 1));
constrict->setLinearUpperLimit( btVector3(-1, 1,-1));

constrict->setAngularLowerLimit( btVector3( 1,  1,  1) );
constrict->setAngularUpperLimit( btVector3(-1, -1, -1) );

mBulletWorld->getBulletDynamicsWorld()->addConstraint(constrict);

谢谢!


也许这将帮助:bulletphysics.org/Bullet/phpBB3/...,或许还为Y轴为0的下限/上限,而不是1
deceleratedcaviar

Answers:


20

在Bullet中实现此目标的首选方法是设置所讨论物体的线性因子,甚至可能设置角度因子。此方法在Bullet Wiki页面上以代码段的形式呈现。

为了只允许沿Y轴移动,您可以使用以下方法:

body->setLinearFactor(btVector3(0,1,0));

如果还希望禁用围绕任何特定轴的旋转,则可以使用相同的步骤,但是要使用该setAngularFactor功能。

这个简单的示例视频中,我使用了以下两个调用以禁用沿Y轴的移动并仅允许绕Y轴旋转。这有效地迫使物体保留在最初创建它的XZ平面中。

body->setLinearFactor(btVector3(1,0,1));
body->setAngularFactor(btVector3(0,1,0));

2

一种方法是创建物理滴答回调。每当项目符号在内部打勾时,就会调用此方法。在此回调中,您可以将Y速度设置为0,从而有效地禁用Y移动。它看起来像这样:

void myTickCallback(const btDynamicsWorld *world, btScalar timeStep) {
    //robotBody is the btRigidBody you want to constrain the movement of
    btVector3 velocity = robotBody->getLinearVelocity();
    robotBody->setLinearVelocity(velocity.x, 0, velocity.z);
} 

您可以在此处阅读有关模拟滴答回调的更多信息。


谢谢!这是一个很好的答案,因为它也同样适用于JBullet的java端口(与其他答案不同)。
joehot200
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.