Bullet fizik motorunda Y ekseni hareketi nasıl devre dışı bırakılır


11

Y eksenini devre dışı tutarken sadece X ve Z eksenleri boyunca hareket etmekten başka bir nesne oluşturmak istiyorum (2D'de hareket gibi ve nesne düşmeyecek).

Şu anda Y eksenindeki hareketi kısıtlamak için 6 serbestlik dereceli bir kısıtlama kullanıyorum, ancak çalışmıyor:

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);

Teşekkürler!


Belki bu yardımcı olacaktır: bulletphysics.org/Bullet/phpBB3/… , belki de Y ekseni için Alt / Üst sınırları 1 yerine 0 olarak ayarlayın.
yavaşlama

Yanıtlar:


20

Bunu Bullet'te başarmanın tercih edilen yolu , söz konusu vücut için doğrusal faktörü ve muhtemelen açısal faktörü ayarlamaktır . Bu yöntem, Bullet Wiki sayfasında Kod Parçacığı olarak sunulur .

Sadece Y ekseni boyunca harekete izin vermek için şöyle bir şey kullanırsınız:

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

Ek olarak herhangi bir eksen etrafında dönüşü devre dışı bırakmak isterseniz, aynı prosedürü kullanırsınız, ancak setAngularFactorişlevi kullanırsınız.

Olarak bu basit örneğin video Y'nin ekseni boyunca devre dışı hareket etmek için aşağıdaki iki çağrı kullanmış etrafında sadece bir Y ekseni dönmesine izin vermek için. Bu, vücudu başlangıçta yaratıldığı XZ düzleminde kalmaya etkili bir şekilde zorlar.

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

2

Bunu yapmanın bir yolu bir fizik kene geri arama oluşturmaktır. Mermi dahili olarak her tıkladığında buna çağrılacaktır. Bu geri aramada Y hızını 0 olarak ayarlayarak Y hareketini etkili bir şekilde devre dışı bırakabilirsiniz. Bunun gibi bir şey olurdu:

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);
} 

Simülasyon işareti geri aramaları hakkında daha fazla bilgiyi buradan edinebilirsiniz .


Teşekkür ederim! Bu, JBullet'in java portu için de geçerli olduğundan (diğer cevabın aksine) bu harika bir cevaptır.
joehot200
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.