2010-06-10 10 views
13

Utilisation de Bullet 2.76 J'essaie de figer un objet (corps rigide) pour qu'il arrête instantanément de bouger, mais réagisse quand même aux collisions.Moteur physique Bullet, comment geler un objet?

J'ai essayé de définir son état d'activation sur DISABLE_SIMULATION, mais il est pratiquement inexistant pour les autres objets. De plus, si des objets "entrent en collision" avec elle, des choses étranges commencent à se produire (objets tombant dans des corps statiques, etc.)

Je suppose que la conversion temporaire en un corps rigide statique pourrait fonctionner, mais y a-t-il un moyen "natif" existant pour y parvenir du côté de Bullet?

Editer: Y a-t-il un moyen de désactiver la gravité pour un objet spécifique?

Répondre

6

La documentation est un peu défaut, mais on peut supposer que la méthode ci-dessous pourrait être utilisé pour désactiver la gravité sur un corps spécifique:

void btRigidBody::setGravity(const btVector3 &acceleration) 
+0

C'est ça! Il faut prendre soin de la désactivation après les collisions etc., mais ça marche! Parfait! Merci beaucoup! – sunside

1

Réglez la vitesse et la quantité de mouvement sur zéro et réglez la masse sur un très, très grand nombre.

+0

Impossible de le tester pour le moment, mais ne gèle-t-il pas vraiment l'objet qu'il est dans les airs? (Et, bien, le garder là?) – sunside

+0

Il le fait si vous utilisez les équations réelles pour la gravité: F = G * (m1 * m2)/r^2 Cependant la plupart des moteurs n'utiliseraient pas cette équation et supposeraient juste constante gravité (F = m * g) de sorte que vous devez également désactiver la gravité et toutes les autres forces constantes pour cet objet. Cependant, cela devrait fonctionner pour toutes les forces élastiques et pour votre moteur de collision (qui utilise probablement des forces élastiques). – eeeeaaii

+0

Alors la question est: Comment puis-je désactiver la gravité pour un objet spécifique (dans Bullet)? – sunside

4

Il y a des fonctions pour btRigidBody appelées setLinearFactor(x,y,z) et setAngularFactor(x,y,z) qui vous permettent de limiter mouvement le long d'un axe spécifique et rotation autour d'un axe spécifique respectivement. Appeler les deux fonctions avec tous les 0 comme arguments devrait arrêter tout mouvement. Les appeler à nouveau avec tous les 1 permettra le mouvement à nouveau.

2

Pour que cette méthode arrête votre acteur, vous devez l'appeler à chaque mise à jour.

void StopActor() 
{ 
    m_pRigidBody->setLinearVelocity(btVector3(0,0,0)); 
} 
3

Définir l'état d'activation à zéro. C'est ce qui arrive quand l'objet dort naturellement. La gravité et ainsi de suite ne prendra effet qu'après le réveil. Ensuite, comme tout objet dormant, il sera réveillé en cas de collision ou si vous lui appliquez une force.

+0

alors, comment le réveillez-vous? – MiniGod

+0

@MiniGod Appliquer une force, directement ou par collision. – weston

+0

cela signifie aussi que nous pourrions le faire dormir sur l'air? aussi, malheureusement, cela ne semble pas exposé à JMonkeyEngine bullet wrapper –

Questions connexes